Migración de juegos Fenix a Bennu - Apuntes de diferencias y resoluciones.

Started by FreeYourMind, September 30, 2009, 05:20:12 PM

Previous topic - Next topic

0 Members and 1 Guest are viewing this topic.

FreeYourMind

Quote from: FreeYourMind on October 25, 2009, 03:51:36 PM
Hay avances, poniendo:

//PutTile(46, 16, 8, 1);  // Son eliminados
 //PutTile(46, 88, 8, 1);
 PutTile(52, 46, 8, 1);
 PutTile(52, 88, 8, 1);

He conseguido pintar los tiles en pantalla, lo que esta ocurriendo es que algo me esta borrando los tiles que con posición x < 52 y < 46.
O sea, parece que si tocan las margenes x=0 y y=0 estos no se pintan...



Ya queda menos....




DCelso

Entonces no entiendo nada, no debo ver la diferencia entre lo que hace div y lo que hace bennu, ¿puedes resartármela con una imagen contra otra?

En cuanto al problema de alineación no lo dije así a la virulé, eso me pasó a mi al guardar una estructura con c y luego intentar abrirla con bennu, los datos hexadecimales que guarda c no siempre  son los mismos que guarda bennu, en c una estructura debe ser múltiplo de 16 bits si no lo es redondea hasta el número próximo múltiplo por lo que se produce una desalineación a nivel de bytes.

Por esto mismo pregunte si se había guardado el fichero lvl con un programa externo a div/bennu.
Monstruos Diabólicos

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

Drumpi

Y digo yo ¿y si vas leyendo los valores uno a uno en lugar de lanzarte a saco y cargar toda la info de golpe? ya que conoces el formato, no será complicado montarte un programita que lea de uno en uno y los escriba en pantalla. Puede que así te des cuenta de donde te falla.
Es lo que me pasó a mi hace tiempo con el motor de tiles v2 y el port UFenix: el fichero que usaba era una versión antigua.
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

Diferencia tiene que haber, lo que pasa es que no es al leer el fichero (que por cierto ya tengo el ejemplo funcional en DIV/Gemix y saca los mismos valores).

La seguire buscando... Pero es un aburrimiento total, me tiene todo harto ya.

Estaba mirando los out_region, pero aún no llegue a nada.
Lo único que tengo comprobado es que si pongo un tile que toque una margen (x <= 0 o y <=0) este no se pinta...

En la ultima imagen la puse lo mas cercano posible sin tocar estos valores, por eso se pintan, pero si te fijas en las paredes que faltaban, estas estan deslocadas hacia la derecha, incluso parte del arambre se queda por encima de la pared de arambres siguiente, para poder pintarla sino desaparece.

El suelo por ejemplo desaparece en la lateral izquierda porque parte de este tile tiene una región o margen de su gráfico con x <= 0, y desaparece todo el tile por eso.

FreeYourMind

Quote from: Drumpi on October 25, 2009, 05:27:01 PM
Y digo yo ¿y si vas leyendo los valores uno a uno en lugar de lanzarte a saco y cargar toda la info de golpe? ya que conoces el formato, no será complicado montarte un programita que lea de uno en uno y los escriba en pantalla. Puede que así te des cuenta de donde te falla.
Es lo que me pasó a mi hace tiempo con el motor de tiles v2 y el port UFenix: el fichero que usaba era una versión antigua.

Estas atrasado :) Eso ya esta, cortesia de Splinter, y el problema ya no tiene que ver con este fichero (por suerte, prefiero que sea otro, ya que volver a generar estos ficheros era casi imposible porque no se que herramienta visual utilizó para colocar las cosas en el sitio exacto).

SplinterGU

no logro entender cual es el problema? no tendras problemas de Z?
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

FreeYourMind

Problema de Z !!!!
No tiene nada que ver.

La cosa es muy sencilla, ya he repasao todo el código sólo se me ocurre que el problema sea el Map_Block_Copy...


Mi pregunta es la siguiente, si se copia un mapa a otro, este tiene que colarse totalmente sobre la area del mapa destino, o puede colocarse por ejemplo más a la izquierda y que en realidad sólo una parte coincida con el gráfico destino ??


