PDA

Ver la versión completa : [Tutorial] Programación de un juego en C++ (2/11)



saboteur
09/10/2010, 14:30
2. ESTRUCTURA

Tenéis el proyecto en: Tutorial de programación c++ (2/11) (http://www.gp32spain.com/foros/downloads.php?do=file&id=2746)

Lo que definirá la dificultad de programar un videojuego es la primera estructura que le das al código. Si está bien planteado, programarlo será cosa de niños, pero si has ido escribiendo las cosas según se te ocurrían, te verás en el mismísimo infierno.

No te preocupes porque nos ha pasado a todos. A nuestro juego del Batiscafo le vamos a dar una estructura que de un primer vistazo te explica claramente dónde están todas las cosas, y en qué sitios puedes meter mano.

Antes de pasar al código vamos a pensarlo en esquema. Nuestro programa tendrá 3 modos de funcionamiento: modo MENU, modo JUEGO y modo PAUSA. En cada uno de esos modos nuestro programa reacciona de forma diferente y muestra en pantalla cosas diferentes.

Cada uno de esos modos utilizará 3 funciones: una para comprobar los botones, otra para actualizar lo que se muestra en pantalla y otra para dibujar en pantalla.

Podemos resumirlo así:


BUCLE PRINCIPAL
{
SI MODO==MENU
Leer_botones_menu();
Actualizar_menu();
Dibujar_menu();

SI MODO==JUEGO
Leer_botones_juego();
Actualizar_juego();
Dibujar_juego();

SI MODO==PAUSA
Leer_botones_pausa();
Actualizar_pausa();
Dibujar_pausa();
}

¿Para qué nos sirve esto? Para dejar cada cosa en su sitio. En la función Leer_botones_juego() sólo tendremos el chequeo de los botones y las acciones que produce cada pulsación. En Actualizar_juego() sólo estarán los procesos que hacen que el juego funcione: colisiones con paredes, toques con bichos, gravedad, etc... Y en Dibujar_juego() única y exclusivamente se dibuja todo lo que aparece en el desarrollo normal del juego.

A veces, cuando estás dibujando los bichos es muy fácil pensar en hacer las comprobaciones de colisiones. ¡Eso sería un error! Al final tendrías código desperdigado haciendo cosas en lugares diferentes. Si hay que comprobar un evento de juego, hay que meter sólo en Actualizar_juego(). Esto es esencial a la hora de buscar un error, y hay que acostumbrarse a no mezclar cosas (repito: todos lo hemos hecho alguna vez).

Veamos qué cambios hay en main.cpp.


///////////////////////////////////
/* Modo de programa */
///////////////////////////////////
#define PROGRAM_MODE_MENU 1
#define PROGRAM_MODE_GAME 2
#define PROGRAM_MODE_PAUSE 3

Lo primero que hemos metidos son las 3 constantes que definirán en qué modo se encuentra nuestro juego.


///////////////////////////////////
/* Variables globales */
///////////////////////////////////
int program_mode=PROGRAM_MODE_MENU;

En la parte de las variables globales hemos añadido una nueva: program_mode. Esta nos indicará el modo actual del juego para que podamos llamar a las funciones de cada modo. La iniciamos a PROGRAM_MODE_MENU, porque lo primero que veremos será el menú.


void read_menu_keys()
{
SDL_Event event;
// Comprueba los eventos de botones
while (SDL_PollEvent(&event))
{
switch (event.jbutton.button)
{
case GP2X_BUTTON_START:
done=1;
break;
}
}
}

void draw_menu()
{
}

void update_menu()
{
read_menu_keys();
draw_menu();
}

Estas son las tres funciones del modo menú. En read_menu_keys() meteremos un bucle para leer todos los eventos del joystick. Si pulsamos el botón MENU saldremos del juego poniendo la variable done=1. Es exactamente lo mismo que el bucle principal del tutorial 1, sólo que esta vez lo hemos metido en una función propia.

draw_menu(); dibujará las opciones del menú y por ahora lo dejamos en blanco.

update_menu(); es la función principal del modo MENU. Desde ahí leeremos las pulsaciones de botones, cambiaremos la selección del menú y lo dibujaremos en pantalla. Por ahora sólo llamaremos a las funciones read_menu_keys() y draw_menu().


void read_game_keys()
{
SDL_Event event;
// Comprueba los eventos de botones
while (SDL_PollEvent(&event))
{
switch (event.jbutton.button)
{
case GP2X_BUTTON_START:
done=1;
break;
}
}
}

void draw_game()
{
}

void update_game()
{
read_game_keys();
draw_game();
}

Las funciones del modo juego son exactamente iguales. La diferencia es que el menú dibujará en pantalla varias opciones de texto, como Jugar, Salir, etc... y el juego dibujará nuestra nave, los bichos...


void read_pause_keys()
{
SDL_Event event;
// Comprueba los eventos de botones
while (SDL_PollEvent(&event))
{
switch (event.jbutton.button)
{
case GP2X_BUTTON_START:
done=1;
break;
}
}
}

void draw_pause()
{
}

void update_pause()
{
read_pause_keys();
draw_pause();
}

Y las 3 funciones del modo pausa, totalmente clavadas a las anteriores. Con estas funciones el bucle principal del programa va a sufrir un cambio que lo dejará un poco más claro de entender. El resto de la funcion main() permanece igual.


while (!done)
{
switch (program_mode)
{
case PROGRAM_MODE_MENU:
update_menu();
break;
case PROGRAM_MODE_GAME:
update_game();
break;
case PROGRAM_MODE_PAUSE:
update_pause();
break;
}

SDL_FillRect(screen, NULL, 0x000000);
SDL_Flip(screen);
}

Como veis, lo que hacemos en el bucle principal es comprobar en qué modo estamos. Si estamos en modo menu llamamos a la función update_menu(), si estamos en modo juego llamamos a la función update_game() y si estamos en modo pausa llamamos a update_pausa(). La función apropiada dibujará en pantalla lo que toque y con SDL_Flip() se mostrará en pantalla.

Ahora mismo seguirá dibujándose en negro, pero eso lo cambiaremos en el tutorial número 3.

^MiSaTo^
09/10/2010, 14:43
Sólo un apunte/curiosidad por mi parte. Por qué no usas objetos? Si estás usando C++ aprovechate de las ventajas de POO xD

Yo por ejemplo lo que hago es a parte de dividir como has hecho tú, además tengo una clase Scene, que es abstracta, de la que heredan MenuScene, OptionsScene, GamePlayScene, etc (las que sean).

Además suelo tener un GameManager que es una instancia singleton del juego en sí y que se encarga de tener la escena en la que estamos y manejar el resto de handlers (para el update, los eventos y demás, como lo tienes tú).

Con esto no digo que tu código esté mal, al contrario tu tutorial es muy bueno ^^ Mucho mejor que el resto de los que leí en su día XD Sólo era un apunte por mi parte, por debatir un poco el "esqueleto" de los juegos. :brindis:

pakoito
09/10/2010, 14:45
Este tema me interesa, seguid contando.

Karkayu
09/10/2010, 14:50
Sólo un apunte/curiosidad por mi parte. Por qué no usas objetos? Si estás usando C++ aprovechate de las ventajas de POO xD

Yo por ejemplo lo que hago es a parte de dividir como has hecho tú, además tengo una clase Scene, que es abstracta, de la que heredan MenuScene, OptionsScene, GamePlayScene, etc (las que sean).

Además suelo tener un GameManager que es una instancia singleton del juego en sí y que se encarga de tener la escena en la que estamos y manejar el resto de handlers (para el update, los eventos y demás, como lo tienes tú).

Con esto no digo que tu código esté mal, al contrario tu tutorial es muy bueno ^^ Mucho mejor que el resto de los que leí en su día XD Sólo era un apunte por mi parte, por debatir un poco el "esqueleto" de los juegos. :brindis:

Supongo que es porque la programacion tradicional "entra" mejor en la mente de gente "profana" que la POO (porque estos tutos van dirigidos a gente con conocimientos nulos o casi nulos de algoritmia, no??)
Para entender la POO hay que tener un grado de abstracción que mucha gente no tiene desarrollado.

Por su puesto lo que acabo de comentar es siempre desde mi experiencia personal.

Un saludo
:brindis:

pakoito
09/10/2010, 14:53
Supongo que es porque la programacion tradicional "entra" mejor en la mente de gente "profana" que la POO (porque estos tutos van dirigidos a gente con conocimientos nulos o casi nulos de algoritmia, no??)
Para entender la POO hay que tener un grado de abstracción que mucha gente no tiene desarrollado.

Por su puesto lo que acabo de comentar es siempre desde mi experiencia personal.

Un saludo
:brindis:
No tiene por que, yo soy pro POO 200% pero lo leo para ver cómo se hace el juego en si, la división en "escenas" que hace misato, etc...porque los míos no acaban de salir del todo fluídos. Ahora mismo estoy con otros dos n00bs en uno en Allegro y no somos capaces ni de pintar un sprite sin errores, estamos haciéndolo todo con primitivas.

^MiSaTo^
09/10/2010, 14:55
Supongo que es porque la programacion tradicional "entra" mejor en la mente de gente "profana" que la POO (porque estos tutos van dirigidos a gente con conocimientos nulos o casi nulos de algoritmia, no??)
Para entender la POO hay que tener un grado de abstracción que mucha gente no tiene desarrollado.

Por su puesto lo que acabo de comentar es siempre desde mi experiencia personal.

Un saludo
:brindis:

Yo lo preguntaba porque si uso C++ uso objetos, sino uso C. No me gusta "guarrear", no se.

Aparte, adoro la POO XD Reconozco que en su día me costó un huevo entenderlo pero jue, menudo avance una vez que lo entiendes :brindis:

< - >

No tiene por que, yo soy pro POO 200% pero lo leo para ver cómo se hace el juego en si, la división en "escenas" que hace misato, etc...

Hombre mi división se puede hacer en estructurada, en POO o en lo que te de la gana ;)
Y por supuesto no es la panacea, por eso quería debatirlo ^^

