Motor scroll tileado 3.2 (isometrica inside)

Started by Drumpi, October 04, 2009, 01:26:00 AM

Previous topic - Next topic

0 Members and 1 Guest are viewing this topic.

Drumpi

Drumpi se complace en anunciarles:

EL NUEVO Y MEJORADO MOTOR DE SCROLL TILEADO V3.2

Ha costado pero ya lo tenemos entre nosotros.
Son un conjunto de códigos que crean un scroll basado en tiles, en el que cada uno de ellos es un proceso, y aun así, obtenemos un buen rendimiento para ser código Fénix/BennuGD.
El motor funciona en todas las versiones de Fénix y de Bennu que he probado: Fenix 083b, 084, pre084b, 092a, 093preview9, UFenix, Bennu r106, BennuGP2X r107.

Como muestra de la eficacia, un scroll normal, en GP2X (320x240, a 16 bits, con una CPU ARM a 200MHz) usando tiles de 32x32 y 2 capas, ha funcionado entre 60 y 110 fps en UFenix, según la carga de tiles, y entre 65 y 135 fps en BennuGP2X.
Un scroll tileado isométrico, que tiene el doble de tiles por capa, ha ido bastante más lento, 5 fps en UFenix y 32 fps en BennuGP2X, pero en mi PC ha superado sin problemas los 100 fps. Y estamos hablando de tiles relativamente pequeños.

Esta versión tiene muchísimas mejoras de rendimiento respecto a su homóloga 2.0, y es más independiente y modularizada, fácilmente extensible y sencilla de comprender.
Incluye un completo manual en htm en el que se explican todos los conceptos y ejemplos incluidos con el motor. Echadle un vistazo porque me ha llevado casi tanto como el propio motor ;D

Espero que lo disfruteis y que os simplifique mucho la vida (y si sirve para darle ideas a alguien para hacer un módulo en C, pues mejor :D)

Descargar motor de scroll tileado v 3.2 (incluye motor isométrico)

------------------------------------------------------------------------------------------
MENSAJE ORIGINAL
------------------------------------------------------------------------------------------

Hola a todos:

Me estoy empezando a desesperar, porque todavía sigo programando lo que debería llevar ya una semana hecho. Si sigo así no llego al concurso.
Bueno, pues os traigo una version en fase alfa del motor de scroll tileado, para que vayais abriendo boca. Incluye lo siguiente:

-El motor de scroll tileado normal, que debería funcionar al 100% sin problemas (aun estoy por añadir una opción para añadir "profundidad progresiva", es decir, distinta Z según posición Y). Si queréis usar una versión antigua de Fenix (<0.92a) hay que hacer una ligera modificación para esquivar un "error".
-El motor de scroll tileado isométrico, que no va nada mal, pero que aun tengo problemas con las Z, y que no se puede hacer el scroll cíclico "sólo en X" ni "sólo en Y" (en el último parámetro sólo funciona el flags a 0 ó a 3).
-Cinco (si, cinco) ejemplos de uso. Desde temp1.prg hasta temp5.prg. En el documento "guías de test" se indica qué hace cada uno. Tres de scroll normal, y dos de isométrico.

Es una versión Alpha, por lo que aun está en desarrollo. La parte de scroll normal ya podría ser una Beta preparada para buscar fallos. Digo esto porque de momento no hay documentación ni guía de uso, PERO los ejemplos creo que son bastante claros, y en los includes y los .h hay información de uso de cada función.
Lo importante es que sepais que se crean dos tipos nuevos de datos (uno para cargar mapas y otro para manejar el scroll), se añaden variables locales nuevas (X2, Y2 y Z2 para almacenar la posición respecto al scroll), y que sólo vais a necesitar las funciones:
-Identifica_mapa: por si no conoceis el formato del fichero de mapa de tiles que quereis cargar.
-Load_tmf, load_tpr o load_tmg para cargar el mapa de tiles, según su formato.
-Start_tscroll/start_isometric_tscroll: inicia el scroll con los datos que se le pasa.
-Ts_actualiza_tiles/ts_actualiza_tiles_isometricos: fuerza un refresco total del scroll, sólo necesario (quizás) al arrancar o al hacer modificaciones "serias" (como mucho, lo usareis como en los ejemplos).
-Stop_tscroll/stop_isometric_tscroll: detiene el scroll.
-tscroll_get_screen_position/isometric_tscroll_xget_screen_position: Si se les da unas coordenadas relativas al scroll, este devolverá coordenadas relativas a la pantalla.
-isometric_tscroll_get_screen_position: si se le da la id de un proceso, leerá sus valores X2,Y2 y Z2 y lo situará dentro del scroll. Una de las funciones problemáticas con las Z.
-tscroll_obtener_tile/tscroll_obtener_isometric_tile: devuelve el valor del tile de una posición. Sólo sirve con el mapa del scroll.
-obtener_tile: devuelve el valor del tile de una posición. Funciona con cualquier mapa cargado, se use o no en el scroll.