No se si me explico, se resume a que si pongo un tile que ultrapasa el scroll visible (camara), este no se pinta, o sea, si parte del gráfico coincide con x<0 o y<0, este sencillamente, con el map_block_copy, no se pinta en el mapa destino...


Ejemplo, si pongo:

PutTile(46, 16, 8, 1);
PutTile(46, 88, 8, 1);

estes no se pintan porque ultrapasan el margen x<0 o y<0.

Si pongo esto:

PutTile(52, 46, 8, 1);
PutTile(52, 88, 8, 1);

ya se pintan, porque la region de los tiles ya no chocan con x<0 o y<0.


La condición que ocurre en la funcion PutTile, es esta:

IF (tip == 1) // FrontMap: Suelo, objetos que tapan
    Map_Block_Copy(TilesFile, FrontMap, x - graphic_info(TilesFile, graf, g_x_center), y - graphic_info(TilesFile, graf, g_y_center),
                  graf, 0, 0, graphic_info(TilesFile, graf, g_wide), graphic_info(TilesFile, graf, g_height), 0); // Bennu
  END



Os pongo el mapa vacio que cargo que será el destino, a ver si mirando o cambiando su dimensión esto se arregla...

Los 3 mapas se cargan como ya dijé en otra ocasion, á partir del mismo fichero origen:


ScrollMap = load_map("Map/Nivel.map");
FrontMap = load_map("Map/Nivel.map"); // Suelo o objetos que quedan enfrente del prota
ColMap = load_map("Map/Nivel.map"); // Paredes


la llamada se hace al principio del nivel:

BuildMap();
Start_Scroll(0, TilesFile, ScrollMap, info[2], 0, 0); // info[2]: Mapa de fondo
Front(); // Pone en el scroll el FrontMap

....


Os pongo la funcion Front() que aún no habia enseñado, que es la que define el Z que comentas (que no es un problema):

PROCESS Front() // Objectos del FrontMap
BEGIN
  ctype = c_scroll;
  graph = FrontMap;
  x = 2500; // Cuanto mayor x, más deslocado hacia la derecha se quedan estos objetos (mapa)
  y = 250;
  z = -100;
  LOOP
    FRAME;
  END
END

SplinterGU

es que no entiendo con ver las capturas que esta mal y que esta bien... estaria bueno que señales con un circulo o algo lo que vos consideras es un error...

por otro lado, si haces un map_block_copy se dibujan las areas que tienen coincidencia, que se unen, o como quieras verlo... resumiendo, puede dibujarse parcialmente... asi que entiendo que vos decis que si no entra completo, no se dibuja... pues bueno, eso no es asi, si no entra completo, se dibuja lo que entra.
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

DCelso

Exacto, a mi me pasa lo mismo, no veo en las imágenes lo que falla.
Monstruos Diabólicos

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

DCelso

Ostras, ya lo he visto.

A ver, yo necesitaría los gráficos para poder hacer una reconstrucción de los echos para ver donde falla la lógica en bennu.
Pero a priori dices que puede que el problema sea intentar hacer un map_block copy en una posición x, e y, menor a 0.
En la imagen ejemplo, si el negro es el destino, el rosa no sería válido y no se dibujaría y el verde sí sería válido y solo se dibujaría la parte que se puede.
Pues no se, tendré que hacer un mini ejemplo para probar esto, pero según splinter parece que si que se podría poner el rosa.
Monstruos Diabólicos

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

FreeYourMind

Exacto!!!!! Pero en Div por lo que veo el rosa es válido porque los pinta :)
Cuando pueda hago un mini ejemplo. Karma Up+++

DCelso

buenoo, ya he hecho un ejemplo y he visto que efectivamente bennu el rosa no lo pinta.
He realizado una solución un poco para salir del paso, un map_block_copy2, que para cuando x o y es menor a cero crea un mapa mas grande, dibuja en él y luego lo recorta.
Es bastante lenta ya que necesita de bastantes pasos intermedios. Quiza se pueda optimizar usando map_put en vez de map_block_copy.
Con las teclas w,s,a,d (arriba,abajo,izquierda,derecha respectivamente) se puede mover el bloque rosa para ver el efecto.
Con las teclas up,down,left,right se pueden mover los bloques finales.