Karkayu
09/10/2010, 15:00
Aparte, adoro la POO XD Reconozco que en su día me costó un huevo entenderlo pero jue, menudo avance una vez que lo entiendes :brindis:

< - >


Hombre mi división se puede hacer en estructurada, en POO o en lo que te de la gana ;)
Y por supuesto no es la panacea, por eso quería debatirlo ^^

Si yo tambien lo haria usando clases y POO. Queda todo mas "ordenadito" :)
Tan solo estoy intentando adivinar por qué el compañero saboteur lo esta haciendo asi. Nada mas.

< - >

No tiene por que, yo soy pro POO 200% pero lo leo para ver cómo se hace el juego en si, la división en "escenas" que hace misato, etc...porque los míos no acaban de salir del todo fluídos. Ahora mismo estoy con otros dos n00bs en uno en Allegro y no somos capaces ni de pintar un sprite sin errores, estamos haciéndolo todo con primitivas.

Yo hablo desde mi experiencia como profesor de programación en general. A MI me ha costado siempre mas que la gente entienda la POO que la programación secuencial.
Sera que soy malo explicando :p

^MiSaTo^
09/10/2010, 15:05
Yo hablo desde mi experiencia como profesor de programación en general. A MI me ha costado siempre mas que la gente entienda la programación secuencial que la POO.
Sera que soy malo explicando :p
En serio? a mi personalemente me costó entender POO. Aunque claro, supongo que es porque mi cabeza la tenía ya "cuadrada" a la programación estructurada (o secuencial) y cambiar la manera de pensar cuesta ;)

