domingo, 17 de julio de 2011

GameEngine: Capitulo 22. Tiles Animadas

Hola a todos,

Bienvenidos a un nuevo capitulo de como crear tu propio game engine...

En los últimos capitulos hemos estado trabajando en poder pintar un escenario con tilemaps pero la verdad, sin ninguna animación de fondo, queda un poco soso. Es por ello que este capitulo tratará sobre los tilemaps animados. Un tilemap animado no es más que un mapa en que ciertos materiales no son gráficos estaticos sino animaciones (un gotera, una luz, un antorcha) que aunque no lo parezca ayuda mucho a dar ambientación al juego.

Como lo implementamos?? Sencillo. En primer punto el archivo LoadMaterials.txt (que solo contenia una etiqueta por cada material referente a la textura a usar) se ha modificado un poco . Ahora se le indicará si es una animación(1) o un grafico estatico (0) lo que se pintará en ese material.

0 MATERIAL0
0 MATERIAL1
0 MATERIAL2
1 MATERIAL3
1 MATERIAL4
1 MATERIAL5

En segundo punto se han de definir MATERIAL3,4 y 5 como animaciones dentro del LoadAnim.txt
RUN=Data/Anim/Run.txt
STAND=Data/Anim/Stand.txt
MATERIAL3=Data/Anim/Material3.txt
MATERIAL4=Data/Anim/Material4.txt
MATERIAL5=Data/Anim/Material5.txt