Program map_block_copy_example;

import "mod_map"
import "mod_key"
import "mod_video"
import "mod_text"
import "mod_say"

Global
   Int id_text[4];

Begin
   set_mode(640,480,32);
   my_map(200,200 );
   my_map2(335,200);
   id_text[0]=write(0,100,20,0,"x_pink:");
   id_text[1]=write(0,100,40,0,"y_pink:");
   id_text[2]=write(0,150,130,0,"map_block_copy");
   id_text[3]=write(0,280,130,0,"map_block_copy2");
   While(!Key(_esc))
       Frame;
   End
   delete_text(id_text[0]);
   delete_text(id_text[1]);
   delete_text(id_text[2]);
   delete_text(id_text[3]);

End

Process my_map( x,y )
Private
   Int square[3];
   Int x_pink;
   Int y_pink;
Begin
   square[0] = new_map(20,20,32);
   map_clear(0,square[0],RGB(255,0,255));
   square[1] = new_map(20,20,32);
   map_clear(0,square[1],RGB(0,255,0));
   square[2] = new_map(100,100,32);
   map_clear(0,square[2],RGB(255,255,255));
   graph = new_map(100,100,32);
   map_block_copy (0,graph,0,0,square[2],0,0,100,100,0);
   map_block_copy (0,graph,90,10,square[1],0,0,20,20,0);
   map_block_copy (0,graph,x_pink,y_pink,square[0],0,0,20,20,0);
   write_var(0,160,20,0,x_pink);
   write_var(0,160,40,0,y_pink);
   While(!Key(_esc))
       if (key(_up)) y--;end
       if (key(_down)) y++;end
       if (key(_left)) x--;end
       if (key(_right)) x++;end
       if (key(_w) OR key(_a) OR key(_s) OR key(_d))
           if (key(_w)) y_pink--; End
           if (key(_s)) y_pink++; End
           if (key(_a)) x_pink--; End
           if (key(_d)) x_pink++; End
           map_block_copy (0,graph,0,0,square[2],0,0,100,100,0);
           map_block_copy (0,graph,90,10,square[1],0,0,20,20,0);
           map_block_copy (0,graph,x_pink,y_pink,square[0],0,0,20,20,0);
       End
       Frame;
   End
   unload_map(0,square[0]);
   unload_map(0,square[1]);
   unload_map(0,square[2]);
   unload_map(0,graph);
End

Process my_map2( x,y )
Private
   Int square[3];
   Int x_pink;
   Int y_pink;
Begin
   square[0] = new_map(20,20,32);
   map_clear(0,square[0],RGB(255,0,255));
   square[1] = new_map(20,20,32);
   map_clear(0,square[1],RGB(0,255,0));
   square[2] = new_map(100,100,32);
   map_clear(0,square[2],RGB(255,255,255));
   graph = new_map(100,100,32);
   map_block_copy2 (0,graph,0,0,square[2],0,0,100,100,0);
   map_block_copy2 (0,graph,90,10,square[1],0,0,20,20,0);
   map_block_copy2 (0,graph,x_pink,y_pink,square[0],0,0,20,20,0);
   write_var(0,160,20,0,x_pink);
   write_var(0,160,40,0,y_pink);
   While(!Key(_esc))
       if (key(_up)) y--;end
       if (key(_down)) y++;end
       if (key(_left)) x--;end
       if (key(_right)) x++;end
       if (key(_w) OR key(_a) OR key(_s) OR key(_d))
           if (key(_w)) y_pink--; End
           if (key(_s)) y_pink++; End
           if (key(_a)) x_pink--; End
           if (key(_d)) x_pink++; End
           map_block_copy2 (0,graph,0,0,square[2],0,0,100,100,0);
           map_block_copy2 (0,graph,90,10,square[1],0,0,20,20,0);
           map_block_copy2 (0,graph,x_pink,y_pink,square[0],0,0,20,20,0);
       End
       Frame;
   End
   unload_map(0,square[0]);
   unload_map(0,square[1]);
   unload_map(0,square[2]);
   unload_map(0,graph);
End

