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
podrias mandar un signal desde disparo a enemigo y usar onexit para todo lo que es desinicializacion del enemigo.
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).
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
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
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.
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
lo importante es que te funcione... :)
saludos!