Karkayu
09/10/2010, 15:07
En serio? a mi personalemente me costó entender POO. Aunque claro, supongo que es porque mi cabeza la tenía ya "cuadrada" a la programación estructurada (o secuencial) y cambiar la manera de pensar cuesta ;)

Espera espera!!! Que lo he puesto mal!!




Yo hablo desde mi experiencia como profesor de programación en general. A MI me ha costado siempre mas que la gente entienda la POO que la programación secuencial.


Fixed!!

^MiSaTo^
09/10/2010, 15:51
Espera espera!!! Que lo he puesto mal!!



Fixed!!

JAJAJA xDDD

Eskema
09/10/2010, 16:40
Interesante debate, lastima que no tenga conocimientos para compartir porque siempre es bueno ver como lo hacen los demas para aprender cosas nuevas

^MiSaTo^
09/10/2010, 16:47
Interesante debate, lastima que no tenga conocimientos para compartir porque siempre es bueno ver como lo hacen los demas para aprender cosas nuevas

Tú también haces juegos asíque por supuesto que tienes conocimientos para compartir ;)

Yo tampoco me considero experta y fijo que aquí hay gente que sabe mucho más. Pero todos podemos aportar

Eskema
09/10/2010, 16:52
Lo dudo mucho, si mis conocimientos fueran aceptables, alguien habria usado mis fuentes y los habria modificado para hacer algo, cosa que no ha ocurrido nunca. Asi que deben ser muy malos mis fuentes lo cual afirma mi teoria de que no tengo conocimientos que valgan la pena para compartir.
Yo he usado mucho codigo de otras personas que luego he modificado y he aprendido mucho al respecto, pero las comparaciones son siempre odiosas y salgo perdiendo ;)

