Mostrando entradas con la etiqueta Codigo. Mostrar todas las entradas
Mostrando entradas con la etiqueta Codigo. Mostrar todas las entradas

lunes, 23 de abril de 2012

Del dibujo al codigo

El primer problema que me planteé fue el de construir un mecanismo que me permitiera mostrar por pantalla una animación sin que nadie interactuara con ella.


Una animación es, a fin de cuentas, una secuencia de frames o cuadros o fotogramas o como quieras llamarlo. Al pasar estas imagenes muy rápido se da una sensación de continuidad, nada más que con mirar los gif que he puesto en posts anteriores nos damos cuenta de esto.

Teniendo esto en mente y llevandolo al contexto del juego un sprite sería por lo tanto un elemento en el juego que dispone de un conjunto de animaciones. El personaje principal sería un sprite y tendría sus animaciones asociadas a diversas acciones como correr, saltar, disparar o lo que sea que haga.

En resumen, tenemos que un sprite tiene varias animaciones y una animación esta formada por frames. Todo esto me da la información que necesito.
Los detalles de la implementación de cada uno se pueden ver en los ficheros Frame.cpp, Animation.cpp y Sprite.cpp. Recuerdo que se puede ver el código aquí.

Esta sería una primera aproximación como ya he dicho y a medida que me vayan surgiendo necesidades ire añadiendole más o menos funcionalidad.

Antes de seguir, tengo que explicar un poco la clase SDL_Rect de, obviamente, SDL. No es mi intención enseñar aqui C/C++ ni convertir esto en una referncía a la librería usada ya que existen muchas y mejores de lo que yo puedo poner en un blog, por ejemplo esta Wiki.

Una forma fácil de entender esto es imaginar que tenemos todas los frames de nuestro personaje en una sola imagen, pongamos un bmp, y claro... no podemos coger y sacar todo este bloque por pantalla solo queremos que salga un trocito de la misma cada vez. Pues para eso tenemos la clase SDL_Rect que vendría a ser un cuadrado de referencía del trocito que queremos mostrar.

Si aun no lo pillas podemos hacer algo más empírico y molón, te imprimes una secuencia de animación de las que he puesto por aquí luego coges un folio en blanco y recortas un cuadrado del tamaño de uno los frames de la secuencia y lo pones encima de lo impreso. El cuadrado recortado sería nuestro SDL_Rect.

Por lo tanto tendremos una imagen grandota con todos las cosas que usaremos en nuestro personaje y luego una referencia al trocito de esta que queremos mostrar. Pero vamos a complicarlo un poco más ya que me doy cuenta de que pasa si nuestro bichito mueve la cola, parpadea, anda o en resumen combina acciones. Si lo hago de esta manera tendría que hacer secuencias para todas las combinaciones posibles y eso la verdad que es mucho trabajo forzando mis ya pocas habilidades pictoricas.

Para evitar esto haré que un frame tenga un conjunto de refencias o clases SDL_Rect. De esta forma podría tener un conjunto de cabezas, piernas, colas y demás en una imagen e ir cogiendo referencias de aquí y de alli hasta montar al personaje cual Frankestein.

Cuando haga los dibujos seguiré haciendolos de cuerpo entero ya que esto lo hace más fácil (al menos para mi) y llegados el momento los desmontaré y cogeré solo lo esencial.

Por cierto (y para acabar ya), he hecho que cuando se añada un frame o una animación se haga una copia del mismo de forma que puedas liberar el espacio del original a añadir... no se si esto es muy correcto o si al final me dará más trabajo pero sigue siendo lo primero que se me ha ocurrido y poco a poco lo iré puliendo.

lunes, 26 de marzo de 2012

Un paso mas

Antes de ponerme a meter cachos y cachos de código por aquí y hacer esto una locura voy a tomar un camino más razonable.

En primer lugar voy a abrirme una cuenta en SourceForge y hacer un repositorio, luego subiré el código y los ejecutables que vaya generando con TortoiseSVN.

Para ello una vez abierta la cuenta y que nos den espacio para el proyecto debemos obtener la URL del repositorio pulsamos con el botón derecho del ratón en la carpeta que tenemos el código y aparece la opción SVN Checkout... una vez aquí metemos la URL, luego el login y password. Finalmente botón derecho otra vez en la carpeta, submenu TortoiseSVN e Import... Voila! Fácil y rápido... ya tenemos todo subido.

Con esto se tendrá un acceso bastante simple al código. Bueno lo que llevo hecho se puede ver en este enlace. Ya explicaré en otras entradas de que va todo esto, intentaré hacer los diagramas y no liarme mucho explicando... tenedme paciencia.

