PDA

Ver la versión completa : Tutorial de programación SDL para los no-privilegiados :D



newage
10/09/2005, 20:24
Bueno, yo no soy un privilegiado pero quiero ponerme ya a programar para la GP2X. ¿Como? pues muy sencillo :D programando cosas en SDL para el ordenador a la resolución de la GP32/GP2X.

Doy por hecho que programaís en linux o que sabeís manejar el compilador GNU los suficiente como para bajaroslo en windows y bajar las SDL y cambiar paths y eso. En linux es mas sencillo. Mi intención es poneros el Makefile ya hecho para que os pongaís a trabajar. Además de explicar cosas básicas de gráficos en SDL.

Yo solo he programado gfx con allegro y a parte opengl a secas ( con winapi y el servidor X de linux ), por lo que este post es para aprender a cargar pgn's saber dibujarlos con el canal alfa (no dibujar solo recuadros), un poco de blending, un poco de animaciones y por fin un poco de partículas.

Que es lo que quiero aprender para hacer mi juego. :)
Lo mejor es manejarse con los Makefile's... que es lo que utilizo yo.


# Base Makefile by newage

# Para compilar poner la direccion propia del devKit de arm
DEVKITARM = ...
# Directorio de archivos objeto ---------------------------
OBJDIR = ./.obj/
# Herramientas --------------------------------------------
ARM_ASM = $(DEVKITARM)bin/arm-elf-as
#----------------------------------------------------------
ARM_CC = $(DEVKITARM)bin/arm-elf-gcc
ARM_CPP = $(DEVKITARM)bin/arm-elf-g++
ARM_LD = $(DEVKITARM)bin/arm-elf-ld # No es necesario
#----------------------------------------------------------
ARM_EXTRA_CC =
ARM_EXTRA_CPP =
ARM_EXTRA_LD =
#----------------------------------------------------------
CC = gcc
CPP = g++
LD = ld # El gcc ya nos ahorra el trbajo de llamar a ld
#----------------------------------------------------------
EXTRA_CC = -Wall -ansi `sdl-config --cflags`
EXTRA_CPP = -Wall -ansi `sdl-config --cflags`
EXTRA_LD = -L"/usr/lib" -lSDL
#----------------------------------------------------------
VISOR = less
#----------------------------------------------------------

# Crea el directorio para los archivos objeto
$(OBJDIR):
mkdir $(OBJDIR)

#----------------------------------------------------------

allarm: $(SOURCES_ASM) $(OBJDIR)
# Compilamos el codigo en ensamblador
@#$(ARM_ASM) xx.asm -o $(OBJDIR)/xx.o
# Compilamos el codigo en CPP
@#$(ARM_CPP) xx.cpp -o $(OBJDIR)/xx.o
# Compilamos el codigo en CC
$(ARM_CC) main.c -o $(OBJDIR)/main.o
# Hacemos Link de todo
$(ARM_CC) -o atlantis $(OBJDIR)*.o

#----------------------------------------------------------

all: $(SOURCES_ASM) $(OBJDIR)
# Compilamos el codigo en CPP
@#$(CPP) xx.cpp -o $(OBJDIR)/xx.o $(EXTRA_CPP)
# Compilamos el codigo en CC
$(CC) -c main.c -o $(OBJDIR)/main.o $(EXTRA_CC)
# Hacemos Link de todo
$(CC) -o atlantis $(EXTRA_LD) $(OBJDIR)*.o

#----------------------------------------------------------

run: atlantis
# Ejecutamos el programa
./atlantis

#----------------------------------------------------------

clean:
rm $(OBJDIR)*.o

#----------------------------------------------------------


/************************************************** *********************************/
/* Resolucionn de G2X ( 320 x 240 ) */
/************************************************** *********************************/

#include <stdio.h>
#include <stdlib.h>
#include <stdlib.h>
#include "SDL.h"

SDL_Surface *screen;

int main( int argc, char *argv[] ){
if ( SDL_Init(SDL_INIT_AUDIO|SDL_INIT_VIDEO) < 0 )
exit(1);

screen = SDL_SetVideoMode(320, 240, 16, SDL_SWSURFACE);
if ( screen == NULL )
exit(1);

while( 1 ){}
}

La cosa funciona así:
$make all
Compila el código de PC
$make allarm
Compila el código de GP2X - aúnno disponible
$make clean
Limpia los archivos objeto
$make run
Ejecuta el programa en linux

Lo mejor es programar las cosas en linux antes de probarlas en la GP2X o GP32. Digo yo. :D.Otras cosas que hay que poner son los defines para cmpilar partes del código según la versión de PC o la version de GP2X pero eso ya se verá más adelante.

Os pongo un link al codigo, makefile y ejecutable.

AVISO: El programa tiene bucle infinito por lo que ahy que mandarlo cerrar mandandole una señal desde linux con las opciones de emulacion de consola o cosas así... o cambiar esa parte del código para seguir desde ahi. El ejecutable es un elf de linux-x86.

Zheo
10/09/2005, 21:33
Por otro lado para iniciaros en SDL y/o C en windows podeis utilizar el IDE Dev-C++ del cual bajando un par de paquetes tienes un entorno de programación con SDL y un par de plantillas con lo básico para crear aplicaciones en SDL más rápidamente.

