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.


Drumpi

Pues quizás deberías haber escrito sl[0].x en lugar de &sl[0].x, porque así parece que te está pasando la dirección de memoria en lugar del contenido ¿no?
No se, tengo sueño, cerebro apagado.
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

sl[0].x hace BOOOOOOOOOOOMMMMMMMMMM CRASSSSSSSSSSSSHHHHH BAAAAAAAAAAAAANNNNNNNNNGGGGGGGG
Petete Bennu...
Y por cierto mira los otros valores, crees que son direcciones de memória ??? a mi no....

Despues de ver casos como el sizeof de DIV ya no entiendo nada....

FreeYourMind

Más pruebas, ya se lo que hace crash:

Con poner sólo Write(0, 10, 10, 0, sl[0].x); frame;

obtengo sl[0].x = 2712

poniendo sólo Write_INT(0, 10, 20, 0, sl[0].y); frame;

obtengo el crash!!!!!!!! de Bennu

o sea, tenemos el resumen:

sl[0].x = 2712
&sl[0].x = 0108071C
sl[0].y = crash
&sl[0].y = 140
sl[0].graf = crash
&sl[0].graf = 6
sl[0].tipo = crash
&sl[0].tipo = 0

A partir del registro 2, el comportamiento es distinto:

sl[1].x = crash
&sl[1].x = 669
sl[1].y = crash
&sl[1].y = 376
...


Conclusión,
los valores de &sl[0].x y sl[0].x exclusivamente para la primera posición tienen valores supuestamente correctos:

sl[0].x = 2712 // valor de x
&sl[0].x = 0108071C // posición de memória

lo que ya no ocurre para

sl[1].x = Petete al leer valor, y deberia sel la posición de memória, aparte de poder leerse, como ocurre para el primer registro
&sl[1].x = // Valor de x (deberia ser de la posición de memória)
...

Esto huele a bug...







DCelso

En algo la cagas, puede que estés sobrepasando el número de writes en pantalla o algo así.
La forma correcta de usar write es guardando lo que devuelve en un id y borrándolo después de cada frame.
Para mostrar el valor cambiante de una variable se usa write_var. Prueba este ejemplo donde se ven las diferencias  de uso y que va perfectamente si hacer crash como dices tu.
Puedes mover el cuadrado rosa con las flechas.

import "mod_key"
import "mod_video"
import "mod_text"
import "mod_wm"
import "mod_map"
import "mod_draw"


Global
  STRUCT sl[2000]
    x, y, graf, tipo;
  END
  id_writes[4];
  id_write_estatico;
End
Begin
  set_mode (640,480,32);
  cuadrado();
  sl[0].x=100;
  sl[0].y=100;
  sl[0].graf=map_new(30,30,32);
  map_clear(0,sl[0].graf,RGB(255,0,255));

  id_write_estatico= write(0,200,20,0,sl[0].x); // muestra unicamente el valor inicial
  write_Var(0,150,20,0,sl[0].x);// muestra en cada frame el valor actual
  write_var(0,150,60,0,sl[0].y);

  while (!key(_esc) )
     id_writes[0]= write(0,20,20,0,sl[0].x); // muestra el valor actual
     id_writes[1]= write(0,60,20,0,&sl[0].x);
     id_writes[2]= write(0,20,60,0,sl[0].y);
     id_writes[3]= write(0,60,60,0,&sl[0].y);
     frame;
     delete_text(id_writes[0]);  // borramos el tecto de este identificador
     delete_text(id_writes[1]);
     delete_text(id_writes[2]);
     delete_text(id_writes[3]);
  end
  delete_text(id_write_estatico);
  unload_map(0,sl[0].graf);
 
End

Process cuadrado()
Begin
  control_cuadrado();
  while (!key(_esc) )
     x=sl[0].x;
     y=sl[0].y;
     graph=sl[0].graf;
     frame;
  end;
End

Process control_cuadrado()
Begin
  while (!key(_esc) )
     if(key(_up))
      sl[0].y--;
     end
     if(key(_down))
      sl[0].y++;
     end
     if(key(_right))
      sl[0].x++;
     end
     if(key(_left))
      sl[0].x--;
     end
     frame;
  end;
End
Monstruos Diabólicos

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

FreeYourMind

Gracias.

He adaptado tus writes a mi sl[]:


id_write_estatico= write(0,10,20,0,sl[0].x); // muestra unicamente el valor inicial
      write_Var(0,10,30,0,sl[0].x);// muestra en cada frame el valor actual
      write_var(0,10,40,0,sl[0].y);

  while (!key(_esc) )
     id_writes[0]= write(0,10,50,0,sl[0].x); // muestra el valor actual
     id_writes[1]= write(0,10,60,0,&sl[0].x);
     id_writes[2]= write(0,10,70,0,sl[0].y);
     id_writes[3]= write(0,10,80,0,&sl[0].y);
     frame;
     delete_text(id_writes[0]);  // borramos el tecto de este identificador
     delete_text(id_writes[1]);
     delete_text(id_writes[2]);
     delete_text(id_writes[3]);
  end


