Disparo y colores en pilas 2

Hola.

Me gustaria saber como se puede hacer para que un enemigo me lance un disparo que vaya directamente a la posicion donde este mi jugador,logicamente el jugador siempre estara moviendose por lo que el disparo al ser lanzado ira a esa posicion.

Tambien me gustaria saber si cuando el disparo impacte en mi jugador,si podria cambiarle el color al jugador.He buscado si hay alguna funcion para cambiar el color de los actores pero no he encontrado nada.

Saludos.

Cómo un misil teledirigido, o como una bala común?, siempre es como una bala deberías calcular la distancia X del punto de partida hasta el jugador, y la distancia Y del punto de partida al jugador y así podrás con ARCTANGENTE calcular el ángulo de disparo de la bala hacia el jugador.
Desconozco si ya hay una función de este tipo en el pilas engine 2.

Si que hay una funcion pero no funciona bien del todo,el disparo se suele mover en la direccion contraria.

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:

demo-juego

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

1 Like

Hola Hugo,gracias por las explicaciones

La funcion setTint() me funciona bien pero no me sale en el autocompletado,añadela cuando puedas a pilas.

El ejemplo de los disparos que me has pasado me funciona bien pero los calculos con coseno y seno me resultaron un poco liosos al igual que el documento que me has pasado sobre geometria,para entender ese tipo de calculos hay que dedicarle mucho tiempo y te tiene que gustar.

Yo creo que para pilas 2 es mejor tener una serie de funciones que te faciliten ese tipo de calculos,funciones como las de “obtener_agulo_entre_actores” y “obtener_distancia_entre_actores”,añade mas funciones de este tipo en proximas versiones.

Estuve retocando el codigo de tu ejemplo para hacerlo a mi manera que es con la funcion avanzar(),esta manera la he usado en otros engines y siempre me ha funcionado bien por eso no entendia el porque no me funcionaba en pilas 2 hasta que descubri el porque.

El problema es la posicion donde se coloque el laser,en tu ejemplo esta en dentro de la nave pero si la colocas muy retirado es cuando ocurren los fallos,estos fallos no ocurren con el boton disparar laser,tienes que crear una funcion “cada_segundo()” en el codigo de la nave y crear el laser desde hay y veras como ocurren los fallos donde el laser va hacia donde le apetece,otra cosa que he descubierto es que si creas un laser y un misil al mismo tiempo este desaparece al crearse.

Por cierto,las funciones “cuando_mueve” y “cuando_sale”,no seria mejor que fueran “cuando_entrar_cursor()” y “cuando_sale_cursor()”.

Si no has entendido algo te puedo pasar tu ejemplo modificado para que tu mismo veas los errores.