problemas usando advance

Started by DCelso, October 01, 2009, 05:55:22 PM

Previous topic - Next topic

0 Members and 1 Guest are viewing this topic.

DCelso

Hola, resolviendo una duda de Free, me he encontrado con un error en la función advance.
Resulta que el ejemplo que viene a continuación debe lanzar 10 disparos pero en vez de lanzar 10 lanza un número distinto dependiendo del valor pasado a advance, es algo raro, pero a las pruebas me remito.

import "mod_key"
import "mod_proc"
import "mod_map"
import "mod_video"
import "mod_grproc"
global
 int graf_disp;
Begin
   set_mode(320,240,32);
   graf_disp=load_png("recursos/bolafuego.png");
   dragon();
   Repeat
       frame;
   Until(key(_ESC))
End

Process dragon()
Begin
   x=160;
   y=200;
   graph = load_png("recursos/dragon1.png");
   while(!key(_esc))
       if (key(_d))
               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);
               while(key(_d)) frame; end
       end
       frame;
   End
   unload_map(0,graph);
End


Process disparo(x,y,angle)
private
 id_colision;
Begin
 size=25;
 graph=graf_disp;
 Repeat
    advance(7);
    Frame(500);
 Until(y<0);
End

He probado
advance(1)  ->  se ve una imagen pero no se mueve
advance(2)  ->  salen 2 disparos
advance(7)  ->  salen 6
advance(8)  ->  salen 8
advance(10)  -> O mas de 10,  salen los 10 disparos.
Si pones entre las llamadas a los 10 disparos un frame (200) ya no pasa este efecto.
Así que el problema está en ejecutar mas de una vez advance en el mismo frame, creo.
¿Alguien sabe el motivo?

Monstruos Diabólicos

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

FreeYourMind

Yo no tengo problemas, lanza solo los que creo, pero uso frame; no he probado con distintos valores de frame;

Pero volviendo al tema anterior del otro post ya que tb tiene que ver con advance.

En primer lugar decirte que lo del xor te funciona en Bennu porque no has puesto enemigos :) si colisionas con uno te va petar por lo que dije, tienes que cambiar el IF en Bennu.


En segundo, hablando del advance(), yo en tu demo me parece que tambien tienes el mismo problema para los angulos

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


que no se mueven en el eje x, no puedes probar con graficos que sean meros pixels para que lo cumpruebes ??

En mi ejemplo los tiros son pequeños, y noto el problema, pero con tus graficos tan grandes a la velocidad que pones no me entero :)

FreeYourMind

Sobre tu pregunta del frame, mirando tu ejemplo, la linea:

while(key(_d)) frame; end

a mi me sobra, yo no pongo frame cuando llamo los disparos,
y tampoco pongo

frame(800);

entre disparos.


Así que no me da el error ese.

Probando tu ejemplo sin estas 2 cosas:

Se puede apreciar mejor que tambien tienes problemas con los 2 angulos esos, y que no salen de encima del tiro del medio, o sea, no se mueven en el eje X.

splinter_work

por lo que veo no es un bug...

que pasa si en vez de size 25, pones size 100 o no pones nada?

DCelso

Free, este es otro ejemplo, no lo confundas ( no esta el frame 800 que dices), confundiste a splinter.
El error lo he acotado,Splinter si pruebas el ejemplo adjunto verás que da igual el tamaño del sprite, aqui  (en este ejemplo) el problema radica en que no se ven los 10 disparos que lanzo con advance inferior a 10.
En cambio con advances superiores va perfecto.
Monstruos Diabólicos

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

Erkosone

No entiendo porque lo haces asi:
-------------------------------
Repeat
     advance(7);
     Frame(500);                En 5 segundos avanzo 7 pixels.
  Until(y<0);

Yo pondria mejor:
-----------------
Repeat
     advance(1);
     Frame;                      En 1 segundo avanzo 1 pixel, osea que en 5 segundos avanzare 5 pixels, si es poco para ti pues  "advance(2)"
  Until(y<0);

Siempre que he jugado con FRAME he tenido que repasar el codigo mil veces por errores "errores mios no contemplados" ya que ocurrian cosas extrañas que no llegava a entender..
Al final opte por dejar a FRAME tranquilo y crear los retardos por otro lado.
Cierto es que esto me pasava en div2 y Gemix, pero vaya, supongo que tal vez pueda ser tu caso.
Si no es asi disculpa por el royo que acabo de escrivir.

