Las colisiones permiten ejecutar funciones como respuesta al contacto entre diferentes actores. Las funciones se pueden personalizar para hacer casi cualquier cosa: reproducir un sonido para magnificar el impacto, eliminar alguno de los actores en contacto, emitir efectos etc…
Por ejemplo, imaginá que tenemos estos tres actores:
Cuando el juego se ejecute, la plataforma va a quedar fija en pantalla. Mientras que la pelota y la caja van a moverse hacia abajo y colisionarán.
Pilas va a llamar automáticamente a la función cuando_comienza_una_colision
ni bien entren en contacto dos actores. Por ejemplo en este caso, pilas va a llamar a la función cuando_comienza_una_colision
cuando la pelota colisione con la caja, y luego la plataforma.
class pelota extends Actor {
propiedades = {
imagen: "pelota",
figura: "circulo",
figura_radio: 25
};
cuando_comienza_una_colision(actor) {
if (actor.etiqueta === "caja") {
return true;
}
if (actor.etiqueta === "plataforma") {
this.decir("Oh, colisioné con una plataforma!");
}
}
}
En el código hay dos cosas interesantes, tenemos la función cuando_comienza_una_colision
dentro de la clase “pelota” para detectar colisiones y además intentamos distinguir contra qué actores se produce la colisión usando etiquetas. :
true
.Hay 3 instantes muy importantes cuando se producen colisiones:
Para distinguir estos casos pilas llamará a las tres funciones de forma diferente. Este es un ejemplo de cómo se declaran esas funciones en el código de un actor:
class mi_actor extends Actor {
cuando_comienza_una_colision(actor: Actor) {
if (actor.etiqueta === "moneda") {
this.pilas.reproducir_sonido("moneda");
actor.eliminar();
}
}
cuando_se_mantiene_una_colision(actor: Actor) {}
cuando_termina_una_colision(actor: Actor) {}
}
Luego, el tipo de colisión más común que se llamará siempre tiene la siguiente forma:
Hay otro tipo de colisión especial que solo se produce entre figuras no dinámicas, esas colisiones se notifican constantemente en cada cuadro de animación mediante el método cuando_colisionan
.