Aquí teneis un manual del IDE que -casualmente- he escrito yo :P
http://www.hispabyte.net/biblioteca/index.php?action=file&id=319

Aquí teneis algunos Dev-packs (el nombre que tienen) con la SDL
Es la versión 1.2.7, aunque van por la 1.2.9 para empezar da igual.
http://www.hispabyte.net/foro/index.php?act=ST&f=74&t=12137&
El IDE tiene un actualizador por internet, así que es posible que haya devpacks con la SDL 1.2.9, no lo se. Si no lo hay ponedlo aquí, que hago yo uno en cuanto acabe exámenes. (Es que no tengo el Dev-C++ instalado ahora mismo)

^MiSaTo^
10/09/2005, 22:40
Gracias a los 2 aunque como no uso windows, pues usaré sólo lo que ha dicho newage. Gracias por el makefile, porque ellos y yo no nos "llevamos" bien xDDD
Esto me viene genial para el juego que estoy empezando :D:D:D

EDITO: Newage, he probado tu makefile para compilar el ATLANTIS pero me da un error "raro"(bueno, al menos raro para mi):
make: `.obj/' está actualizado.
A qué se debe estó? A lo mejor es una pregunta estúpida, pero esque aun soy muy nueva en esto de la programación y el linux :shock:
En cualquier caso, gracias!!! :saltando:

newage
10/09/2005, 23:31
Tienes que darle a:
%make all
Si le das solo a make te sale eso que me has dicho, porcierto el código que he puesto es una tontería... voy a hacer unas funciones... un código que sirva de plantilla para juegos.
Carga de imagenes PGN, con la capa alpha, particulas, fuentes, animaciones y poco más. Para que la gente se las arregle programando los gráficos.

No lo compiles con el bucle infinito hazme el favor :loco: :)

PD: bueno la culpa es mia la proxima vez le pondre all como default :)

^MiSaTo^
10/09/2005, 23:34
Cierto, perdon por la estupidez.. xDDD
En fin voy a ponerme a trastear un ratejo.
Gracias por todo newage! :D:D:D

Menxtor
11/09/2005, 02:03
Gracias por el pdf de la guia del progrma.

Sabeis de algunos manuales donde aparezcan los comandos tipicos de C o de C++.
O simples manuales para enmezar con C

Hace mucho tiempo que no programo nada y cuando lo hacia lo hacia en VisualBasic y en el instituto. Por lo que he oido hablar a gente que conozco el Visual ya no se usa y se emplea mas el C.

AGRACIAS

newage
11/09/2005, 03:04
El C/CPP es complejo y tiene muchas opciones. Te aconsejo que aprendas solo las caracteristicas de C. Te pongo un link a la mejor pagina de CPP de la web.

Aprender C en poco tiempo es imposible, no es BASIC te lo aseguro. CPP es una extension de C. Aprende todo lo que no sean clases, plantillas o la api de entrada/salida de interface de CPP.

http://www.conclase.net/

Para programar sin tener conocimientos de C y no estar ya acostumbrado a programar diariamente te recomiendo que aprendas Fenix ya que esta muy bien para los principiantes ahora que las capacidades de GP2X son superiores :) aunque nunca he programado en Fenix dicen que esta bien.

EDITO; Me he levantado porque estoy compilando el gcc. Os cuento.
Ya se que esto es casi offtopic pero creo que estaría bien comentar las distribuciones que mas nos gustan a los linuxeros que ya llevamos un tiempo en esto, para desarrollar aplicaciones de GP2X, linux (SDL). Se puede programar perfectamente en windows para arm (GP2X) pero habrá gente que quiera tener un ordenador viejo con linux para programar para la consola o simplemente comentar cual puede ser la distro que mas os guste.

Yo uso Suse 9.2 pero me llama mucho la atención esta distro y me la voy a instalar ahora :) Minislack (http://www.zenwalk.org/)
Es de 300 Mb está pensada para programar y es la leche de ligera. Tiene xfce como sistema de escritorio único "mu bonito y simple", tiene firefox, etc... y me sorprende porque las aplicaciones son las justas y muy buenas.
Es una distro de programación que yo recomiendo. Sin mas SO compartidos.
Bueno cuando la instale ya os comentaré. :abeber:

^MiSaTo^
11/09/2005, 12:06
Yo uso Ubuntu que me pareció facil hace ya 6 meses, y la he cogido cariño xDD
Aunq si había oído hablar de Minislack, y me da curiosidad, tb me da vaguería instalarmela xDDDD

ArTo
11/09/2005, 13:25
Gentoo r00lz :musico:

No la uso para programar porque no se :confused:

Saludos...

ZeNiTRaM
11/09/2005, 14:55
Yo en cuanto a Linux la que mas me gusta es Ubuntu (solo he probado esta, Suse, Mandrake y no se si alguna mas), me quedo con ella.

Pero en cuanto a Windows, en el otro PC, me he instalado el Dev-C++, y me gustaria saber como puedo ponerlo a funcionar con el SDL y el DevKitPRO (uno que habia en un tutorial, el pack con todo hecho que hizo creo que Enkonsierto), para poder empezar a programar para GP32..
Le he puesto al IDE el SDL y SDL_image que posteó Zheo.

boubou
11/09/2005, 16:17
Perdonen por el offtopic peroo...
Alguien sabe de una buena comunidad de SuSE Linux en español o inglis?

Es que quiero rular ciertos jaurgüares con madwifi y los drivers de ati y no tengo ni pajolera idea xD. Soy niubi en esto del "linu"

Grasias hamigos...

newage
11/09/2005, 17:26
Perdonen por el offtopic peroo...
Alguien sabe de una buena comunidad de SuSE Linux en español o inglis?

Es que quiero rular ciertos jaurgüares con madwifi y los drivers de ati y no tengo ni pajolera idea xD. Soy niubi en esto del "linu"

Grasias hamigos...

las comunidades de linux especializadas en Suse son una mierda. Mejor mira en una general como por ejemplo... la que mas me gusta

Espacio Linux (http://www.espaciolinux.com/)

EDITO: Bueno ya he probado la distro y es de instalacion sencilla en modo texto.
Solo encontre la dificultad de que no me arrancaba el servidor grafico X por que no estaba bien configurado con lo que esto significa, por lo que si se necesitan conocimientos avanzados. Como ya he dicho esta orienntada a programadores pero el aspecto es impresionante. Y a mi que no me gustaba el GTK :D

enkonsierto
11/09/2005, 18:30
Bueno, yo no soy un privilegiado pero quiero ponerme ya a programar para la GP2X. ¿Como? pues muy sencillo :D programando cosas en SDL para el ordenador a la resolución de la GP32/GP2X.

Pero esto no sería igual que progamar en sdl para gp32...? :confused: :confused: :confused:

newage
11/09/2005, 19:09
Pero esto no sería igual que progamar en sdl para gp32...? :confused: :confused: :confused:Cierto, la principal idea de este post es poner una pequeña librería estática para palntilla de los juegos en C++, lenguaje que no estaba bien soportado en la gp32.

EDITO: He estado mejorando cosillas y viendo como va esto de las SDL. Aún no he empezado con la api que vendrá como librería estática pero le he metido un buen cambio al Makefile con sustanciales mejoras. NOTA: Aún para principiantes. Nivel 2. Ya iré avanzando semanalmente. En un dos meses o tres ya debería estar acabada. Repito que aún nno he empezado con la api estoy acomodando las cosas. :D El código que vereis está un poco guarro.

bleim
21/09/2005, 06:04
Hola!
He bajado tu .zip (que por cierto es .zip.zip jeje) y al hacer el make:

make
g++ -c main.cpp -o ./.obj//main.o -ansi -Wall `sdl-config --cflags` -DPC -g
/bin/sh: sdl-config: command not found
In file included from main.cpp:10:
imagen.h:6:17: error: SDL.h: No such file or directory
imagen.h:7:23: error: SDL_image.h: No such file or directory
imagen.h:12: error: 'SDL_Surface' has not been declared
imagen.h:12: error: 'SDL_Surface' has not been declared
main.cpp:15: error: 'SDL_Event' does not name a type
main.cpp:16: error: expected constructor, destructor, or type conversion before '*' token
main.cpp:17: error: expected constructor, destructor, or type conversion before '*' token
main.cpp: In function 'int main(int, char**)':
main.cpp:22: error: 'SDL_INIT_VIDEO' was not declared in this scope
main.cpp:22: error: 'SDL_Init' was not declared in this scope
main.cpp:31: error: 'screen' was not declared in this scope
main.cpp:31: error: 'SDL_SWSURFACE' was not declared in this scope
main.cpp:31: error: 'SDL_SetVideoMode' was not declared in this scope
main.cpp:39: error: 'imagen' was not declared in this scope
main.cpp:39: error: 'IMG_Load' was not declared in this scope
main.cpp:47: error: 'SDL_SRCALPHA' was not declared in this scope
main.cpp:47: error: 'SDL_SetAlpha' was not declared in this scope
main.cpp:51: error: 'SDL_Rect' was not declared in this scope
main.cpp:51: error: expected `;' before 'dest'
main.cpp:52: error: 'dest' was not declared in this scope
main.cpp:56: error: 'SDL_UpdateRects' was not declared in this scope
main.cpp:58: error: 'event' was not declared in this scope
main.cpp:58: error: 'SDL_WaitEvent' was not declared in this scope
main.cpp:65: error: 'SDL_KEYDOWN' was not declared in this scope
main.cpp:66: error: 'SDL_GetKeyName' was not declared in this scope
main.cpp:69: error: 'SDL_QUIT' was not declared in this scope
main.cpp:77: error: 'SDL_FreeSurface' was not declared in this scope
make: *** [all] Error 1


