problemas con collision

Started by Futu-block, September 05, 2010, 10:36:45 PM

Previous topic - Next topic

0 Members and 1 Guest are viewing this topic.

Futu-block

jored, tengo problemas de colision de la raqueta con respecto a la pelota, algunas veces colisiona pero no rebota...
ahí vá el codigo:

[code language="bennu"]PROGRAM churripong;
INCLUDE "DLL\import.prg";                 //Incluye las DLL necesarias para que todo funcione

global
int camb_pant; // cambio de pantalla, cambia el fondo segun la necesidad
int sort_tama; //tamaño de la bola
int sort_altu; // altura donde se situará la bola
int incl_bola; // angulo de inclinacion de la bola
int crea_bola; // para crear bolas cada vez que rebote con la pala

BEGIN
   set_mode(320,240,32,mode_window);
   load_fpg("churripong/grafics.fpg");           //Carga el fichero para gráficos sonic.fpg de la carpeta images
   fondo(); puntero();
   rand_seed(time());
END                                   //Fin del proceso principal del videojuego

process fondo()
begin
   graph = 401;
   x = 160;
   y = 120;
   z = 50;
   write_var(0,20,180,1,crea_bola);
   loop
      if (camb_pant < 100) camb_pant ++; end
      switch (camb_pant)
         case 8: graph = 402; end
         case 18: graph = 401; camb_pant = 1; end
         case 100: graph = 406; palo(); bola(rand(20,50),rand(40,200),rand(100000,200000)); camb_pant = 101; end
      end
      if (mouse.left and camb_pant < 100) camb_pant = 100; end
      if (key(_esc)) exit(); end
      frame;
   end
end

process palo()
begin
   graph = 1;
   x = 25;
   y = 120;
   //size = 25;
   loop
      if (y > 48)
         IF (key(_up))
            y-=5;
         end
      end
      if (y < 191)
         IF (key(_down))
            y+=5;
         end
      end
      if (key (_space)) bola(rand(20,50),rand(40,200),rand(100000,200000)); end
      //if (crea_bola = true) crea_bola = false;  end
      if (collision (type bola))
         graph = 2;
         bola(rand(20,50),rand(40,200),rand(100000,200000));
      else
         graph = 1;
      end
      frame;
   end
end

process bola(sort_tama,sort_altu,incl_bola)
private
int velo_bola = 10; // velocidad de avance con respecto a la bola

begin
   graph = 201;
   x = 300;
   y = sort_altu;
   size = sort_tama;
   angle = incl_bola;
   crea_bola = false;
   
   loop
      advance(velo_bola);
      if (y <= (sort_tama/2)-6) angle = -angle; end
      if (y >= 240-(sort_tama/2)) angle = -angle; end
      //if (collision (type palo)) angle = angle - 180; end
      if(collision(type palo))//La bola viene de abajo
         if(angle > 90000 and angle < 180000)
            angle = 180000- angle;
            velo_bola *=2;
         end//La bola viene de arriba
         if(angle > 180000and angle < 270000)
            angle = 180000 + angle;
            velo_bola *=2;
         end
      end
      if (x >= 300) velo_bola = 10; break; end
      if (x<10) break; end
      frame;
   end
end
[/code]

desde que puse collision no para de darme polemas...

Noivern

#1
¿pq creas otra bola en el proceso palo?
if (collision (type bola))
   graph = 2;
   bola(rand(20,50),rand(40,200),rand(100000,200000));
end

bueno y con lo de los rebotes que no suceden, podrias probar con...

if (y <= (sort_tama/2)-6) angle = (-angle)%360000; end
if (y >= 240-(sort_tama/2)) angle = (-angle)%360000; end

ya que los if de más abajo puede que no se activen al haber ángulo negativo... a menos que bennu resetee automáticamente la local angle al pasar sobre los 360º o bajo los 0º pero no me consta.

Drumpi

[Modo análisis código = OFF]

El pong es el clásico ejemplo que pongo siempre para no usar collision, más que nada porque es fácil que se de el caso de que la bola colisione y vuelva a colisionar al siguente frame, y el segundo cálculo de ángulo seguro que la hace mal.

De todos modos, recomiendo que eches un vistazo a los valores REALES de angle, porque es posible que valga algo que no tienes contemplado en los ifs (¿valores negativos?)
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)

Futu-block

Quote from: Noivern on September 06, 2010, 03:28:43 AM
¿pq creas otra bola en el proceso palo?
if (collision (type bola))
    graph = 2;
    bola(rand(20,50),rand(40,200),rand(100000,200000));
end

bueno y con lo de los rebotes que no suceden, podrias probar con...

if (y <= (sort_tama/2)-6) angle = (-angle)%360000; end
if (y >= 240-(sort_tama/2)) angle = (-angle)%360000; end

