Hacía un par de meses que no posteaba nada por aquí y ya iba siendo hora. En los últimos post había comentado que me había metido con el desarrollo de algún juego 3D para consolas y después de algún tiempo ya tengo algo que enseñár aunque se encuentra en estado muy inicial.
El caso es que estoy avanzando bastante con el tema de desarrollar juegos 3D basado en Yeti3D-Pro para las portátiles de Nintendo e incluso para plataformas como Android. Ya tengo montado el proyecto para devkitPRO que me permite compilar todo y generar la ROM para 3 targets diferentes GBA, NDS y 3DS (además de generar el binario para la plataforma de origen, el PC de desarrollo) aunque en principio se podría portar a más sistemas (cómo se hizo en su día por ejemplo GP2X Wiz / Caanoo) e incluso se puede utilizar para desarrollar juegos 3D para Android. Lo que me está gustando de Yeti3D-Pro es lo versátil que es para hacer juegos 3D de diferente temática. Supongo que al principio de los tiempos estaba pensado para desarrollar "shooters en primera persona" (FPS) pero se puede perfectamente utilizar para realizar juegos tipo "survival horror", juegos de lucha, plataformas 3D o incluso juegos de carreras.
Además el editor de niveles del Yeti3D-Pro es mucho más completo que el de la versión anterior que era más "tosco". El editor nuevo admite comandos a través de la consola lo que hace que sea también más fácil de añadir los elementos al "mapeado" y diseñar el entorno, además de permitir probar los cambios que se programan en el entorno / nivel directamente sobre el editor sin tener que recompilar la ROM ya que el editor incorpora una función que carga el mapa "in-situ".
Y luego las herramientas de modelado para generar los "objetos" (enemigos, items, etc...) que se pueden utilizar son muy variadas, la única pega es que hasta la fecha sólo se admiten modelos en formato MD2 (el formato que usaba Quake 2) pero aún así hay muchas herramientas que permiten modelar y hay bastantes repositorios con modelos ya construidos incluyendo personajes clásicos como Mario o Sonic, pero los hay de muchas y variadas temáticas (no se ciñen sólo a desarrollar modelos y "Skins" para juegos tipo FPS).
Por otro lado el motor sólo admite modelos MD2 de Quake 2. De hecho en el código fuente del motor se puede ver lo siguiente:
void animation_mode(animation_t* a, int mode, int speed, int loops)
{
const u8 frames[][2] =
{
{ 0, 40}, //MD2_ANIM_STAND
{ 40, 6}, //MD2_ANIM_RUN
{ 46, 8}, //MD2_ANIM_ATTACK
{ 54, 4}, //MD2_ANIM_PAIN1
{ 58, 4}, //MD2_ANIM_PAIN2
{ 62, 4}, //MD2_ANIM_PAIN3
{ 66, 6}, //MD2_ANIM_JUMP
{ 72, 12}, //MD2_ANIM_FLIPOFF
{ 84, 11}, //MD2_ANIM_SALUTE
{ 95, 17}, //MD2_ANIM_TAUNT
{112, 11}, //MD2_ANIM_WAVE
{123, 12}, //MD2_ANIM_POINT
{135, 19}, //MD2_ANIM_CROUCH_STAND
{154, 6}, //MD2_ANIM_CROUCH_WALK
{160, 9}, //MD2_ANIM_CROUCH_ATTACK
{169, 4}, //MD2_ANIM_CROUCH_PAIN
{173, 5}, //MD2_ANIM_CROUCH_DEATH
{178, 6}, //MD2_ANIM_DEATH1
{184, 6}, //MD2_ANIM_DEATH2
{190, 8} //MD2_ANIM_DEATH3
};
animation_init(a, mode, frames[mode][0], frames[mode][1], speed, loops);
}
La definición de los modelos se hace asumiendo la estructura del MD2 por eso en el método anterior que se usa para animar los modelos 3D que suelen tiener 199 frames de animación distribuidos en 21 animaciones completas. Si se quisiera tener "soporte nativo" para modelos MDL de Quake o MD3 de Quake 3 se podría picar el código correspondiente para cargar y manejar dichos modelos sin tener que usar herramientas de conversión de modelos que permitan pasar de MDL a MD2, de MD3 a MD2 o de OBJ a MD2. Estás herramientas existen y funcionan. Sin embargo esas herramientas convierten tal cual el modelo original a MD2 manteniendo los frames de animación del modelo original. En los modelos MD2 el límite máximo de frames está en 512 frames de animación y en MD3 está en 1024, mientras que en MDL este límite superior está en 256. Si todos los modelos MD3 y MDL que conviertas siguen en el esquema del segmento de código anterior y tienen definidos 199 frames no hay problema a la hora de realizar la conversión. Sin embargo hay varios problemas cuando el modelo tiene menos frames de los soportados por el límite máximo de MD2 (cuando se supera el límite también y supongo que la herramienta no dejará realizar la conversión aunque nunca me he topado con un modelo MD3 de más de 512 frames pero seguro que los hay) porque la estructura anterior te queda descabalada a la hora de leer los "frames" de animación y ya no se puede leer la animación según el esquema anterior. He probado a convertir rápidamente el modelo MDL "KNIGHT" de Quake a MD2.
La herramienta que he usado me saca por pantalla que el número de frames de animación de este modelo es de 160 por tanto hasta 199 tengo 39 frames que pierdo o no tengo en el nuevo modelo MD2. Así con el modelo del ejemplo al cargar al "KNIGHT" en el editor el modelo aparece siempre repitiendo en LOOP la mitad de su animación de ataque (es decir levantando la espada y bajándola a media altura). ¿Eso significa que no puedo usarlo? No, simplemente que tengo que usar otro tipo de distribución para por ejemplo meter dicho modelo con la animación "MD2_ANIM_RUN" en el editor (que es la animación por defecto que se usa al cargar un modelo en el editor, es decir, en modo edición todos los modelos salen corriendo en el sitio cuando se cargan). Esto último se puede hacer por código para cada modelo en concreto y sacando con una herramienta de visionado de modelos cuantos frames pertencen a cada animación una vez convertido a MD2 y picando un handler para cada modelo MDL covertido a MD2 que tenga menos de 199 frames. Esto se me ocurre así a vote pronto, pero no es lo más óptimo. Lo mejor sería coger la "MDL Specification" y picar en el código del engine la definición nativa de los modelos MDL para que el engine sea capaz de tratarlos directamente al leer el fichero MDL con el objeto3D y tenga funciones propias para tratar dichos modelos y animarlos ("¡Que es lo que he terminado haciendo!").
Finalmente dejo por aquí un nuevo video sobre el proyecto del FPS en el que llevo trabajando desde hace algunos meses. Como ya he comentado con anterioriradad el juego está basado en una modificación (profunda) y propia del Yeti3D Pro Engine desarrollado inicialmente por Derek J. Evans y posteriormente modificado por el usuario "NiXot". Actualmente la versión que he modificado permite añadir en el modo "editor" puertas y elevadores que no estaban soportados en las versiones previas así como la carga de modelos 3D en formato MDL y OBJ/MTL ya que hasta la fecha sólo soportaba modelos MD2 (es decir el formato usado en juegos como Quake 2). El video está dividido en dos partes: en la primera se puede apreciar un gameplay corto en el que controlamos al personaje usando diversas armas (modelos Md2 sacados de Quake 2) contra enemigos sacados de diversos repositorios de modelos 3d en Internet, se trata pues de una prueba de carga básica ya que el nivel donde se desarrolla todo es una modificación de un nivel antiguo que tenía pleneado para la realease de GBA. En la segunda parte del video se puede apreciar como es parte del proceso de testeo de modelos MD2 y como estos son cargados en el mapa usando el editor de niveles de Yeti3D Pro.
3D FIRST PERSON SHOOTER (GBA / 3DS / ANDROID) (HOMEBREW) Yeti3D Pro Engine BASIC GAMEPLAY (WIP)Uno de los aspectos que estoy investigando es como asociar a cada modelo MD2 de enemigo otro modelo MD2 de un arma ya que en el estado actual de desarrollo cuando los enemigos disparan se activa su animación correspondiente "MD2_ANIM_ATTACK" y se ponen en postura de ataque pero sólo se ve como "el rayo" del disparo sale objeto MD2 del personaje ya que este no tiene arma asociada, es un poco gracioso la verdad. Creo que esto no estaba contemplado el motor Yeti3D original y tampoco ha sido añadido al Yeti3D-Pro. En todo caso se me ocurren dos formas de solventarlo: la primera es por código y la segunda es hacer un "MERGE" entre el modelo MD2 del enemigo en cuestión y el modelo MD2 del arma. Esto último es posible ya que muchas de las herramientas de modelado ya contemplan este tipo de solución para fusionar modelos.
Las imágenes del video se corresponden con las versiones de PC/Android, cuando haya material de las versiones para GBA y 3DS lo iré subiendo al canal principal de YT así que si estáis interesados en seguir el proceso de creación del juego (con nuevos enemigos y niveles modelados desde cero) como se suele decir... STAY TUNNED.
PD: respecto al resto de proyectos que tengo abiertos para GameBoy y "otros" todo sigue adelante, el tema es que hasta el mes de Julio (más o menos) voy a estar bastante liado con otros temas y es entonces cuando me quedaré libre del todo para ir sacando estas cosillas adelante.
Saludos.