Output (en la misma orden de arriba):

               sl[0].x = 2712
     sl[0].x = 2712
     sl[0].y = 140
     sl[0].x = 2712
     &sl[0].x = 0112070C
     sl[0].y = 140
     &sl[0].y = 01120720

Como se puede ver ya se recupera correctamente tantos los valores de x,y como su posición en memória.

O sea, como se puede ver a lo largo de varios valores que ya imprimi antes, el valor de x es creciente a medida que recorremos sl[], ya que va pintando el mapa y lógicamente lo hace desde el principio hasta el final (de izquierda a derecha).

Tomando esto como cierto, pues sl[0].x = 2712 es un x muy elevado, tendre que imprimir unos 20 primeros a ver realmente cual su orden (a ver si hay algunos iniciales que tengan la x muy grande, ya que al principio hay varios tiles que no se pintan por lo menos al principio del mapa).

Si esto es cierto, algo mal se le de este fichero externo, porque en Div se pinta el mapa bien, otra vez deduzco que por ejemplo estes primeros valores del x sean distintos ejecutado en DIV.
He intentado compilar en DIV2, pero no consigo, ya que el DosBox se queda sin memória, encima que es código de DIV1 y no funciona totalmente en DIV2, sin hacer algunos ajustes...

FreeYourMind

Bueno, he perdido algun tiempo a registrar varios valores de x, aqui el resultado:

sl[0].x = 2712
sl[1].x = 669
sl[2].x = 18
sl[3].x = 18
sl[4].x = 18
sl[5].x = 17
sl[6].x = 82
sl[7].x = 82
sl[8].x = 82
sl[9].x = 82
sl[10].x = 146
sl[11].x = 146
sl[12].x = 146
sl[13].x = 146
sl[14].x = 210
sl[15].x = 210
sl[16].x = 210
sl[17].x = 210
sl[18].x = 274
sl[19].x = 274
sl[20].x = 274
sl[21].x = 274
sl[22].x = 1341
sl[23].x = 1162
sl[24].x = 625
sl[25].x = 676
sl[26].x = 727
sl[27].x = 778
sl[28].x = 643
sl[29].x = 694
sl[30].x = 670
sl[31].x = 979
sl[32].x = 937
sl[33].x = 895
sl[34].x = 941
sl[35].x = 1577
sl[36].x = 1577
sl[37].x = 1577
sl[38].x = 1577
sl[39].x = 1641
sl[100].x = 3798
sl[200].x = 4913
sl[300].x = 279
sl[400].x = 1589
sl[800].x = 2324


Como se puede ver, hay valores de x que no cuadran en el orden creciente de x, posiblemente sea donde se notan errores gráficos despues al ver el mapa pintado....


Voy a intentar hacer una pequeña demo en DIV que sólo lea el fichero e imprima los valores leidos....

Os pongo tambien el fichero por si quereis hacer pruebas.


Gracias.

FreeYourMind

Estoy desesperao, no se como obtenerlos en DIV1 (incluso Gemix que tiene un output algo parecido a DIV), que verguenza....

Os pongo el .prg de prueba, uno para Bennu que funciona bien (con los valores ya comentados), y otro para DIV, el cual no me pilla bien los valores, sólo cosas raras, este ultimo de DIV1 si lo arreglais para que funcione en DIV os quedo agradecidos.

Pongo tambien pantallas para los que no tengan DIV1 con el resultado que sale, una con el ejemplo de Bennu directamente probado en DIV1/Gemix y otro con el cambio de sl a &sl en sus llamadas (probe abrir con OFFSET sl, en DIV1 pero es igual).


SplinterGU

bien... efectivamente hay un bug... en algo estas fallando...

repito... ejemplos aislados... y simples...

**** save ****

import "mod_say";
import "mod_file";

global
 STRUCT sl[2000]
   x, y, graf, tipo;
 END

private
   i;

begin

   for(i=0;i<=2000;i++)
       sl[i].x = i;
       sl[i].y = 10000+i;
       sl[i].graf = 100000+i;
       sl[i].tipo = -i;
   end

   for(i=0;i<=2000;i++)
       say ( "i="+i+" x="+sl[i].x+" y="+sl[i].y+" graf="+sl[i].graf+" tipo="+sl[i].tipo);
   end

   save( "mylevel.dat", sl );

end


**** load ****

import "mod_say";
import "mod_file";

global
 STRUCT sl[2000]
   x, y, graf, tipo;
 END

private
   i;

begin

   load( "mylevel.dat", sl );

   for(i=0;i<=2000;i++)
       say ( "i="+i+" x="+sl[i].x+" y="+sl[i].y+" graf="+sl[i].graf+" tipo="+sl[i].tipo);
   end