function map_block_copy2(INT fileID , INT destinationGraphID , INT destinationX , INT destinationY , INT originGraphID , INT x , INT y , INT width , INT height, INT blitflags)
Private
   dest_width;
   dest_height;
   dest_graph;
   orig_width;
   orig_height;
   orig_graph;
   x_correction;
   y_correction;
Begin
   if ( destinationX>=0 AND destinationY>=0 )
       return map_block_copy( fileID ,  destinationGraphID ,  destinationX ,  destinationY ,  originGraphID ,  x ,  y ,  width ,  height,  blitflags);
   End

   dest_width = graphic_info(fileID,destinationGraphID,G_WIDTH);
   dest_height = graphic_info(fileID,destinationGraphID,G_HEIGHT);
   dest_graph = new_map(dest_width,dest_height,32);
   map_xputnp(0,dest_graph,fileId,destinationGraphID,dest_width/2,dest_height/2,0,100,100,blitflags);

   orig_width = graphic_info(fileID,originGraphID,G_WIDTH);
   orig_height = graphic_info(fileID,originGraphID,G_HEIGHT);
   orig_graph = new_map(orig_width,orig_height,32);
   map_xputnp(0,orig_graph,fileId,originGraphID,orig_width/2,orig_height/2,0,100,100,blitflags);
 
   if (destinationX < 0)
       dest_width -= destinationX;
       x_correction = -destinationX;
   End    
   if (destinationY < 0)
       dest_height -= destinationY;
       y_correction = -destinationY;
   End

   graph = new_map(dest_width,dest_height,32);
   map_block_copy(0,graph,x_correction,y_correction,dest_graph,0,0,dest_width,dest_height,blitflags);
   map_block_copy(0,graph,x_correction+destinationX,y_correction+destinationY,orig_graph,0,0,orig_width,orig_height,blitflags);
   map_block_copy(0,dest_graph,0,0,graph,x_correction,y_correction,dest_width,dest_height,blitflags);
   map_xputnp(fileId,destinationGraphID,0,dest_graph,(dest_width-x_correction)/2,(dest_height-y_correction)/2,0,100,100,blitflags);
   unload_map(0,dest_graph);
   unload_map(0,orig_graph);
   unload_map(0,graph);
   return;
End

Monstruos Diabólicos

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

splinter_work

caramba que para diagnosticar son tan buenos como yo hablando de futbol... menos mal que probe el ejemplo... cuando dicen el rosa no pinta, pareciera que hay un problema con el color rosa, cosa que no tiene que ver con el error...

ya esta, el error es que si se quiere poner un grafico en una coordenada negativa dentro del destino, la funcion no dibuja, aun cuando estos se superpongan... ya se donde esta el error...

gracias...

splinter_work

ya tengo la correccion hecha y probada... luego subo el fix... donde estoy ahora no tengo accceso...

saludos y gracias.

FreeYourMind

La pregunta es, lo vas a poner compatible ???

Me algeraria muchissimo y creo que a más gente que pase por lo mismo.

Seria complicado tener que crear gráficos más peques para tapar estos agujeros, el del principo no es muy dificil, pero a lo gargo del nivel los que coinciden con y<0 son un problema.

Tambien es bueno que pinte fuera, porque por ejemplo en el juego pinta una pared fuera de la area visible para que skull no se caiga por la izquierda, aunque en este caso seria facil resolverlo, hacer que skull no se moviera o saltará para x < 0.

Como sabes las posiciones las tengo en el fichero externo que fue creado con un editor de tiles, con lo que tener que corregir esto creando un visualizador del mapa para encontrar las posiciones que fallan y corregirlas, teniendo en cuanta que tambien son 9 niveles seria un autentico caos....

Encima que va ser mi primer juego multiplataforma con el mismo dcb, y segun la maquina en que se juega va tener caracteristicas distintas :)

Por ahora contemplo Windows, Wiz, y si puedo volver a desenpolvorar alguna distribución de Linux Live CD, tambien Linux.

Para Linux como ejecutais o donde instalais los juegos ?
Es algo parecido a la ruta de los ficheros .gpe de Wiz (ya que usa Linux) ??

Muchas grácias a los 2, realmente os mereceis de nuevo Karma Uppps, me ahorraste el ejemplo DCelso, ya que llego a casa echo polvo del curro, eso se agradece :)