Dentro de la estructura Tscroll, os interesan los campos:
-ts_file: guarda el ID del FPG con los tiles (gráficos) que va a usar el scroll.
-id_target: guarda el ID del proceso a seguir con la cámara

Me interesaría que si alguien encuentra el fallo que hay con el tema de las Z en el motor isométrico, me lo comente. Las líneas críticas están en la función isometric_tscroll_get_screen_position de isometric_tscroll.inc y en add_iso_tile/add_iso_tile2.inc en la asignación de Z al nuevo tile. Las dos últimas creo que son las que están bien, es la asignación de isometric_tscroll_get_screen_position la que no termino de hallar.

Por lo demás, espero que lo disfruteis, que os sea útil, y que me recordéis un poquito al hacer los créditos ;D Espero vuestras sugerencias, críticas, ayudas y jamones.
Hala, como con 1001 procesos sólo va a 9 FPS, vamos a meterle 32 veces más, a ver si revienta.
(Drumpi epic moment)

FreeYourMind

Muchas gracias, como ya te comente antes por Gp32spain, cuando me ponga con el juego de plataformas Skull Man (no la proxima versión, pero otra que haré más adelante) ya mirare tus motores de Tiles a ver si me pueden facilitar lo de crear nuevos niveles para el juego.

Animo con ello, insiste que llegaras.

DCelso

Monstruos Diabólicos

"A PAck of classic GAMEs For BennuGD" en desarrollo
http://code.google.com/p/apagame4be/

Drumpi

Bueno, al final he perdido los nervios y me he salido por la tangente.
Resulta que no hay forma de que me salgan bien los cálculos de las z, y sólo falla en la función que calcula la posición de los procesos (es una operación matemática, en teoría simple, pero que por ciertos redondeos no me sale), así que he hecho lo más fácil: determinar la Z por la posición vertical de pantalla. El algoritmo es muy sencillo y funciona de fábula, pero esto hace que los cubos se comporten como figuras 2D, es una aproximación decente, perfecta si no se traspasan como si fueran fantasmas.
Intentaré perfeccionarlo, pero con más tranquilidad, que anoche tuve una pesadilla en la que me veía programando el motor y no podía parar, me desperté con un dolor de cabeza tremendo :S

Encima, se me quejan tanto Bennu como Fenix en mi GP2X y hacen cosas raras: ahora el motor funciona en Fenix y no lo hace en Bennu, para pegarse un tiro.

En fin, haré lo de los flags cíclicos y trataré de documentar el código, porque las fechas que son no llego al concurso ni matándome a trabajar.
Hala, como con 1001 procesos sólo va a 9 FPS, vamos a meterle 32 veces más, a ver si revienta.
(Drumpi epic moment)

syous

 ;D animo crack   karma up;D ;D ;D no eres el unico un un motor de tildeado isometrico ;D ;D ;D ;D
Un Saludo
EL dia que la humanidad aprenda a mirar y sentir con los ojos del alma, recuperara su humanidad
http://sodonline.net/
http://darknessage.ayudaprogramacion.net/
http://www.ayudaprogramacion.net/

Proyecto: MMORPG
Completado: 2%
Estado: En Desarrollo...

TYCO

Que sepas que me lo baje! pero aún no he podido probarlo.
Programador, Escritor/Guionista y Deportista.

Todo Modo Gráfico tiene por detrás una Línea de Comandos.

SnowCraft Remake (100%)
Rally Mortal (87%)

Windgate