ya que los if de más abajo puede que no se activen al haber ángulo negativo... a menos que bennu resetee automáticamente la local angle al pasar sobre los 360º o bajo los 0º pero no me consta.
la bola nueva que se crea es la ''gracia'' del juego, te crea una bola porque no es la misma que rebota sino una nueva que te lanzan

y lo del % ese no creia que hiciera falta, aunque lo cambiaré 'porsi acaso'


Quote from: Drumpi on September 06, 2010, 07:48:27 AM
[Modo análisis código = OFF]

El pong es el clásico ejemplo que pongo siempre para no usar collision, más que nada porque es fácil que se de el caso de que la bola colisione y vuelva a colisionar al siguente frame, y el segundo cálculo de ángulo seguro que la hace mal.

De todos modos, recomiendo que eches un vistazo a los valores REALES de angle, porque es posible que valga algo que no tienes contemplado en los ifs (¿valores negativos?)

ok jefe, le echaré un vistaso, queria hacer ''el juego del mes'' en un cuarto de hora y se está retrasando
:awesome:
ups, que aqui no sale, je je je

Noivern

jeje lo del %360000 es una buena práctica tomada del manual de osk :)
y cuenta... ¿te resultó?

Futu-block

#5
que vá, al final lo he cambiado por avance de x e y, ademas le hago girar la bola
aunque lo que me sigue fallando es la colision, me colisiona demasiadas veces en un segundo
¿hay alguna manera de comprobar la colision una vez solo?

aparte
-quiero saber o contar el numero de procesos que tengo, no quiero que se cree mas de dos ni haya menos de uno ¿como va?

SplinterGU

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

Drumpi

Quote from: Noivern on September 07, 2010, 02:29:29 AM
jeje lo del %360000 es una buena práctica tomada del manual de osk :)
y cuenta... ¿te resultó?
El problema de %360000 es que también devuelve valores negativos, por lo que hay que añadir:

if (angle<0) angle+=360000; end

Quote from: SplinterGU on September 07, 2010, 11:32:07 PM
usa un contador.

O un bucle con get_id(type...
Futu, puedes hacer que el proceso que colisiona, una vez que lo haga, no vuelva a comprobar colisión, como cuanto el personaje de un videojuego se vuelve invencible tras recibir un golpe, puedes usar un contador para ello.
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)

Mr Matsusaka

Usa un booleano del estilo

bColisionPlayer1;
Cuando golpee la pala del player 1 lo pones a true, y cuando golpee la pala del player 2 lo pones a false
Luego no tienes mas que hacer que chequee la colision de la pala del player 1 si bColisionPlayer1 es false y viceversa.

Futu-block

caspita, escribí algo aqui pero no está...
buf, como tengo la cabeza, he de darle mas veces al boton de publicar

SplinterGU

para limitar la cantida de bolas a 2, es mejor usar un contador, es mas rapido que hacer un bucle de get_id(type...)
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

Futu-block

el problema persiste cuando la bola colisiona con la parte de arriba de la paleta, entonces se pone a colisionar muchas veces por segundo

he intentado ponerle un ''testigo'' para que cuando colisione le impida colisionar mas, pero al dar con la parte de arriba o abajo se invierte la direccion de la bola y sigue colisionando

SplinterGU

no solo tenes que invertir, sino que tenes que volver a las coordendas anteriores o hacer un for cambiando las coordenadas en direccion a donde estaba antes hasta que deje de colisionar, y ahi si invertir el sentido.

aunque eso tampoco importa mucho, con solo volver a las coordernadas e invertir puede funcionar, a menos que este acoralada la bola, entonces el otro metodo puede ayudar.
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

Futu-block

#13
¡ya esta!
el problema no era la colision con la bola, esa era perfecta y regresaba sin problemas para luego desaparecer en el infinito
el problema estaba en la creacion de la nueva bola, desde el mismo proceso bola() no puedo crear otra bola (por lo menos yo pienso que no y no lo haré) pero la colision funciona si hay dos partes a colisionar (la bola y el palo) pues yo puse el testigo de colision a la bola para que retrocediera, pero al palo no se lo puse y creaba el balo una bola por cada frame colisionando

testigo de colision al palo y solucionado el polema

no nos hemos dado cuenta naide, si es que vemos un pong y lo flipamos...
je je ej

otra cosa aparte, ¿como se pone el valor de una variable pegado a cada bola?
he intentado con: write_var(0,y,x-30,1,angle); pero me lo pone arriba del todo, ¿hay que meterlo en el loop?
creo que tambien hay que asignarle una variable para que el delete_text me lo borre en cada frame ¿no?

SplinterGU

yo pense que estabas haciendo un flipper...

se ve que lei muy por encima.
Download Lastest BennuGD Release: http://www.bennugd.org/node/2