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.