Veamos, a ver si saco un respiro y lo pruebo a fondo, nunca he programado nada isométrico :P
Iván García Subero. Programador, profesor de informática, monitor de actividades culturales y presidente de TRINIT Asociación de Informáticos de Zaragoza. http://trinit.es

Windgate

Dcumpi, había sacado un ratillo para probarlo, pero veo que necesitaré importar los DLL necesarios.

¿Cómo tienes configurado Bennu en tu maldito PC para que te compile? A mí me ha dado error de entrada porque no reconocía O_READ, y es porque le falta importar el mod_file.

Supongo que habrá una forma más sencilla de hacerlo correr que ir añadiendo los DLL necesarios a medida que el compilador me va protestando...

¡¡¡Ilústrame, o partícipe de la sabiduría incólume!!!
Iván García Subero. Programador, profesor de informática, monitor de actividades culturales y presidente de TRINIT Asociación de Informáticos de Zaragoza. http://trinit.es

Drumpi

Bueno, básicamente, para hacer las pruebas tengo un bgdc.import con todos los módulos de que dispongo en la versión de bennu, y un .bat para hacer la compilación y ejecución usando las librerías, módulos y ejecutables desde otra carpeta...
Pero claro, eso es en la versión de pruebas, cuando tenga la final ya haré uno exclusivo con las libs necesarias.
Si te hace falta, yo te paso el bgdc.import y el .bat, pero básicamente lo que falta en lo que subí es que, al estar probando en Fenix (si, aun lo sigo usando, quiero que sea retrocompatible), pues no importé los módulos, así que eso es lo que falta.

Mientras, para que tengais algo con lo que trabajar en serio (porque dudo que useis los flags 1 y 2 por separado) os paso la corrección del proceso problemático. Hoy he estado de descanso y no he picado código.

function isometric_tscroll_get_screen_position (tscroll pointer ts_struct,int gsp_id)
//***************************************************************************
//  FUNCION:      isometric_tscroll_get_screen_position
//                se le pasa el ID de un proceso y este lo situa en pantalla en
//                funcion de sus coordenadas isométricas X2 e Y2
//  PARAMETROS:   ts_struct: estructura con los datos del scroll donde queremos situarnos
//                gsp_id: id del proceso a colocar en pantalla.
//***************************************************************************
private
       temp_x;
       temp_y;
       //temp_x2;
       //temp_y2;
begin
     if (exists(gsp_id))
        temp_x=gsp_id.x2-[ts_struct].camera_x;
        temp_y=gsp_id.y2-[ts_struct].camera_y;
        gsp_id.x=[ts_struct].ini_reg_x+temp_x+temp_y;
        gsp_id.y=[ts_struct].ini_reg_y+((temp_y-temp_x)/2)-gsp_id.z2;
        //cálculo de la z

        //Algoritmo de cálculo de Z super simplificado. No es realista pero se aproxima bastante.
        //hallamos la posición y del tile superior izquierdo
        temp_y=[ts_struct].tileador_posy - (  ([ts_struct].camera_y_tile - [ts_struct].camera_x_tile) /2);
        //buscamos la distancia vertical respecto a ese tile
        temp_y=gsp_id.y-temp_y;
        //y calculamos la z
        gsp_id.z=-( (temp_y/([ts_struct].tmapa[0].alto_tile/2))*2 ) - 1 -
                    (((gsp_id.z2/[ts_struct].tmapa[0].desplaz_tile)+1)*[ts_struct].n_filas) +
                    4*((gsp_id.z2/[ts_struct].tmapa[0].desplaz_tile)+1);
     end
end


Cualquier otra cosa, aqui estoy.
Hala, como con 1001 procesos sólo va a 9 FPS, vamos a meterle 32 veces más, a ver si revienta.
(Drumpi epic moment)

Drumpi

Bueno, creía que podía dar por finalizado el encodeo pero aun hay un par de cosas por pulir.
Finalmente he implementado dos métodos para el cálculo de Z: el básico es que cada capa tapa completamente a la anterior, por lo que los sprites sólo pueden estar sobre una de ellas y no entre medias (podría estar entre medias de una única capa, pero no lo he implementado así), y la otra es que los tiles más cercanos tapan a los que están más alejados, simulando unas 3D con algunas pegas (los tiles de suelo pueden tapar al sprite si están más cerca a la cámara, aunque estos estén más bajos en el mundo 3D). Estos modos se pueden seleccionar mediante uno de los flags, igual que el scroll cíclico en X y en Y.