saboteur
09/10/2010, 16:59
Sólo un apunte/curiosidad por mi parte. Por qué no usas objetos? Si estás usando C++ aprovechate de las ventajas de POO xD

Yo por ejemplo lo que hago es a parte de dividir como has hecho tú, además tengo una clase Scene, que es abstracta, de la que heredan MenuScene, OptionsScene, GamePlayScene, etc (las que sean).

Además suelo tener un GameManager que es una instancia singleton del juego en sí y que se encarga de tener la escena en la que estamos y manejar el resto de handlers (para el update, los eventos y demás, como lo tienes tú).

Con esto no digo que tu código esté mal, al contrario tu tutorial es muy bueno ^^ Mucho mejor que el resto de los que leí en su día XD Sólo era un apunte por mi parte, por debatir un poco el "esqueleto" de los juegos. :brindis:

Más o menos pretendía esto mismo. ;) Lo que quería era explicar la forma de estructurar de una forma sencilla sabiendo que a la gente le suele costar la POO. Y de paso dar pie a la gente a debatir formas de hacerlo mejor. Vamos, que deberías haber puesto el esqueleto del código. :)

Lo que quiero es que la gente piense PRIMERO en: ¿Qué pasos debo seguir?, porque si lo hace así y los desarrolla uno a uno, las cosas salen muy rápido. Me parece que es lo esencial... más que programar.

En las siguientes lecciones también he metido cosas muy básicas pero que dan pie a la gente a pensar como mejorarlas... de hecho, pretendo que la gente lo toquetee y mejore mucho. Ten en cuenta que el juego es muy pequeño, y poner una clase base para los personajes, heredar otra para los bichos, otra para el protagonista, una especial para los efectos, etc... lo mismo empieza a desesperar a la gente. Creo que eso lo podemos dejar para un nivel más avanzado, ¿no? :D

Pero vamos, que he visto cosas como esta y aún es pronto para los novatos de Wiz:


int main()
{
SoccerGame mygame;

mygame.run();
return 1;
}