Piensa que si pones Frame(500) durante 5 segundos el grafico no se va a mover y posiblemente llames a los disparos correctamente, lo que estan unos encima de otros y no los vas a ver..

splinter_work

Quote from: DCelso on October 01, 2009, 06:47:17 PM
Free, este es otro ejemplo, no lo confundas ( no esta el frame 800 que dices), confundiste a splinter.
El error lo he acotado,Splinter si pruebas el ejemplo adjunto verás que da igual el tamaño del sprite, aqui  (en este ejemplo) el problema radica en que no se ven los 10 disparos que lanzo con advance inferior a 10.
En cambio con advances superiores va perfecto.

no estan o estan encimados?

eso puede ser por la presicion como ya dije, si usas advance, conviene usar resolution...

splinter_work

como sea, no tiene nada que ver con frame...

al hacer frame o no, estas cambiando la forma y orden en que se ejecutan los procesos... pero el advance no tiene nada que ver...

DCelso

Ya veo, tiene su lógica, puede que advance (1) devuelva la misma x e y por eso el proceso parece que no se mueve. Voy a probar.
Monstruos Diabólicos

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

FreeYourMind

Tienes razón DCelso, me entere justo despues de postear, ya que estaba editando el otro ejemplo.

DCelso

#10
Aqui también tenias razón splinter, en este caso era problema de solapamiento, se lanzan los 10 disparos pero solo se ven 6 porque unos coinciden exactamente con otros debido a la poca resolución.
Puse al disparo un alpha =100 y vi el problema
He aprovechado los conocimientos recientemente adquiridos de resolución para separa un poco las direcciones y ver mejor los solapamientos, que en este caso debido a aplicar resolucion ningún disparo coincide exactamente con otro como pasaba en el caso anterior.

import "mod_key"
import "mod_proc"
import "mod_map"
import "mod_video"
import "mod_grproc"
global
 int graf_disp;
Begin
   set_mode(320,240,32);
   graf_disp=load_png("recursos/bolafuego.png");
   dragon();
   Repeat
       frame;
   Until(key(_ESC))
End

Process dragon()
Begin
   x=160;
   y=200;
   //graph = load_png("recursos/dragon1.png");
   while(!key(_esc))
       if (key(_s))
               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);
               while(key(_s)) frame; end
       end
       frame;
   End
   unload_map(0,graph);
End


Process disparo(x,y,angle)
private
 id_colision;
Begin
 alpha = 100;
 resolution =10;
 x*=resolution;
 y*=resolution;
 graph=graf_disp;
 Repeat
    advance(8*resolution);
    Frame(100);
 Until((y<0) or key(_esc));
End
Monstruos Diabólicos

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

FreeYourMind

Muchas gracias por el ejemplo, me has resuelto el problema, ahora estas 2 lineas tambien funcionan como en Fenix.

Que haria sin vosotros ;)

No os doy el karma porque solo tengo uno ;)

DCelso

#12
ni que fueras a perderlo :D, tu solo ves los que te han dado no los que tienes para dar :D
Monstruos Diabólicos

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

Windgate

OFFTOPIC: En este foro el Karma fluye con mayor o menor intensidad en algunas temporadas... ¿Hay estadísiticas de Karmas lanzados por los usuarios? Estoy seguro de que en ciertas flechas en Karma fluye más fácilmente...

Curioso problema el de advance... Si ya lo has solucionado me alegro, en cualquier caso lo primero que se me ha pasado por la cabeza es que el advance(1) genera los catetos asociados a la hipotenusa 1 en x y en y resultando valores 0,707 que se truncan a 0...

Es lo primero que he pensado :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

FreeYourMind

No lo sabia.

Tengo malas noticias.

2 problemas usando esto:

1 - El switch no me enseña la explosion_del_tiro(x, y); al colidir con el enemigo, supongo que es por los valores de x,y:

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

...

He puesto:

explosio(x/resolution,y/resolution,95,80); o explosio(x*resolution,y*resolution,95,80);

no se lo que poner ;) no funciona, no se que valores tendran x, y,
no deberian ser los mismos que se ven en pantalla durante la colision ?

...

2 - Esta me asusta más:


Usando resolution los tiros no hacen una piramide perfecta en la parte de arriba (corte en horizontal perfecto arriba del tiro), hacen un arco (es chulo el arco pero vamos que no es el mismo comportamiento, parece que las lineas con angulo mayor obtienen menor valor de y).