Pero me he dado cuenta de que si se usa el método de capas no tiene mucho sentido que los tiles se desplacen hacia arriba una altura por cada capa. Estoy por dejarlo así, porque el desplazamiento por la altura puede ser complicadillo en cuanto la altura del tile no tenga una relación 1:1:1 respecto al resto de medidas (o sea, no sea un cubo, si la altura es la mitad del ancho y el largo). Se puede hacer, pero eso implica más cálculos y no se cómo se lo tomará la GP2X (lo mismo ni se nota).

La otra cosa es por el tema de las Z. Dado que el mayor problema es que el suelo, cuando el personaje se acerca a la parte inferior del tile y el pie se esconde debajo del siguiente, había pensado crear una funcioncilla que detecte ese tile problemático y le cambie la Z respecto al personaje. Aun tengo que sopesar los inconvenientes si hay dos sprites chocando con el mismo tile problemático.
Y es que el tema este de las Z es muy complejo, y no se puede implementar correctamente si no cojo todos los sprites del scroll, los ordeno por Zs y luego dibujo los tiles entre medias, por lo que para no complicar en demasía el código (y porque no corre ahora demasiada prisa implementar scrolls tileados en 3D) he decidido implementrar este método aparte (así quedarían 4 motores para esta versión 3: normal, isométrico, normal3D e isométrico3D).

Bueno, comentadme lo que os parece lo de los desplazamientos en altura y según lo que se diga me pongo ya a documentar o no.
Hala, como con 1001 procesos sólo va a 9 FPS, vamos a meterle 32 veces más, a ver si revienta.
(Drumpi epic moment)

Drumpi

Gente, necesito una respuesta o tomaré por la tangente, y el modo "cada capa cubre todo lo que hay debajo" no usará el desplazamiento por altura.
Hala, como con 1001 procesos sólo va a 9 FPS, vamos a meterle 32 veces más, a ver si revienta.
(Drumpi epic moment)

FreeYourMind

Quote from: Drumpi on October 17, 2009, 03:49:01 PM
Gente, necesito una respuesta o tomaré por la tangente, y el modo "cada capa cubre todo lo que hay debajo" no usará el desplazamiento por altura.


Ponlo como opción :)
En un fichero .ini por ejemplo :)

Windgate

Perdona por no contestar Drumpi... Sinceramente, me asustó la idea (Y también estaba ocupado estos días).

Yo soy partidario de que nos dejes una versión beta y/o una demostración, que se vea fácilmente interfaceable (Dentro de lo posible) para que podamos usarla sin tener que meternos demasiado a ver el código por dentro... Entonces podríamos empezar a hablar de errores que veamos.

Recuerda que el propio programador no es capaz de probar su propia aplicación, hay que dejársela a un usuario estúpido, que aporree el teclado, que torture tus FUNCTIONS con parámetros inverosímiles, porque sólo él descubrirá errores que tú jamás descubrirías.
Iván García Subero. Programador, profesor de informática, monitor de actividades culturales y presidente de TRINIT Asociación de Informáticos de Zaragoza. http://trinit.es

TRaFuGa

Drumpi encontré el post xD +1 de karma (aunque siga sin saber que son xDDD). Cuando tenga todo listo le echo un ojo al motor :) intentaré probar algo para ver si puedo ayudarte con algunos test jejejeje
Texto que se mueve....

syous

Quote from: TRaFuGa on October 22, 2009, 02:17:17 PM
Drumpi encontré el post xD +1 de karma (aunque siga sin saber que son xDDD). Cuando tenga todo listo le echo un ojo al motor :) intentaré probar algo para ver si puedo ayudarte con algunos test jejejeje

pues karma +1 un pulsa

Un Saludo
EL dia que la humanidad aprenda a mirar y sentir con los ojos del alma, recuperara su humanidad
http://sodonline.net/
http://darknessage.ayudaprogramacion.net/
http://www.ayudaprogramacion.net/

Proyecto: MMORPG
Completado: 2%
Estado: En Desarrollo...