Acceder a los actores de un Laser (Resuelto)

Hola a todos!
Comparto con ustedes un aprendizaje, me tomo tiempo aprenderlo así que espero ahorrarle tiempo a alguien que tenga el mismo problema que yo. Este post tiene por objetivo responder futuras consultas o ser usado como referencia.
En algunos juegos es necesario usar Lasers y, además, es necesario detectar algún actor en específico dentro de todos los actores que están en el camino del Laser.
Supongamos que deseamos golpear sólo a los enemigos e ignorar a los aliados. En ese caso el método para acceder a un actor que brinda Pilas nos sería inutil:

this.laser.obtener_actor_mas_cercano()

Este método, como su nombre indica, devuelve el más cercano, pero ¿qué pasa si el más cercano es en realidad un actor aliado? Eso es lo que más o menos me estaba pasando.
Luego de renegar bastante y probar varias cosas encontré la manera de acceder a todos los actores del laser y poder usar un condicional para detectar aquellos con cierta etiqueta. Al final del post comparto un ejemplo con código comentado donde un espadachín golpea a un alien ignorando la caja que se interpone entre ellos.
Lo primero que hice fue guardar en una variable a todas las colisiones del laser llamado alcance:

let actores_en_el_laser = this.alcance.obtener_colisiones();

Lo siguiente es asegurarme de que la variable no esté vacía, es decir, que haya algún actor en el camino del laser:

if (actores_en_el_laser.length == 0) {
        return
}

Luego utilicé un bucle for para recorrer los 5 primeros lugares que colisionan con el laser:

for (let i = 0; i < 5; i++) {

        if (!actores_en_el_laser[i]) {
          return
        }
        if (actores_en_el_laser[i].actor.tiene_etiqueta("alien")) {
          actores_en_el_laser[i].actor.enviar_mensaje("golpe");
        }
}

El primer condicional dentro del bucle es para evitar errores. Ya que si resulta que el laser colisiona con menos de 5 actores, entonces los lugares vacios darán errores.
El segundo condicional busca aquellos actores que tienen una determinada etiqueta e ignora al resto.
Para el caso en que se usen sensores, se puede hacer algo similar.
Abrir este proyecto en el editor de pilas

posdata: Quizás estaría bueno que Pilas brinde algún método que acorte el código anterior. Algo cómo un método que devuelva directamente una lista de actores.

1 Like

Gracias.
Muy buena información.

1 Like