lunes, 5 de marzo de 2012

Sprites animados

Un sprite animado es una secuencia de imágenes que se repite para dar la sensación de movimiento. Para poder animar sprites con mi código primero debo liberar el procesador. Ahora estoy pintando un fotograma cada 20000us, cada fotograma son 312 líneas, y cada línea dura 64us.

 64 * 312 = 19968us
20000 - 19968 = 32us

 Dispongo de 32us para ejecutar la lógica de programa, o lo que es lo mismo de media línea. Una forma de liberar procesador sería utilizar un timer de 64us para pintar cada línea de forma separada, y quitar todos los delays finales de cada una de las líneas de sincronía y de las líneas no visibles. Pero si alguna línea tardase más de la cuenta en ejecutarse se perdería la sincronía.

La mejor forma que he encontrado de hacerlo es cambiando los pins de sincronía por un pin PWM controlado por el Timer1 y que sea este el que se encargue de todo. Para remplazar los 2 pins de sincronía por uno sólo que haga por los dos he buscado el esquema interno del monitor 1084P y he encontrado esto:

Esquema del conector DIN6 en el monitor 1084P

 Así que las 2 sincronías van a parar al mismo sitio utilizando resistencias de 470. Cuando HSync es 1, VSync es 0 y viceversa. Así que conectando el pin que generará ahora la sincronía a cualquiera de las dos entradas de sincronía del monitor y la otra entrada a 0V tenemos sincronía con un sólo pin.


Esquema sincronía con PWM

No me he puesto a programar el código de sincronía PWM ya que existen un montón de ejemplos por la red, el mejor de todos es el que utiliza Mdmetzle (no se su nombre real) en su librería Arduino TVOut. He utilizado el código de inicialización del timer y las funciones de sincronía, he cambiado su función de render por la mía y he eliminado el sonido (por ahora).

Para hacer la prueba he utilizado el mismo TileMap que en el artículo anterior (quitando las 3 primeras plantas) y he incluido una animación de 4 fotogramas de Sonic girando.


Cuatro fotogramas = Sonic girando

En el siguiente código se puede ver que en el bucle principal de programa se pinta un fotograma diferente cada 100ms:

 
byte spr;
byte sprC = 0;
byte sprW = 3;

void loop()
{
// Game update code

spr = sprC * sprW; 

// Backbround
SetTile(2,11); 
SetTile(3,11); 
SetTile(4,11); 
SetTile(2,12); 
SetTile(3,12); 
SetTile(4,12); 
SetTile(2,13); 
SetTile(3,13); 
SetTile(4,13); 

// Character
SetSprite(2,11,spr); 
SetSprite(3,11,spr+1); 
SetSprite(4,11,spr+2); 
SetSprite(2,12,spr+12); 
SetSprite(3,12,spr+13); 
SetSprite(4,12,spr+14); 
SetSprite(2,13,spr+24); 
SetSprite(3,13,spr+25); 
SetSprite(4,13,spr+26); 

sprC = (sprC+1)%4; 
delay(100); 

}


El resultado final en un video con poca mala calidad, no tengo una cámara mejor:







El código está en la página de descargas.




Commodore Peripherial Documents: http://project64.c64.org/hw/peri.html
1084P Schematics: http://project64.c64.org/hw/1084p%20schematics.zip
Sprites Sonic: http://sdb.drshnaps.com/display.php?object=6468

2 comentarios:

  1. Hola, llevo siguiendo tu proyecto desde que llegaron visitas a mi blog del mismo, muy interesante. Siempre he querido meterme en el mundo de la robótica, pero mis nulos conocimientos de mecánica y electrónica siempre me han hecho decantarme la parte de software e IA únicamente.

    Llevo tiempo mirando Arduino y parece que podría ser una buena plataforma para comenzar a adentrarme en la parte electrónica y/o mecánica. ¿Me lo recomiendas?, ¿Es muy complicado para los novatos? ¿Algún consejo para adentrarse en este mundo? Como mi blog indica me interesa sobre todo la Inteligencia Artificial, pero me gustaría poder practicarla e implementarla en un robot.

    Bueno esto no viene muy a cuento con el post, espero que no te importe. Un saludo y sigue comentando aquí tus avances que yo por lo menos estaré muy atento a los progresos.

    ResponderEliminar
    Respuestas
    1. Hola Adrián, gracias por visitar mi blog y por comentar en él.

      A decir verdad yo tampoco tengo muchos conocimientos de electrónica, elegí Arduino tras ver los resultados que podía ofrecerme usando pocas líneas de código. Si eres programador le sacarás mucho partido, hay proyectos muy interesantes en la red, todos ellos de código abierto que pueden ayudarte a aprender su funcionamiento. ¿Si te lo recomiendo? Si, por supuesto.

      Si quieres probar antes de comprar una placa te recomiendo que le eches un vistazo a "Processing" (programación gráfica para PC), sus entornos de programación son similares, y aunque Arduino sea C++ y Procesing sea Java, puedes hacerte una idea de lo fácil que resulta hacer algo sencillo con ellos. Yo estoy utilizando Processing para hacer un pequeño motor que me permita testear los mismos juegos que ejecutará (eso espero) la consola que estoy haciendo, algo así como un emulador.

      Bueno, sólo decirte que llegué a tu página buscando algún artículo que explicase mejor que yo el tema del tilemapping y lo encontré.

      Gracias y espero haberte servido de ayuda.
      Un saludo.

      Eliminar