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.

DCelso

FreeYourMind me interesaría muy mucho ver el ejemplo de div del que copiaste la idea, ya que sigo sin entender la utilidad del XOR y oye no está de más aprender algo nuevo de esta función. Todo lo que habeis dicho me sigue pareciendo absurdo, sigo sin ver el resultado de la ejecución, estoy deacuerdo con splinter que de una manera u otra eso no va bien ni por asomo ni en DIV,FENIX,BENNU si hay colisión multiple. solo funciona si hay una única colisión. Quizás ese sea el misterio que viene en el ejemplo de DIV, algo como supongamos que no hay colisiones múltiples en nuestro ejemplo o algo así.
De todas formas, si no recuerdo mal, en DIV los identificadores de los procesos eran siempre números impares, a lo mejor esto, mezclado con un XOR hace que en un id puedas llevar en un mismo id más de un proceso identificado.

Free, ¿serías tan amable de buscar el juego DIV del que copiaste la lógica y compartinos el fuente y los recursos?
Gracias de antemano.
Monstruos Diabólicos

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

FreeYourMind

No tiene nada de mas, es el ejemplo es el que puse despues hay un case, te lo completo para que veas, aunque yo ahora utilizo el OR, pero es lo mismo, lo que hace es que al colidir pilla el id del grafico colidido, es muyyyy dificil que pille 2 en el mismo momento, pero me imagino ya que esto de los numeros tiene siempre una orden, que si pilla 2 internamente habra siempre uno primero que otro.

Te pongo el original:

Process disparo(x,y,angle)
Begin

graph=graf_disp;
  Repeat

If(id_colision=collision(Type enemigo1) XOR collision(Type enemigo2) XOR collision(Type enemigo3))

Switch(graf_disp); // gráfico de disparo
          Case 1:
              id_colision.vida-=5; // vida es una variable comun en cada proceso enemigo
              If(id_colision.vida > 0) explosion_del_tiro(x, y); End
              Break;
             End
          End
          Case 2:
              id_colision.vida -= 10;
              If(id_colision.vida > 0) explosion_del_tiro(x, y); End
              Break;
             End
          End

      advance(10);
      Frame;
  Until(y<0);
End

ya esta con esto le quita energia al id pillado, y desaparece el tiro con una pequeña explosion de impacto :)


------------------------------


Ahora tengo un nuevo problema, parece que es con el advance() del proceso disparo,
que funciona bien en DIV y Fenix pero no en Bennu:

El tiro se desplaza en el eje Y pero no lo hace en el eje X....

Ejemplo:

Creo 3 tiros:

disparo(x, y, 90000); // Hacia arriba
disparo(x - 6, y, 95000); // Hacia Arriba, Izquierda
disparo(x + 6, y, 85000); // Hacia Arriba, derecha


como se puede ver en el proceso disparo Process disparo(x,y,angle), con advance(10) el tiro se desloca en el eje Y (hacia arriba)
y en el eje X (un tiro hacia la derecha y otro hacia la izquierda), esto funciona en DIV y en Fenix, pero en Bennu, solo se esta moviendo
en el eje Y, no se mueve en el eje X !!!

Soluciones ?¿

Gracias.



Drumpi

Sin ver el proceso disparo es posible que sea cosa del resolution o que le pases mal el ángulo a advance.
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

El proceso de disparo lo tienes tambien en el mensaje, esta recortado como ejemplo, pero lo relacionado con el movimiento del tiro esta todo ahí.

DCelso

¿Podrías pasarme el ejemplo completo original de DIV, con recursos y todo?
quisera probarlo, gracis de antemano.
Monstruos Diabólicos

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

Drumpi

Ups, perdón, no me acordaba.
Bueno, he visto el fallo: suponiendo un desplazamiento de 95º y un desplazamiento de 10 pixels, tu desplazamiento horizontal por cada pixel sería de:
cos(95º)*10=-0,87155742747658173558064270837474
O sea, que en cada avance se mueve aproximadamente 0.8 píxels, que al redondear a entero se queda en 0 pixels.

Puedes crear un float que vaya incrementándose con este valor, pero lo recomendable en tu caso es que uses al menos resolution=10 y reescales a mano todas las constantes de movimiento multiplicando por ese valor (por ejemplo, el advance ahora sería advance(100), y nada más entrar hacer x*=10 e y*=10)
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

Jo muy buena tu observación Drumpi, si tuviera más carmas que el único que tengo te lo regalaba :)

Pero me temo que no sea ese el problema, el 10 lo puse en el ejemplo, en realidad hacia un advance(16); en el original y estoy haciendo un advance(8); en el port, ya que tiene mitad de la resolución :)

Y tampoco funciona ninguna de las dos en el eje X.

Como funciona eso de float ?, se pueden poner posiciones con float ?? por ejemplo es posible poner un gráfico en la posición x = 3,5 ??
Ese es otro problema al reducir todas las coordenadas cuando se hace un port para mitad de la resolución, con las posiciones que son impares en el original.
Me moskea que con la función de rescalado de resolucion interna lo haga pero a pelo no sepa si es posible ....

Otra cosa, dices que redondear 0.8 se queda en 0, pero no se queda en 1 ?? yo estoy teniendo en cuenta que por ejemplo si es mayor que 1,5 lo redondea a 2, como se hace en las matematicas en general, un redondeo para abajo no tiene sentido !!!