Y sobre todo... ¡que a nadie le de miedo programar! Programar es divertido tanto si se hace bien como si se hace mal, y hacerlo bien es sólo cuestión de tiempo.

< - >

Lo dudo mucho, si mis conocimientos fueran aceptables, alguien habria usado mis fuentes y los habria modificado para hacer algo, cosa que no ha ocurrido nunca. Asi que deben ser muy malos mis fuentes lo cual afirma mi teoria de que no tengo conocimientos que valgan la pena para compartir.
Yo he usado mucho codigo de otras personas que luego he modificado y he aprendido mucho al respecto, pero las comparaciones son siempre odiosas y salgo perdiendo ;)

Estoy con Misato, si haces juegos puedes aportar cosas. No tienes que ser John Carmack... :)

^MiSaTo^
09/10/2010, 17:00
Lo dudo mucho, si mis conocimientos fueran aceptables, alguien habria usado mis fuentes y los habria modificado para hacer algo, cosa que no ha ocurrido nunca. Asi que deben ser muy malos mis fuentes lo cual afirma mi teoria de que no tengo conocimientos que valgan la pena para compartir.
Yo he usado mucho codigo de otras personas que luego he modificado y he aprendido mucho al respecto, pero las comparaciones son siempre odiosas y salgo perdiendo ;)
No te menosprecies ;) Yo tb hay mucho código que no reutilizo, porque lo miro al tiempo y digo: ESTO ES UNA MIERDA.

En esta "profesión" o "hobby" no se puede parar de aprender cosas, asíque es imposible que ninguno tengamos la sabiduría universal xD

Lo que sí es interesante y bonito es compartir lo que cada uno sepa para aprender entre todos. Por ejemplo yo de OpenGL ES se muy poco, fijo que de eso sabes tú mucho más. Y ya de motores 3D pues ni idea xD


Más o menos pretendía esto mismo. ;) Lo que quería era explicar la forma de estructurar de una forma sencilla sabiendo que a la gente le suele costar la POO. Y de paso dar pie a la gente a debatir formas de hacerlo mejor. Vamos, que deberías haber puesto el esqueleto del código. :)

Lo que quiero es que la gente piense PRIMERO en: ¿Qué pasos debo seguir?, porque si lo hace así y los desarrolla uno a uno, las cosas salen muy rápido. Me parece que es lo esencial... más que programar.

En las siguientes lecciones también he metido cosas muy básicas pero que dan pie a la gente a pensar como mejorarlas... de hecho, pretendo que la gente lo toquetee y mejore mucho. Ten en cuenta que el juego es muy pequeño, y poner una clase base para los personajes, heredar otra para los bichos, otra para el protagonista, una especial para los efectos, etc... lo mismo empieza a desesperar a la gente. Creo que eso lo podemos dejar para un nivel más avanzado, ¿no? :D

Pero vamos, que he visto cosas como esta y aún es pronto para los novatos de Wiz:


int main()
{
SoccerGame mygame;

mygame.run();
return 1;
}

Y sobre todo... ¡que a nadie le de miedo programar! Programar es divertido tanto si se hace bien como si se hace mal, y hacerlo bien es sólo cuestión de tiempo.

No quería criticar tu tutorial en absoluto, perdón si se me ha malinterpretado. Sólo era por abrir un debate que puede ser interesante ;)
Mi código se parece bastante a lo último que has pegado xD

Eskema
09/10/2010, 17:03
No te menosprecies ;)

Hoygan hes hucted una pelota de mucho cuidao xDDD

^MiSaTo^
09/10/2010, 17:04
Hoygan hes hucted una pelota de mucho cuidao xDDD

hoygan dond sta mi huegesito del aifon?

Eskema
09/10/2010, 17:11
Offtopic:Ahi estoy luchando contra gamecenter (by apple TM), que chungo es integrar leaderboards y logros porque te lo tienes que currar tu todo, estos de apple te dan el server y ale, busquese hucted mismo la vida para integrar el resto.
Con lo facilon que es para eso openfeint que te lo da todo hecho......

