Hola @hokuto, como dice federico se pueden usar funciones de trigonometría para calcular la rotación de los disparos y hacia donde se tienen que mover.
Yo suelo hacerlo así, que me resulta más sencillo para hacer cálculos:
- Para obtener el ángulo entre un actor y otro uso la función
this.pilas.obtener_angulo_entre_actores
.
- Una vez que tengo el ángulo, uso ese valor para “girar” la imagen del actor en la dirección correcta. Es importante que la imagen original del actor “mire hacia la derecha”, porque ese es el ángulo 0 del actor.
- Para hacer que el actor avance, primero convierto el valor del ángulo (que está en grados) a radianes, y luego uso las funciones “Math.cos” y “Math.sin” (coseno y seno) para calcular cuanto tengo que mover el actor para realizar el movimiento.
Armé un ejemplo con dos tipos de proyectiles para mostrar cómo sería:
En el ejemplo puse dos botones para crear lasers y misiles:
- los “lasers” son actores que simplemente obtienen el ángulo desde la nave hacia el alien ni bien aparecen en pantalla. Así que saldrán en “linea recta” hacia donde está el alien en ese momento. Si el alien se mueve, el disparo seguirá en la misma dirección y es posible “esquivarlo”.
- el misil, en cambio, es imposible de esquivar, porque en cada instante gira en dirección hacia donde está el enemigo y siempre avanza en la dirección correcta.
Si miras el código de cada uno de estos actores, vas a notar que son muy similares. Solo que el laser hace los cálculos en la función “iniciar”, una sola vez, mientras que el misil hace los cáculos en el método “actualizar”, así que constántemente está ajustando su trayectoria y por eso es imposible esquivarlo:
https://app.pilas-engine.com.ar/#/proyecto/5b2cc82f-4518-469d-95bd-4ec816286867
Ah, y para cambiar colores, podrías llamar a la función interna “setTint”, que actualmente pilas no la muestra porque solo funciona cuando el juego funciona sobre webgl, así que podría no funcionarte… pero igual te la paso para que hagas pruebas:
// en un actor, para ponerlo de color rojo:
this.sprite.setTint(0xff0000);
// para que sea tonos verdes
this.sprite.setTint(0x00ff00);
Hay un ejemplo de esto acá: Phaser - Examples - Sprites - Sprite Tint
Igualmente, insisto, solo funciona con equipos que usan webgl desde el navegador, si tu equipo no imprime el texto “Phaser v3.16.2 (WebGL | Web Audio)” en la consola del navegador no vas a poder colorear los actores.
PD: hace varios años, junto a unos amigos teníamos un sitio con traducciones y artículos sobre juegos, uno de esos artículos justamente hablaba sobre funciones geométricas en juegos, paso el link por si les parece útil: http://losersjuegos.com.ar/referencia/articulos/seno_coseno