Isshokuta; 20160518

Siguiendo con los sprites, tengo que ver cómo automatizar bien el proceso de conversión. Necesito la habilidad de poder definir un origen y un tamaño personalizado para cada sprite del spritesheet.

A lo mejor lo suyo es extender (de nuevo) mkts con un nuevo modo, “spritesheet”. Luego se me multiplicará todo porque habrá que hacerlo para sprites de 8×16 pero por el momento lo dejo aparcado. En el modo “spritesheet”, se leen instrucciones de un script para hacer los recortes y la conversión. Este script definirá cada metasprite por separado con todas sus historias.

Aunque lo suyo es hacer que esto más bien sea un modo “scripted” que pueda usar, en el futuro, para hacerlo todo siguiendo un script. Interesante. Creo que tiraré por ahí. Modo “scripted”. Por el momento sólo introduciré un comando (además de los que configuran el resto de cosas: archivo PNG, paletas, etc.:

METASPRITE X0, Y0, WC, HC, OX, OY

Donde:

  • X0, Y0 son las coordenadas (en caracteres) dentro de la imagen donde empieza el metasprite.
  • WC, HC son las dimensiones del rectángulo que contiene al metasprite en caracteres.
  • OX, OY representan el origen relativo del metasprite con respecto a sus coordenadas.

A ver qué sale de todo esto 🙂 Creo que puedo aprovechar tal cual la función. Lo haré para NES y GB, que son parecidas. La SG-1000 la dejo por lo pronto como bestia aparte, porque todas las necesidades están ya cubiertas y porque es de su padre y de su madre con respecto a las conversiones.

~~~

Lo voy documentando a medida que lo voy haciendo.

~~

Bueno, como siempre (y lo detesto) he programado durante una hora mil millones de lineas y modificaciones sin probar un carajo. Ahora explotará el mundo en cuanto me ponga a compilar mkts…

OTIA ha compilao del tirona. ¿Funciona lo viejo? . . . Parece que sí.

Probaré a generar pequeño script que recorte dos o tres sprites del spriteset a ver cómo se porta.

~~

Perfecto, tras algunos ajustes parece que funciona como debe. Ahora puedo terminar el spriteset, importarlo, y empezar a jugar con la rutina de movimiento. Primero haré que ande hacia un lado o hacia otro… Luego tendré que solucionar el tema de los saltos precalculados, y el tema de cambiar de altura y caer desde la misma altura (cuya aceleración por gravedad tendré que precalcular también).

Puedo hacer fácilmente un calculador de incrementos para trayectorias parabólicas o semiparabólicas pero los valores de las ecuaciones tendré que irlos probando a mano y tal.

Pero antes tengo que pintar sprites… O no, me puedo dedicar a esto con lo que tengo.

~~

Mientras empezaba a montar el tenderete se me ha ocurrido que la forma buena de hacer esto es mediante una máquina de estados relativamente compleja. Lo suyo es que deje de poner lineas a lo loco y me siente para dibujar al menos un diagrama de la máquina de estados con toooodas las posibles transiciones y lo monte todo en base a ella. Así lo puedo ir generando a cachos y ver como va integrándose.

~

He programado el esqueleto más básico y los estados idle, walking y crouching (parcialmente, faltan las transiciones a los estados que no están). Para seguir tengo que hacer el metaspriteset y ahora mismo no me apetece demasiado. Preparo las cosas para irme a casa.

~~~~~~

Bueno, he currado un poquito, importando parte del spriteset (¡va de puta madre!) y he probado que la porción de la máquina de estados para el player que había implementado funciona correctamente. También he hecho la tontirrutina que controla a la cámara (mínima expresión).

** REMEMBER ** Lo apunto para luego: como empleo ambas nametables, aunque solo scrollee “de verdad” hacia una dirección, se puede retroceder un poco siemper que no nos topemos, al ciclar, con el borde que se está actualizando por la parte derecha. A lo mejor la jugabilidad es algo mayor si dejo que la cámara retroceda un poco, unos 192 píxeles o así – pero no es algo que me vaya a quitar el sueño y que dejaré “por si pega” para el final.

Como quiero darle una pensada a lo de precalcular los saltos, creo que voy a intentar añadir el estado de puñetazo, a ver cómo controlo los debounces y las mierdas y permito encadenar varios puñetazos.

I P1 A B A B A B A B A I 
|        *   *   *   * |

B es el estado que registraría la hostia y debe quedarse más frames.

Puedo configurar tiempos para cada tipo de estado para poder tocar el número de frames sin problemas.

Tengo estos sub estados

IDLE -> PREP1 PREP2 PUNCH PREP3 PUNCH PREP3 PUNCH ... -> IDLE

PREP1 -> PREP2 tras NF_PREP1 (frame 0)
PREP2 -> PUNCH tras NF_PREP2 (frame 1)
PUNCH -> PREP3 tras NF_PUNCH (frame 2)
PREP3 -> IDLE tras NF_PREP3 (frame 1)
PREP3 -> PUNCH si pulsamos "B" antes de NF_PREP3

Um, creo que lo tengo más o menos claro y dependerá de los números de frames de espera que funcione o no.

Lo que seguramente me tocará la picha un lier es el debounce. Creo que puedo centralizar la lectura de los botones, al igual que he hecho con el DPAD, y solucionar todas estas mierdas.

~~~

Con alguna mejora que hacer, el puñetazo funciona guay. Lo que pasa es que no había tenido yo en cuenta el tema del origen de coordenadas al girar el objeto, sobre todo cuando los frames son diferentes. Tengo que pensar esto…

Lo veo siempre mejor para este caso.

Si mira para la derecha, el personaje ocupa 32 pixels, y tengo el origen a -12. O sea, en el punto “medio”, tenemos 12 pixels a la izquierda y 20 a la derecha.

Al mirar a la izquierda, debería ser al revés: tener 20 a la izquierda y 12 a la derecha, por lo que el origen debería ser -20, y no -12.

12+20 = 32. Si hago que el origen sea -WIDTH – ORIGEN, tengo -32 – -12 = -20. Esto me funcionará siempre porque mis origenes son negativos pero ¿y si son positivos? PONGAMOS QUE TAMBIÉN.

-24 – -12 = -12

¿Y cuando el punto de referencia está en la esquina superior derecha? 0 siempre debe ser 0. Aquí no me vale. Voy a hacer un nuevo modo de flipar – digo de espejar: MIRRORED, que es para estos casos. . . Hecho y funcionando. Resuelto el desaguisado.

Ahora la patadita agachada. Esta es más fácil porque no hay repetición, es un ciclo perfecto que vuelve al estado agachado, de donde parte.

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión /  Cambiar )

Google photo

Estás comentando usando tu cuenta de Google. Cerrar sesión /  Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión /  Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión /  Cambiar )

Conectando a %s