Los valores de posición y movimiento que me dan valores con comas, por ejemplo 2,5, las estoy arredondando manualmente para el valor siguiente, o sea, en este caso seria valor 3.

FreeYourMind

Quote from: DCelso on October 01, 2009, 01:20:01 PM
¿Podrías pasarme el ejemplo completo original de DIV, con recursos y todo?
quisera probarlo, gracis de antemano.


El ejemplo esta completo en lo que te pongo, solo tiene mas enemigos y cases. El ejemplo funcionando ya lo veras cuando saque el port en 2, 3 dias :) Recortarte ahora el ejemplo del juego y ponerte una demo seria laborioso, pero vamos el resultado ya lo veras en el juego.

Si lo quieres ver ahora mismo, y con XOR's, ya que se me olvidaba, en el port pongo OR's (pero que funciona igual), bajate la versión Windows de mi página:

www.gecasoft.no.sapo.pt

Saludos.

P.S. El ejemplo original no lo tengo y ni se ya de donde era, eso fue hace 10 años, ya ni se donde he estado ayer ;)

FreeYourMind

He probado con disparo(x + 3, y, 50000); y si que tambien se desloca en el eje X, pero con este valor hace una perfecta diagonal, y yo quiero hacer solo un ligero desvio, como en el original.

Pero con esto, es lo que comentas Drumpi, solo puede ser originado por redondeos de Bennu, Splinter que solución tiene esto ??
Porque en Div y Fenix esto iba bien, que cambios hiciste en la funcion advance ?? Que tengo que hacer ?

Gracias.

FreeYourMind

Haciendo más pruebas , la verdad yo flipo en colores con esto, sólo me fallan 2 casos, los que habia puesto:

                disparo(x - 3, y, 95000);
                disparo(x + 3, y, 85000);

                disparo(x - 3, y, 100000);
                disparo(x + 3, y, 80000);
                disparo(x - 3, y, 105000);
                disparo(x + 3, y, 75000);
                disparo(x - 3, y, 110000);
                disparo(x + 3, y, 70000);
                disparo(x - 3, y, 115000);
                disparo(x + 3, y, 65000);


Esto crea 10 ramas de tiros, cada vez mas distantes del centro que las crea, hacia la derecha y izquierda.
Y sólo los 2 primeros no se desplazan en el eje del x.

DCelso

Ya he encontrado el error, te sobra un punto y coma al final del switch, quitalo, pero esto no es el problema, el problema es que también te sobra un end al final del primer case.
He hecho un ejemplo con mi dragon, he puesto tus 10 disparos, he hecho que vaya más lento para poder contarlos y salen los 10 disparos y cada uno va para su lado. Me ha encantado el resultado, queda muy chulo :D.
Id colision debería de ser una variable local o privada para evitar problemas de ámbito, no se si la tendrás como global, cámbiala en ese caso.

Process disparo(x,y,angle)
local
  id_colision;
Begin
  graph=graf_disp;
  Repeat
     If(id_colision=collision(Type enemigo1) XOR collision(Type enemigo2) XOR collision(Type enemigo3))

       Switch(graf_disp); // gráfico de disparo
          Case 1:
              //id_colision.vida-=5; // vida es una variable comun en cada proceso enemigo
              //If(id_colision.vida > 0) explosion_del_tiro(x, y); End
              Break;
          End
          Case 2:
              //id_colision.vida -= 10;
              //If(id_colision.vida > 0) explosion_del_tiro(x, y); End
              Break;
          end
      End
     End

     advance(5);
     Frame(500);
  Until(y<0);
End
Monstruos Diabólicos

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

DCelso

Monstruos Diabólicos

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

FreeYourMind

Perdona pero es código de todo el proceso que te puse ya sabia que podria faltarle un end, o algo, lo he contruido por partes porque una parte era para hablar del xor y la otra del advance ;)

Perdonar si llevasteis el ejemplo a la letra haciendo copy / paste para probarlo.

Sobre lo del advance() sigo con el problema de que para

disparo(x - 3, y, 95000);
disparo(x + 3, y, 85000);

no se mueve en el eje X.

Por favor compruebalo en tu ejemplo, ya que lo has montado, y dime si tambien te ocurre :)

Gracias.


DCelso

Si, corre bien. Pero he detectado un bug, creo en advance, he acotado el problema y voy a informar de ello.
Este bug no afecta a tu código, es decir, que va bien, pero mejor es que se localize y elimine :D.

Vas a tener que revisar mi ejemplo para ver en que se diferencia del tuyo porque en este si va, si pones tu codigo completo quizas podamos dar con el error en cuestión.
Monstruos Diabólicos

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

FreeYourMind

Oye, pero tu estas probando en Div no ?? :)

Porque el mio tb funciona bien en div o fenix, el problema del advance es solo en Bennu y solo para esos 2 angulos en concreto.

Tu ejemplo solo puede funcionar en div o fenix, porque el if que has construido (que es igual al mio original) se tiene que modificar para para que funcione en Bennu, como ya comentamos en este post antes:


IF((id_colision = collision(Type enemigo1)) OR (id_colision = collision(Type enemigo2)) OR (id_colision = collision(Type enemigo3))


Edito: Yo tambien la tengo declarada como local pero al principio del programa. Y como te decia, de la forma que lo tienes tambien compila en Bennu pero al chocar me daba error de 'Process 0,1 not active'