Y cada uno de estos archivos tendrá un aspecto parecido a este:
0 0 0 1 MATERIAL3
1 0 0 2 MATERIAL3
2 0 0 3 MATERIAL3
3 0 0 4 MATERIAL3
Si teneis dudas revisad el capítulo de animaciones 2D (http://lordpakus.blogspot.com/2011/07/gameengine-capitulo-17-anim2dmanager.html)

Finalmente, se tendrán que cargar las texturas que conformarán las animaciones dentro del LoadTexture.txt:
INTRO=Data/Texture/intro.png
PACK=Data/Texture/pack.png
FONT=Data/Texture/Font.png
PLAYER=Data/Texture/Player.png
MOUSE=Data/Texture/Mouse.png
MATERIAL0=Data/Texture/Materials/material00.png
MATERIAL1=Data/Texture/Materials/material01.png
MATERIAL2=Data/Texture/Materials/material02.png
MATERIAL3=Data/Texture/Materials/material03.png
MATERIAL4=Data/Texture/Materials/material04.png
MATERIAL5=Data/Texture/Materials/material05.png

Y en los archivos de particionado para la animación tendrá que haber un cosa de este estilo:
0 0 32 32
32 0 64 32
0 32 32 64
32 32 64 64
Nuevamente, si teneis dudas al respecto de esto os aconsejo que le hecheis un ojo al capitulo de graficos empaquetados (http://lordpakus.blogspot.com/2011/07/gameengine-capitulo-15mejorando-el.html)

Con esto solo hace falta un pequeño cambio en el código del game engine para que todo funcione correctamente:
Dentro del Tile Manager, la función de carga se tiene que cambiar para que acepte el nuevo formato:
void TileManager::Init(int* argc, char* argv[])
{
int num_id = 0;
char cad[256]; //Cadena donde guardaremos cada linea que leamos
int type; //Tipo de tile
char id[32]; //Cadena de identificación de recurso
FILE *fp;

cout << "Inicializamos el tile manager\n";

map = NULL;

fp = fopen("Data\\LoadMaterials.txt","r");
while(!feof(fp))
{
fscanf(fp,"%d %s\n",&type,id);
loaded[num_id].type = type;
sprintf( loaded[ num_id ].cad ,"%s" , id ); //Nos guardamos la referencia al recurso
cout << loaded[ num_id ].cad << " " << loaded[ num_id ].type << "\n";
num_id++;
}

fclose(fp);
}

Y la función de pintado de tilemaps también ha de cambiar un poco.
void TileManager::DrawMap()
{
int i,j;
float x,y,t;
int tile;

for( i = 0 ; i < map_height ; i++ )
{
for( j = 0 ; j < map_width ; j++ )
{
tile = map[ (i*map_width + j) ];

//Si no tenemos tile, no pintamos nada
if(!tile)
continue;

tile--;

switch(loaded[tile].type)
{
//Tile de tipo gráfico estático
case 0:
t = TextureManager::singleton().GetWidth(loaded[tile].cad,0);
x = j*t;
y = i*t;
Core::singleton().DrawSprite(x,y,loaded[tile].cad,0);
break;

//Tile de tipo gráfico animado
case 1:
//Hardecodeo que se arreglará en otro momento.
t = 32;//TextureManager::singleton().GetWidth(loaded[tile].cad,1);
x = j*t;
y = i*t;
Core::singleton().DrawAnim(x,y,loaded[tile].cad);
break;
}
}
}
}

Finalmente solo nos queda ver el video de como queda todo:



Si os fijais en los FPS han tenido un bajada considerable respecto a los de otros capítulos. No hay por que alarmarse, el game engine, por ahora, tiene fines didácticos y nunca se ha buscado el rendimiento extremo.
Esta ralentización tiene dos causas:
  1. El sistema de “etiquetas” (el hecho que un gráfico , un sonido o una animación no sea un puntero o una variable si no un string) para gestionar los recursos nos da una gran potencia y flexibilidad en cuanto al desarrollo de juegos, pero nos resta rendimiento. La solución más fácil es mejorar los sistemas de búsqueda de etiquetas , ya que por ahora usan el peor posible. En cuanto pueda lo haré, tampoco es crítico por ahora.
  2. Se pintan todos los gráficos que se pide que se pinten, aunque no estén dentro de la pantalla. Esto hace que la tarjeta se vea saturada al tener que pintar los cientos o miles de texturas que conforman el tilemap. En breve lo arreglaré y veréis que la diferencia es espectacular.

Aparte de eso, me estoy dando cuenta que aunque el sistema de trabajo creo que es bueno, se hace pesado crear todas las animaciones y particiones de gráficos a mano, así como las listas de carga y similares. Creo que sería una buena idea desarrollar una herramienta que permita trabajar con el arte en nuestros juegos. Si alguien se quiere apuntar al proyecto será bienvenido, no hace falta que sepáis mucha cosa de programación, solamente que tengáis un poco de lógica y ganas de aprender.

Ya en última instancia me iria muy bien que ejecutarais el minijuego que he usado para hacer el video (http://www.megaupload.com/?d=CUZTDMTR) y me dijerais los FPS a los que va y las características aproximadas de vuestro PC (SO, ram, frecuencia,etc... da igual si me lo decís como comentario en este post o me enviáis mail, como lo veáis.). Así sabré si hay más problemas de rendimiento de los que yo me pienso.

Y bueno, hasta aquí hemos llegado hoy. Espero que lo hayáis pasado bien y que hayaís aprendido.

LordPakusBlog
Nos vemos.

3 comentarios :

  1. Yo me apunto :D

    Aunque bueno... programando aún no sé mucho... xD ahora me ando matando intentando crear una Simpletron en C xD

    Pero ganas de aprender sí que sí tengo :D

    Saludos ^.^

    Por cierto, el game-engine cada vez se ve más avanzado (:

    ResponderEliminar
  2. Perfecto, te apunto, en breve (dame un par de dias) inciaré el proyecto del gestor de herramientas...

    Gracias por el game engine...como todo en la vida, es cuestión de paciencia... A ver hasta donde llegamos...

    Nos vemos

    ResponderEliminar
  3. reethok...http://lordpakus.blogspot.com/2011/07/inicio-del-proyecto-lptools2d.html ahí lo tienes...

    ResponderEliminar

Entradas populares