El objetivo de todo esto es aprender o al menos sacar algo... no se si finalmente se llegará a algo curioso, espero que sí. Por lo menos espero divertirme en el proceso y si alguien más puede disfrutarlo pues mejor que mejor.

Para terminar pongo una frase que me gusta mucho:

"Focus on the journey, not the destination. Joy is found not in finishing an activity but in doing it" - Greg Anderson

miércoles, 21 de marzo de 2012

El bucle de juego


Si señor/a, veamos lo que es esto del bucle de juego.

La forma de programar un juego se reduce a un bucle en el que se repite una secuencia básica. Esta que tenenmos aquí.
La cosa se puede complicar más o menos añadiendo más pasos pero básicamente es esto.

En un primer paso capturamos los eventos y entradas del usuario, es decir, vemos que ha hecho nuestro jugador. Una vez tenemos esto tratamos la lógica interna del juego que consiste en calcular la nueva posición del jugador, mover los enemigos y disparos, colisiones, ver la posición del mapa, sumar la puntuación, etc.. en resumen, todas las acciones que marcan un paso en la evolución del juego.

Finalmente queda mostrar todo lo anterior al usuario por pantalla y vuelta a empezar.

Así de sencillo parece, pero la cosa se puede complicar muchisimo.

Bueno, ya se que poco código ha habido aquí hasta ahora... pero para el siguiente pondré una primera aproximación (porque es de la primera forma que se me ha ocurrido) a una implementación de como mostrar
un Sprite animado en pantalla a ver que tal.

Por cierto, el diagrama de la imagén esta hecho con Dia Diagram Editor que no esta nada mal... he probado algun otro pero este resulta muy sencillo de manejar.

domingo, 11 de marzo de 2012

Algo de código

Tanto dibujo me come la moral (sobre todo por lo torpe que soy en este tema), no hay nada más frustrante que hacer toda una secuencia y darte cuenta que a la mitad has deformado sin querer un poco la imagen y al ponerlo todo junto hace cosas raras... ahora ponte a arreglar todos los frames desde el error... es exasperarte.

Vamos con otro tema, la elección del IDE... de cabeza me fui para Eclipse pero por desgracia en estos momentos no dispongo de un PC y estoy tirando de un Netbook conectado a la tele que es más bien modestito... así que me mordí la lengua y me fui a un Dev-C++ que no se come el Netbook pero en este caso no me gusta como trata las tabulaciones y otras cosas (manias mias) y me decidí finalmente por Code::Blocks, el cual tira muy bien y además es supersencillo de usar.

Por otro lado, me decidí por usar las librerías de SDL porque son muy versatiles, estan muy extendidas, te dan portabilidad entre sistemas operativos y además (y sobre todo) son muy cómodas de usar.

¿Qué cogemos de la página de SDL?

Necesitamos las dos versiones de las librerias, la de desarrollo y la de ejecucion.

Simplemente tomamos la que sea de ejecucion, descomprimimos y guardamos las DLL en la carpeta System de Windows.

En Code::Blocks sobra con decir que quieres hacer un proyecto con SDL e indicarle donde esta las fuentes de la librería de desarrollo para empezar a trabajar, además te crea automáticamente un main con lo básico para sacar una ventana con una foto (de hecho es el logo de Code::Blocks).

En Dev-C++ hay que meter todo lo que este en la carpeta lib de la librería de desarrollo en la carpeta lib de  Dev-C++  y luego copiamos la carpeta SDL que esta dentro de include en la carpeta include de Dev-C++.

Con esto ya estaria todo puesto en su sitio. Si queremos añadir cualqueir librería adicional pues simplemente hacemos lo mismo. Es importante guardar los .h de la version de desarrollo dentro de la carpeta include/SDL del Dev-C++ y no directamente en la carpeta include.

Lo unico que queda es preparar el Dev-C++  para linkar todo correctamente, para ello vamos a Herramientas, Opciones del Compilador, marcamos la casilla que dice "Añadir estos comandos a la linea de comandos del linker" y escribimos -lmingw32 -lSDLmain -lSDL -mwindows.

Para cada librería auxiliar tendriamos que añadir su -l correspondiente,

Y ya esta todo listo, solo queda crear un nuevo proyecto que tiene que ser del tipo "Console Application" y a disfrutar.

En Eclipse no lo pongo porque como ya dije me va extremadamente lento, si el día de mañana puedo procurarme un PC decente (o normal) me pasaré a este IDE.