end


**** load + write_int + write ****

import "mod_say";
import "mod_file";
import "mod_video";
import "mod_text";
import "mod_key";

global
  STRUCT sl[2000]
    x, y, graf, tipo;
  END

private
    i;

begin

    load( "mylevel.dat", sl );

    for(i=0;i<=2000;i++)
        say ( "i="+i+" x="+sl[i].x+" y="+sl[i].y+" graf="+sl[i].graf+" tipo="+sl[i].tipo);
    end

    set_mode(1024,768);

    for(i=0;i<=70;i++)
        write_int( 0, 0, 10+i*10, 0, &sl[i].x );
    end

    while(!key(_ESC)) frame; end
    while(key(_ESC)) frame; end

    delete_text(all_text);

    for(i=0;i<=70;i++)
        write( 0, 0, 10+i*10, 0, sl[i].y );
    end

    while(!key(_ESC)) frame; end

end

Download Lastest BennuGD Release: http://www.bennugd.org/node/2

SplinterGU

bien, lamento informarte que esos valores son los que tiene tu lvl... es tan simple como tomar un editor hexadecimal y hacer los calculos pertinentes...

nunca hay que asumir nada... no se porque asumiste que las x tienen que ser crecientes... no asumas, chequea los datos... has pruebas simples...
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

FreeYourMind

Muchas grácias Splinter, voy a probar tu ejemplo a ver que dice el say.
Igual con el save ya podre salvar uno con valores corregidos aunque me parece que va ser un currazo, ya que no puedo estar poniendo objectos (x,y) a ciegas en un mapa...
Si diera con el editor de tiles que el utilizo, es que no me responde al email...

A ver si conoceis estos editores y los más utilizados para juegos C.

DCelso

Vamos a ver, entonces el .lvl no está hecho con div sino con un editor de niveles externo.
Entonces puede ser problema de alineación. Lo que no comprendo es que en div vaya y en bennu no.
Quizas puedas hacer un programa en div que lea el .lvl, que se supone que lo hace bien, y luego lo guarde otra vez a ver si esta vez lo guarda bien.
Si no va esto, y suponiendo siempre que div abre bien el .lvl, puedes hacer otra cosa, un programa en div que abra el .lvl y luego posteriormente recorres la estructura y guardas en texto plano (.txt) los datos uno a uno por línea sabiendo que cada tres líneas tienes un dato. algo así como que si tienes esto:
sl[0].x=1;
sl[0].y=17;
sl[0].graph=6;
sl[1].x=44;
sl[2].y=15;
sl[3].graph=7;

Tu guardas string a string
1
17
6
44
15
7
..
..

Luego ya este formato puedes leerlo exactamente igual en bennu usando un split.
Monstruos Diabólicos

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

SplinterGU

dcelso... no hay problema de alineacion... abre el archivo y mira... ya le dimos demasiados posts a este tema como para seguir suponiendo...
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

FreeYourMind

Amigos, el fichero esta perfecto y lo le bien.
El error no es del fichero:


Ya tengo resultados, he aqui una analisis paso a paso que he echo:


Filtrando por los de tipo = 1 (suelo del mapa)

y por grap=16

hay 37 resultados:

rectangulo gris del suelo --> Gráfico (71 largura x 35 altura)


y por graf=62 hay unos 70

cuadrado gris del suelo --> Gráfico (100 largura x 100 altura)


Por suerte en la foto tengo una referencia muy buena, que son 3
paredes transparentes (ventanas de arambres que tapan el prota),
en bennu la primera de arriba no sale, sólo tengo que filtrar por x < 500
por ejemplo.

mirando cuantos encuentra para:

tipo=1, graf=8


Perfecto ya he descubierto que el bug no esta en este fichero, porque tengo
el siguiente resultado:

i=674, x=46, y=88, graf=8, tipo=1 // Ventana de abajo (forma parte de la primera, skull esta dentro de ella :))
i=675, x=46, y=16, graf=8, tipo=1 // Ventana de arriba (forma parte de la primera)
i=676, x=146, y=88, graf=8, tipo=1 // tercera ventana
i=677, x=246, y=88, graf=8, tipo=1 // cuarta ventana


Todo cuadra a la perfección, son las 4 que se pintan en el original DIV
y en Bennu las 2 situadas en la posición:

i=674, x=46, y=88, graf=8, tipo=1 // Ventana de abajo (forma parte de la primera, skull esta dentro de ella :))
i=675, x=46, y=16, graf=8, tipo=1 // Ventana de arriba (forma parte de la primera)

no salen como se puede recordar en la foto adjunta.




Otra cosa que no habia comentado es que la parte de arriba del scroll
tambien esta deslocado algunos puntos hacia abajo, igual el problema
es de definición de scroll.

Por lo menos se cierra el tema del fichero externo, es de otra cosa.


Como mola debugear ;)

FreeYourMind

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.



Ya queda menos....