Problema con colisiones

Started by scuws, June 21, 2010, 10:27:26 PM

Previous topic - Next topic

0 Members and 1 Guest are viewing this topic.

scuws

En el juego que voy haciendo tengo un personaje que llama al proceso disparo que colisiona con el enemigo matando los dos procesos.


disparo-(estadistica es un type local)
IF ( ( choque = collision ( type enemy_dummy ) ) && ( choque.estadistica.estado != _MORIR ) )
BREAK;
END



enemigo-
IF ( collision ( type disparo ) )
BREAK;
END


el problema es que cuando se estan tocando el personaje y el enemigo y dispara, el disparo no aparece y el enemigo no muere.

salu2

SplinterGU

podrias mandar un signal desde disparo a enemigo y usar onexit para todo lo que es desinicializacion del enemigo.
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

Drumpi

Eso es un problema de sincronización de procesos: cuando chocan, el primer proceso que se ejecute hace el break y sigue hasta hacer frame o terminar su ejecución, en este caso creo que, por ejemplo, el proceso disparo choca y desaparece, entonces luego se ejecuta el enemigo, pero como el proceso disparo ya no existe (porque se ha terminado y ha desaparecido) pues no colisiona.

La solución es que sólo uno de los procesos detecte la colisión, y le mande una señal al otro para advertirle de lo que ha pasado. Generalmente, en estos casos, suelo tener una variable LOCAL llamada "energia", y lo que hago es que el proceso que detecta la colisión pone tanto su energía como la del otro proceso a cero, y que cada uno salga del bucle por su cuenta cuando llega a cero.
Es más elegante que mandarle un S_KILL (aunque más sencillo, usando, como dice Splinter, el ON_EXIT para generar la explosión o la animación de muerte).
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)

scuws

He puesto como a dicho SplinterGU el signal pero en cuanto colisionan se para el juego por completo, os dejo el codigo.

disparo-
IF ( ( abs ( id_character.x - x ) > 600 ) || ( choque = collision ( type enemy_dummy ) )&& ( choque.estadistica.estado != _MORIR ) )
signal ( choque , s_kill_tree );
BREAK;
END


enemigo-
ONEXIT
y -= 20;
size = 200;
WHILE ( graph < animaciones [ nombre ] [ estado ] . graph_fin )
animar ( nombre , estado );
estadistica.estado = estado;
FRAME;
END
END

scuws

#4
Bueno ahora lo he estado mirando y he visto la idea de Drumpi y esa me funciona perfectamente.

disparo-
IF ( (choque = collision ( type enemy_dummy )) && (choque.estadistica.estado != _MORIR))
choque.estadistica.vida -= 75;
BREAK;
END



enemigo-
IF ( estadistica.vida <= 0 )
estado = _MORIR;
BREAK;
END

SplinterGU

yo te dije usar s_kill, no s_kii_tree...

la cosa es que al no poner el codigo completo, no podemos saber si estado lo usas solo como estadistica o como corte de control.

yo te iba a poner primero eso de setear estado a _MORIR, pero como tus variables se llaman estadistica, no sabia si me iba a mandar una guazada.

por favor, pon codigo completo la proxima vez.

si usas s_kill te tiene que funcionar.
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

scuws

Sí, no me di cuenta de que era solo s_kill.
En realidad los estados estan en una privada por lo que dentro de la estadistica local tengo una variable que cada frame la igualo al estado y asi saber los estados en colisiones.
Pero como use la forma de Drumpi y me funcionó bien no guarde el codigo con s_kill.

Gracias por las repuestas

SplinterGU

lo importante es que te funcione... :)

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