Es eveidente que me faltan cosas :D

Tengo una debian, kanotix para mas señas. He mirado con el synaptic y tengo algunos archivos de sdl instalados, pero no se que es lo que me falta. Échame un cable!

bleim
21/09/2005, 06:11
Roger, tenemos un problema jeje

tras instalar sdlconsole-dev parecia que ya rulaba la cosa... pero no:

make
g++ -c main.cpp -o ./.obj//main.o -ansi -Wall `sdl-config --cflags` -DPC -g
g++ -c imagen.cpp -o ./.obj//imagen.o -ansi -Wall `sdl-config --cflags` -DPC -g
gcc -o atlantis -L"/usr/lib" -lSDL -lSDL_image ./.obj/*.o
./.obj/imagen.o:(.eh_frame+0x11): undefined reference to `__gxx_personality_v0'
./.obj/main.o: In function `main':
/home/bleim/Descarga!/atlantis_empezando.zip/atlantis/main.cpp:26: undefined reference to `std::basic_ofstream<char, std::char_traits<char> >::basic_ofstream(char const*, std::_Ios_Openmode)'
/home/bleim/Descarga!/atlantis_empezando.zip/atlantis/main.cpp:27: undefined reference to `std::basic_ostream<char, std::char_traits<char> >& std::operator<< <std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&, char const*)'
/home/bleim/Descarga!/atlantis_empezando.zip/atlantis/main.cpp:28: undefined reference to `std::cout'
/home/bleim/Descarga!/atlantis_empezando.zip/atlantis/main.cpp:28: undefined reference to `std::basic_ostream<char, std::char_traits<char> >& std::operator<< <std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&, char const*)'
/home/bleim/Descarga!/atlantis_empezando.zip/atlantis/main.cpp:34: undefined reference to `std::basic_ostream<char, std::char_traits<char> >& std::operator<< <std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&, char const*)'
/home/bleim/Descarga!/atlantis_empezando.zip/atlantis/main.cpp:42: undefined reference to `std::basic_ostream<char, std::char_traits<char> >& std::operator<< <std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&, char const*)'
/home/bleim/Descarga!/atlantis_empezando.zip/atlantis/main.cpp:66: undefined reference to `std::basic_ostream<char, std::char_traits<char> >& std::operator<< <std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&, char const*)'
/home/bleim/Descarga!/atlantis_empezando.zip/atlantis/main.cpp:66: undefined reference to `std::basic_ostream<char, std::char_traits<char> >& std::operator<< <std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&, char const*)'
/home/bleim/Descarga!/atlantis_empezando.zip/atlantis/main.cpp:66: undefined reference to `std::basic_ostream<char, std::char_traits<char> >& std::endl<char, std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&)'
/home/bleim/Descarga!/atlantis_empezando.zip/atlantis/main.cpp:66: undefined reference to `std::basic_ostream<char, std::char_traits<char> >::operator<<(std::basic_ostream<char, std::char_traits<char> >& (*)(std::basic_ostream<char, std::char_traits<char> >&))'
/home/bleim/Descarga!/atlantis_empezando.zip/atlantis/main.cpp:67: undefined reference to `std::cout'
/home/bleim/Descarga!/atlantis_empezando.zip/atlantis/main.cpp:67: undefined reference to `std::basic_ostream<char, std::char_traits<char> >& std::operator<< <std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&, char const*)'
etc etc etc

Pues nada, lo quito y sigo probando jeje

bleim
21/09/2005, 06:55
Bueno, no he instalado mil paquetes sdl y nada, no funciona.

No obstante he estado mirando por ahi. Este es un buen minicurso para empezar.

Pulsa aqui (http://www.agali.org/javielinux/articulos/sdln1/sdl-n1/book1.html)

Es muy basico, instalacion de sdl, y un par de programitas para empezar. También te enseña como configurar Anjuta, IDE para programar la mar de simpático. No lo conocía y me ha gustado.

Por ahora creo una ventana y pongo un png. Sigue la fiesta.


Por cierto, propongo un WIKI para hacernos un manual-curso de programación en SDL, en el que todos podríamos colaborar y tendríamos un sitio donde acudir todos.

newage
21/09/2005, 07:02
Roger, tenemos un problema jeje

tras instalar sdlconsole-dev parecia que ya rulaba la cosa... pero no:

make
g++ -c main.cpp -o ./.obj//main.o -ansi -Wall `sdl-config --cflags` -DPC -g
g++ -c imagen.cpp -o ./.obj//imagen.o -ansi -Wall `sdl-config --cflags` -DPC -g
gcc -o atlantis -L"/usr/lib" -lSDL -lSDL_image ./.obj/*.o
./.obj/imagen.o:(.eh_frame+0x11): undefined reference to `__gxx_personality_v0'
./.obj/main.o: In function `main':
/home/bleim/Descarga!/atlantis_empezando.zip/atlantis/main.cpp:26: undefined reference to `std::basic_ofstream<char, std::char_traits<char> >::basic_ofstream(char const*, std::_Ios_Openmode)'
/home/bleim/Descarga!/atlantis_empezando.zip/atlantis/main.cpp:27: undefined reference to `std::basic_ostream<char, std::char_traits<char> >& std::operator<< <std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&, char const*)'
/home/bleim/Descarga!/atlantis_empezando.zip/atlantis/main.cpp:28: undefined reference to `std::cout'
/home/bleim/Descarga!/atlantis_empezando.zip/atlantis/main.cpp:28: undefined reference to `std::basic_ostream<char, std::char_traits<char> >& std::operator<< <std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&, char const*)'
/home/bleim/Descarga!/atlantis_empezando.zip/atlantis/main.cpp:34: undefined reference to `std::basic_ostream<char, std::char_traits<char> >& std::operator<< <std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&, char const*)'
/home/bleim/Descarga!/atlantis_empezando.zip/atlantis/main.cpp:42: undefined reference to `std::basic_ostream<char, std::char_traits<char> >& std::operator<< <std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&, char const*)'
/home/bleim/Descarga!/atlantis_empezando.zip/atlantis/main.cpp:66: undefined reference to `std::basic_ostream<char, std::char_traits<char> >& std::operator<< <std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&, char const*)'
/home/bleim/Descarga!/atlantis_empezando.zip/atlantis/main.cpp:66: undefined reference to `std::basic_ostream<char, std::char_traits<char> >& std::operator<< <std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&, char const*)'
/home/bleim/Descarga!/atlantis_empezando.zip/atlantis/main.cpp:66: undefined reference to `std::basic_ostream<char, std::char_traits<char> >& std::endl<char, std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&)'
/home/bleim/Descarga!/atlantis_empezando.zip/atlantis/main.cpp:66: undefined reference to `std::basic_ostream<char, std::char_traits<char> >::operator<<(std::basic_ostream<char, std::char_traits<char> >& (*)(std::basic_ostream<char, std::char_traits<char> >&))'
/home/bleim/Descarga!/atlantis_empezando.zip/atlantis/main.cpp:67: undefined reference to `std::cout'
/home/bleim/Descarga!/atlantis_empezando.zip/atlantis/main.cpp:67: undefined reference to `std::basic_ostream<char, std::char_traits<char> >& std::operator<< <std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&, char const*)'
etc etc etc

Pues nada, lo quito y sigo probando jeje
Hamigito tu problema no son las SDL sino la librería standar de c++ de I/O. :D
A cualquier persona con las librerías básicas de c++ y SDL bien puestas le rula.

No quiero decir nada pero está bien claro que algo falla en el paquete libstdc++.a
o en las mismas includes que va a ser eso. Tienes un problema mas grave que unas simples librerías sin instalar.

Prueba quitando las lineas de código que hagan uso de la salida de info.
Vamos todas las lineas de código que lleven un "std::" y ya esta solucionado.

bleim
21/09/2005, 07:14
Como quieras, pero Hamiguito con H!!!!!!
Mereces la MUEGTE :canon2:

jejeje

De todas formas SI me va bien el sdl, al menos con otros ejemplos. Es igual, el caso es que tenemos que ayudarnos entre todos. Creo que la idea del wiki de programacion para la gpx2 es buena idea. :brindis:

newage
21/09/2005, 07:21
Eso es porque los ejempos que coges están en C a secas y si están en CPP no usas funciones de I/O

Takumi Fujiwara
07/10/2005, 09:49
Aparte del sdl os bajas alguna libreria especifica para sdl, o con el sdl ya basta para empezar?
Estoy interesado en empezar a ver el tema.
[wei3]

Puck2099
07/10/2005, 16:12
Bueno, pues hablando de distribuciones, yo uso Gentoo en todos mis PCs.

Además son stage 0 (compilados desde 0) optimizados para cada micro, así que me van como un tiro :)

urimm
07/10/2005, 16:47
Como quieras, pero Hamiguito con H!!!!!!
Mereces la MUEGTE :canon2:

jejeje

De todas formas SI me va bien el sdl, al menos con otros ejemplos. Es igual, el caso es que tenemos que ayudarnos entre todos. Creo que la idea del wiki de programacion para la gpx2 es buena idea. :brindis:

xDDD Tranquilo, es algo a lo q te acostumbrarás ya q escribir HAMIGO es muy común x estos lares. A la vez, en algunos posts, podras observar el arte de hablar en HACALPULQUEÑO o HOIGAN q es un interesante dialecto inventado del castellano, hablado, claro esta, en HACAPULCO. Estos emoticonos complementan la habla del HACAPULQUEÑO: [wei5] <- Hacapulqueño standard, [wei6] <- Hacapulqueño preparando Coctelesitos, [wei] <- Hacapulqueño con el puro, [wei2] <- Hacapulqueño tocando instrumento de cuerda, [wei3] <- Hacapulqueño tocando la pandereta (aunq se rumorea q por su mirada asesina es un agente secreto infiltrado en la trama hacapulqueña...), [wei4] <- Hacapulqueño tocando las maracas. Estos emoticonos han sido creados por miembros d esta comunidad (Neostalker y chipan) y son UNICOS, no existen en otra comunidad.
Aclarado todo esto espero q te quedes más tranquilo xDD.

efegea
07/10/2005, 17:01
Bueno, pues hablando de distribuciones, yo uso Gentoo en todos mis PCs.

Además son stage 0 (compilados desde 0) optimizados para cada micro, así que me van como un tiro :)

Querrás decir Stage 1 no? :D :D [wei4]




(yo también la uso, en un athlon64 3400, athlon xp 1700 y k6-2 350mhz [wei3] )

Puck2099
07/10/2005, 17:06
Querrás decir Stage 1 no? :D :D [wei4]

Efectivamente, es que no se puede postear tranquilo con el jefe al lado :p

ArTo
07/10/2005, 22:19
Gentoo powah!!!

Kiwi
15/10/2005, 23:06
Yo el año pasado aprendí a programar en C y algo de C++ también, pero desde entonces para acá lo he tenido taaan abandonado que ahora estoy torpísimo (con C todavía me arreglo bastante, aunque tengo algunos patinazos interesantes :D pero C++ tendré que cogerme algunos apuntes y tutoriales para refrescarme porque lo tengo olvidadísimo).

El caso es que me he bajado el makefile de newage (gracias, tío) para ir aprendiendo a manejarme con las SDL y programar algunas cosillas bajo Linux, y así de paso me entreno un poco con el C que con lo que me gustaba es una pena tenerlo tan abandonado.

Me bajé un par de tutoriales de otra página porque el de newage me pareció un tanto lioso al principio y ando trasteando un poco con ello, por ahora estoy aprendiendo a dibujar pixelcillos y poco más, si no os importa aprovecharé este topic para ir consultando las dudas que me surjan.

Auron_X
15/10/2005, 23:27
Offtopic:
Afortunados sois los ke entendeis de programación, yo ni pajolera idea :(
¿Alguien sabe alguna web o algo para aprender desde 0? Es que hace mucho ke kiero aprender, pero no se por donde empezar.
PD: Tb si sabeis algun libro pa empezar pos mejor ke mejor.
Salu2.

Smoje
17/10/2005, 20:13
Alguno ha conseguido hacer que cargue una imagen jpg o png desde el código? porque la ventana me la carga perfectamente pero luego me hace una violación de memoria.

Estoy compilando y ejecutando desde Windows, no sé si tendré que especificarle algún flag al compilador, aparte de las opciones al Linker.

BuD
18/10/2005, 06:50
Gentoo? No gracias, xD. Prefiero que se instalen las cosas a la de YA!
Tenia un portatil 266MHz, y para sacar rendimiento decidi instalarle gentoo...
Me tardo su ratillo en instalar desde la Stage 1 hasta la 3. (cuando digo un ratillo...) Alguien adivina cuanto? xD
Y luego... de velocidad no note apenas diferencia. No niego que muchos usuarios de gentoo experimenten una mejora de velocidad. Y ademas, aunque gentoo pone herramientas para que la administracion del sistema sea bastante facil, has de pillarle cierto truco para que todo funcione como a ti te gusta (cosa que aun no he llegado a obtener, supongo que por falta de experiencia con gentoo).

Que nadie me quite mi ubuntu, xD. Facil, rapido de instalar, y no requiere pensar mucho (por no decir nada), vamos como Windows. xDD

BuD
18/10/2005, 06:56
Offtopic:
Afortunados sois los ke entendeis de programación, yo ni pajolera idea
¿Alguien sabe alguna web o algo para aprender desde 0? Es que hace mucho ke kiero aprender, pero no se por donde empezar.
PD: Tb si sabeis algun libro pa empezar pos mejor ke mejor.
Salu2.

Pues yo empeze con un libro que me gusto mucho: Aprendiendo C++ para Linux en 21 dias de Jesse Liberty et al. No es muy tecnico, te lo explica todo para que lo entiendan incluso los menos experimentados en programacion (o esa sensacion me dejo a mi), y ademas bastante completo. Si sabes programar en C++, acostumbrarse a C es facil.
Tambien te recomiendo esta web:
http://www.conclase.net/

Luego, si consigues llegar a cierto nivel, lo demas es aprenderse APIs, y aprender a hacer algoritmos cada vez mejores a los que hacias anteriormente. Tu puedes hacerlo hamigo [wei] xDD

Zheo
18/10/2005, 07:11
Alguno ha conseguido hacer que cargue una imagen jpg o png desde el código? porque la ventana me la carga perfectamente pero luego me hace una violación de memoria.

Estoy compilando y ejecutando desde Windows, no sé si tendré que especificarle algún flag al compilador, aparte de las opciones al Linker.

Pon el código para que pueda verlo plis

A600
18/10/2005, 07:14
Aquí os adjunto un magnífico curso de c/c++. Venía con el CD nº2 de la PC-ACTUAL y es un programa de MS-DOS que, a través de ventanas nos va enseñado la teoría de forma amena con ejemplos y ejercicios.

Smoje
18/10/2005, 16:47
Pon el código para que pueda verlo plis

Aqui lo tienes :)

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <SDL.h>
#include <SDL_ttf.h>
#include <SDL_mixer.h>
#include <SDL_image.h>

int main (int argc, char *argv[]) {

SDL_Event event;
SDL_Surface *screen;
SDL_Surface *imagen;
SDL_Rect rect;
int done = 0;

screen = SDL_SetVideoMode(320,240,16, SDL_SWSURFACE | SDL_DOUBLEBUF );
if(!screen){
printf("No se pudo iniciar la pantalla: %s\n", SDL_GetError());
SDL_Quit();
exit(-1);
}

imagen = IMG_Load ("curso.png");

rect.x = 100;
rect.y = 100;
rect.w = imagen->w;
rect.h = imagen->h;
SDL_BlitSurface(imagen, NULL, screen, &rect);

while (done == 0) {
SDL_Flip (screen);
// Comprobando teclas para opciones
while (SDL_PollEvent(&event)) {
// Cerrar la ventana
if (event.type == SDL_QUIT) { done = 1; }
// Pulsando una tecla
if (event.type == SDL_KEYDOWN) {
done = 1;
}
}
}

SDL_FreeSurface(imagen);
SDL_FreeSurface(screen);

SDL_Quit();

printf("\nTodo ha salido bien.\n");
return 0;
}

Como ya he comentado, la ventana carga con el fondo en negro pero a los pocos segundos da error de aplicacion de Windows y desde el compilador me dice que se ha cometido una violación de memoria.

Gracias por la ayuda :)

Puck2099
18/10/2005, 16:59
A mi me parece que el código está bien, de todas formas, prueba a usar esta función para pintar las imágenes, a ver si se soluciona tu problema:



int DrawImage( SDL_Surface *surface, char *image_path, int x_pos, int y_pos )
{
SDL_Surface *image = IMG_Load ( image_path );
if ( !image )
{
printf ( "IMG_Load: %s\n", IMG_GetError () );
return 1;
}

// Draws the image on the screen:
SDL_Rect rcDest = { x_pos, y_pos, 0, 0 };
SDL_BlitSurface ( image, NULL, surface, &rcDest );
SDL_FreeSurface ( image );
return 0;
}

Saludos

miq01
18/10/2005, 23:25
Disculpadme si ya lo habéis mencionado antes. Hay un libro llamado "Thinking in C++" disponible gratis desde aquí (http://mindview.net/Books), que me parece bastante bueno para aquellos que tengan conocimientos básicos de programación (y si el lenguaje es C, mejor) y quieran aprender C++. Son dos volúmenes disponibles en varios formatos, con código fuente incluído.

Smoje
19/10/2005, 15:15
A mi me parece que el código está bien, de todas formas, prueba a usar esta función para pintar las imágenes, a ver si se soluciona tu problema:

Saludos

Ahora el programa es algo más estable pero al rato se bloquea y hay que cerrarlo, aparte que la imagen no la carga... la imagen tiene que estar en el mismo sitio donde está el código fuente, es decir, en el mismo directorio??

Hace tela de tiempo que no toco C (aunque programo en Java, pero en entorno web), el código lo entiendo pero no sé muy bien que le pasa :rolleyes:

BuD
20/10/2005, 02:57
Bueno, veo que vamos cogiendo nivel. Me he puesto a toquetear las SDL y veo que de momento lo de imprimir imagenes no tiene mucho misterio (DE MOMENTO). Yo que nunca he hecho juegos estoy intentando implementar algo con las SDL y como no lo he conseguido implementarlo aun lo pongo como reto:
Crear una animacion a partir de una imagen donde hay conjunto de "frames" 80x80
Adjunto un fichero que lo he sacado (sin permiso del autor, asi que no lo distribuiais mucho, y sobretodo no usarlo para crear vuestros programas) de Little Figther 2 para usarlo de ejemplo.
Aun no he leido suficientes manuales para hacer esto, estoy en ello, pero si alguien me da una ayudita [wei] se lo agradecere.

Puck2099
20/10/2005, 03:02
Vale, pues carga esa imagen en una Surface.

Ahora lo que tienes que hacer es blittear trozos de esa imagen (cada frame) uno detrás de otro para conseguir el efecto de que se mueve.

La teoría está clara, ¿no? :p

syrou
23/10/2005, 04:38
Perdonadme que haga un pequeño off-topic, pero como he visto los IDEs que la gente usa en Win32 y GNU/Linux, me gustaría añadir uno más al montón:

Se llama Code::Blocks http://www.codeblocks.org/ y está a punto de salir la versión 1.0 final. La verdad es que a mí me gusta mucho, además parece que el DevC++ se ha abandonado un poco (llevan meses con la 4.9.9.2 beta).

Sobre libros buenos para aprender de qué va el mundillo de la POO (y aprender a codificar en C++), coincido con la mayoría: en castellano, "Programación orientada a objetos con C++" de Fco. Javier Ceballos, en inglés "Thinking in C++" de Bruce Eckel. Y curiosamente, el libro del creador (Bjarne Stroustrup) no me parece de los mejores para aprender.

A600
23/10/2005, 05:55
Perdonadme que haga un pequeño off-topic, pero como he visto los IDEs que la gente usa en Win32 y GNU/Linux, me gustaría añadir uno más al montón:

Se llama Code::Blocks http://www.codeblocks.org/ y está a punto de salir la versión 1.0 final. La verdad es que a mí me gusta mucho, además parece que el DevC++ se ha abandonado un poco (llevan meses con la 4.9.9.2 beta).

Tiene buena pinta.

Yo uso el Programmers Notepad (http://www.pnotepad.org/)

TRaFuGa
23/10/2005, 19:57
Pos yo uso de momento el Notepad++, aunque me he bajado esos dos y el ConTEXT para probarlos... :P

BuD
27/10/2005, 05:27
Vale, pues carga esa imagen en una Surface.

Ahora lo que tienes que hacer es blittear trozos de esa imagen (cada frame) uno detrás de otro para conseguir el efecto de que se mueve.

La teoría está clara, ¿no? :p
Clarisima... xD.
Bien, estudiando más a fondo SDL, lo he logrado, xD.
He adjuntado el codigo para los no-privilegiados (como yo, xD):
PD: El codigo esta un poco warro, acepto sugerencias.

EDIT: Por cierto... Alguien me podria decir como se hace para que la animacion mire para el otro lado? :chupete:

Kiwi
28/10/2005, 20:53
Aupa, tras un par de semanas con las SDL dejadas totalmente de lado aquí vuelvo para seguir con el aprendizaje. A ver si me podéis echar un cable con los eventos de teclado, ya que la parte de cargar BMPs, pintar píxeles y demás ya la conseguí.

Pa ir empezando quería hacer simplemente y en plan chapucero que en la ventanita saliera un pixel rojo en el centro de la pantalla (con la resolución de la GP2X), y a partir de ahí según fuera aprentando que se pintaran más pixeles según se pulsan las teclas de dirección, hasta que se salga por el límite izquierdo o el superior de la ventana. La cosa es que no consigo que el pulsado de las teclas varíe el valor de 'x' e 'y'. Supongo que tendré que meterme en la movida de SDL_PollEvent y así pero es que según el manual que yo voy siguiendo así también debería tirar. Ahí os dejo el código.


x=160;y=120;
color.r=255;color.g=color.b=0;
if(SDL_MUSTLOCK(pantalla))
SDL_LockSurface(pantalla);
pintapixel(pantalla,x,y,color);
if(SDL_MUSTLOCK(pantalla))
SDL_UnlockSurface(pantalla);
SDL_UpdateRect(pantalla,0,0,0,0);
while(x>=0 && y>=0)
{
tecla = SDL_GetKeyState(NULL);
if(tecla[SDLK_UP]) y--;
if(tecla[SDLK_DOWN]) y++;
if(tecla[SDLK_LEFT]) x--;
if(tecla[SDLK_RIGHT]) x++;
printf("%d,%d",x,y);
if(SDL_MUSTLOCK(pantalla))
SDL_LockSurface(pantalla);
pintapixel(pantalla,x,y,color);
if(SDL_MUSTLOCK(pantalla))
SDL_UnlockSurface(pantalla);
SDL_UpdateRect(pantalla,0,0,0,0);
}
El PRINTF que hago después de los IF es simplemente pa que diga en cada vuelta el valor de las X Y por la consola, pero el resultado es que salgan sin parar siempre los mismos valores a porrillo, un poco basto pero bueno. :D

Si simplemente no se puede hacer así de simple comentad, que ya me aprenderé el capítulo de los eventos entero antes de intentar nada si no.

Zheo
29/10/2005, 01:50
El problema es que estás haciendo mal el bucle entero y además no usas la función más adecuada de SDL. Te explico, los bucles de un juego son un poco "especiales" en el sentido en el que están bastante normalizados. Suelen ser así:



while (!fin_juego)
{
ProcesaEventosJugador();
ActualizaLógicaJuego();
DibujarPantalla();
}

Como ves, en tu bucle primero pintas en pantalla, y luego recoges eventos y vuelves a pintar, eso es lo que digo que está mal, y es que además no es bueno repetirlo, ya que lo mejor es actualizar una vez la pantalla.

Por otro lado mejor usa los eventos de SDL (tienes ejemplos en la doc), ya que la función que usas lo que hace es recoger el estado del teclado en ese momento. Es decir que si en el momento en que se llama la función, la tecla que quieres no está pulsada, no saldrá registrado, sin embargo, con eventos, en el momento que pulsas una tecla se generará un evento que puedes recoger. El truco está en recoger el evento de que se ha pulsado la tecla, activar un flag para marcar que la tecla está pulsada y luego ignorar ese evento para esa tecla. También hay que recoger el evento de que la tecla se ha levantado, y entonces desactivas el flag. Esto sirve para procesar una tecla que dejas pulsada un rato.

Siento no poder extenederme mucho mas en mi (mielda de) explicación ;) si tienes dudas pregunta.

Saludetes.

Kiwi
29/10/2005, 20:02
Gracias tío, de paso me has respondido a otra duda que tenía sobre cómo van los bucles en los juegos. De todos modos no te alarmes por el bucle raro que posteé arriba, son simplemente miniprogramas chorras que me suelo hacer para probar cosas concretas, en este caso mi intención era que primero dibujara un pixel en el centro de la pantalla para tomarlo como referencia y que a partir de ahí, en un bucle fuera pintando otros pixeles conforme se pulsaran las flechitas (hasta salir por arriba o izquierda de la pantalla, es decir x=0 o y=0).

Había leído algo de que con las funciones de los eventos, puedes hacer que cualquier evento de teclado se vaya almacenando en una especie de cola para luego tú ir procesándolos cuando quieras. Lo que me mosqueaba de mi ejemplo es que ni dejando el botón pulsado se movía el pixel, pero claro, supongo que lo que captará será el momento de la pulsación y no todo el tiempo que permanece pulsado así que es normal que no ocurra nada.

Pues nada, me aprenderé a manejar con los eventos bien y miraré cómo es eso que dices de los flags (porque como ves soy muy newbie con esto) antes de seguir, a ver si consigo hacer la chorradita que proponía arriba pero funcionando. XD