Bennu Game Development

Foros en Español => Mesa de Ayuda => Topic started by: Futu-block on September 05, 2010, 10:36:45 PM

Title: problemas con collision
Post by: Futu-block on September 05, 2010, 10:36:45 PM
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...
Title: Re: problemas con collision
Post by: 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.
Title: Re: problemas con collision
Post by: 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?)
Title: Re: problemas con collision
Post by: Futu-block on September 06, 2010, 07:12:49 PM
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
Title: Re: problemas con collision
Post by: 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ó?
Title: Re: problemas con collision
Post by: Futu-block on September 07, 2010, 10:27:39 PM
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?
Title: Re: problemas con collision
Post by: SplinterGU on September 07, 2010, 11:32:07 PM
usa un contador.
Title: Re: problemas con collision
Post by: Drumpi on September 08, 2010, 08:55:01 PM
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.
Title: Re: problemas con collision
Post by: Mr Matsusaka on September 08, 2010, 09:36:59 PM
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.
Title: Re: problemas con collision
Post by: Futu-block on September 08, 2010, 10:06:21 PM
caspita, escribí algo aqui pero no está...
buf, como tengo la cabeza, he de darle mas veces al boton de publicar
Title: Re: problemas con collision
Post by: SplinterGU on September 08, 2010, 10:13:25 PM
para limitar la cantida de bolas a 2, es mejor usar un contador, es mas rapido que hacer un bucle de get_id(type...)
Title: Re: problemas con collision
Post by: Futu-block on September 09, 2010, 07:32:19 PM
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
Title: Re: problemas con collision
Post by: SplinterGU on September 09, 2010, 07:54:08 PM
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.
Title: Re: problemas con collision
Post by: Futu-block on September 11, 2010, 08:34:41 AM
¡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?
Title: Re: problemas con collision
Post by: SplinterGU on September 11, 2010, 05:46:44 PM
yo pense que estabas haciendo un flipper...

se ve que lei muy por encima.
Title: Re: problemas con collision
Post by: FreeYourMind on September 11, 2010, 05:52:39 PM
Futurete no me plagies tantete!  :D
Title: Re: problemas con collision
Post by: Futu-block on September 11, 2010, 06:40:43 PM
plagio? si solo quiero hacer el juego del mes???

bueno, cambiando de tema; como eso de: 'que cuando rebote la bola con la paleta me cree una nueva que vaya direcion paleta' no me funciona mejor es crear bolas con un proceso independiente que segun la puntuacion se vuelva mas cabroncilla y lance mas bolas a mas velocidad...
conclusion, cambio total del juego
proximamente en gp32spain...

gamemaster, cuando quieras me mandas el resto de la baraja, o mejor esperate que te mande del 2 al 9 de todos los palos, que me queda un poquin, jeje
Title: Re: problemas con collision
Post by: FreeYourMind on September 11, 2010, 06:44:30 PM
Aqui mi alter ego se llama FreeYourMind, espera que me doy un golpe en la cabeza para llamar a GameMaster  ;D ;D

Ayer me acorde que se me olvido mandartela, pero tampoco me has enviado tu email, asi que dame el email y te las envio.
Espero impaciente esas cartas  ;)
Title: Re: problemas con collision
Post by: Futu-block on September 12, 2010, 09:02:12 AM
se lo mandaré a mi primo, porque no tengo tu emilio-e...