Eso si por lo menos el juego ahora es compatible con ipod2g y superiores, los iphone3g e inferiores quedan totalmente descartados :(

Fin offtopic

^MiSaTo^
09/10/2010, 17:13
Offtopic:Ahi estoy luchando contra gamecenter (by apple TM), que chungo es integrar leaderboards y logros porque te lo tienes que currar tu todo, estos de apple te dan el server y ale, busquese hucted mismo la vida para integrar el resto.
Con lo facilon que es para eso openfeint que te lo da todo hecho......

Eso si por lo menos el juego ahora es compatible con ipod2g y superiores, los iphone3g e inferiores quedan totalmente descartados :(

Fin offtopic

te hodio!
menos mal que tengo un iTouch 2G por aqui xD

Eskema
09/10/2010, 17:16
te hodio!
menos mal que tengo un iTouch 2G por aqui xD

Mujer ya sabes que no soy profesional, total por 10k polys y 10 modelos con bones animados de nada, fijate los de epic con su unreal en el aifon, fijo que eso va a 60fps en el 3g :P

^MiSaTo^
09/10/2010, 17:18
Mujer ya sabes que no soy profesional, total por 10k polys y 10 modelos con bones animados de nada, fijate los de epic con su unreal en el aifon, fijo que eso va a 60fps en el 3g :P

JAJAJAJAAJA touché!
Lo del unreal en el 3g va a 60fps porque le tienen puesto un limitador, sino iría a una tasa constante de 200 o más! XDDDD

saboteur
09/10/2010, 17:19
No quería criticar tu tutorial en absoluto, perdón si se me ha malinterpretado. Sólo era por abrir un debate que puede ser interesante ;)
Mi código se parece bastante a lo último que has pegado xD

No no no.... no te he malinterpretado, si entiendo a qué te refieres y estoy de acuerdo, no hace falta que vayas con tanto tacto :D. Toda crítica constructiva es buena, y aunque el tutorial sea muy mejorable (que lo es, que me he dado repelús en algunas cosas) lo voy a completar porque el resultado es un jueguecillo bastante chulo (http://www.gp32spain.com/foros/downloads.php?do=file&id=2748). (A ver si lo aceptan)

Quienes empiezan en Wiz deberían buscar de entrada los resultados satisfactorios, el resto ya llegará después. El principal problema que he visto entre los que saben algo de programación es que no entienden muy bien cómo afrontar determinados problemas. Y eso no se enseña en muchos tutoriales.

^MiSaTo^
09/10/2010, 17:21
No no no.... no te he malinterpretado, si entiendo a qué te refieres y estoy de acuerdo, no hace falta que vayas con tanto tacto :D. Toda crítica constructiva es buena, y aunque el tutorial sea muy mejorable (que lo es, que me he dado repelús en algunas cosas) lo voy a completar porque el resultado es un jueguecillo bastante chulo (http://www.gp32spain.com/foros/downloads.php?do=file&id=2748). (A ver si lo aceptan)

Quienes empiezan en Wiz deberían buscar de entrada los resultados satisfactorios, el resto ya llegará después. El principal problema que he visto entre los que saben algo de programación es que no entienden muy bien cómo afrontar determinados problemas. Y eso no se enseña en muchos tutoriales.

Completamente de acuerdo con esto último, por eso empecé yo con los míos para gente sin apenas conocimientos. Al menos esa era mi idea ^^

Por cierto, ya está aceptado tu juego ;)

saboteur
09/10/2010, 17:27
Completamente de acuerdo con esto último, por eso empecé yo con los míos para gente sin apenas conocimientos. Al menos esa era mi idea ^^

Por cierto, ya está aceptado tu juego ;)

Y yo he empezado para gente que busca resultados rápidos... [wei]

Gracias... ;)