Efecto de disparo

Hola @hugoruscitti quería preguntarte de como se haría para hacer el efecto de cuando un cañón dispara, no importa sin no se ve el proyectil y si se ve bien, pero eso no es lo que quiero quiero es ver cuándo cae el proyectil en el piso y por ejemplo un enemigo muestra más SERCA muera y si está más lejos le cause daño como se haría para lograrlo, y te lo agradezco por tu tiempo.

Hola @VictorRico!!, se me ocurre una forma de hacerlo, te comento cómo sería.

Primero, tendrías que tener un actor que represente el misil y que pueda colisionar con algún objeto para explotar, algo así:

misiles

Luego, podrías crear los actores que te gustaría poder impactar con el misil. Por ejemplo yo hice unos actores muy simples con la etiqueta “rana”:

image

Ahora bien, en la función que genera la explosión, podrías escribir un código que haga estas cosas:

  • Cuando se produce la explosión:
    • Obtener una lista de todas las ranas.
    • Llamar a la función “golpe” de cada rana enviando la distancia entre la bomba y la rana.
      • Que la rana evalúe, en base a la distancia, cuando energía tiene que perder.

Pilas viene con varias funciones para escribir este código; así que te doy ejemplo de cómo lo escribí yo. Este código iría en el actor “misil”, la función cuando_comienza_una_colisión es la que se ejecuta sola, y dañar_a_los_actores_cercanos es la que se encarga de obtener todas las ranas y avisarles que tienen que bajar su energía:

  cuando_comienza_una_colision(otro: Actor) {
    if (otro.tiene_etiqueta("plataforma")) {
      this.eliminar();
      this.pilas.clonar_en("explosion", this.x, this.y);
      this.dañar_a_los_actores_cercanos();
    }
  }

  dañar_a_los_actores_cercanos() {
      // obtiene todos los actores de tipo 'rana' de la escena
      let actores = this.pilas.obtener_todos_los_actores_con_la_etiqueta("rana");

      // por cada uno de estos actores, intenta obtener su distancia y les
      // envía el mensaje de "golpe".
      //
      // El mensaje "golpe" automáticamente intentará llamar a la función
      // "cuando_llega_el_mensaje_golpe" del actor rana.
      actores.map(actor => {
        let distancia = this.obtener_distancia_al_actor(actor);
        actor.enviar_mensaje("golpe", distancia);
      })
  }

La función enviar_mensaje que aparece al final de código sirve para poder hacer que los actores se comuniquen entre sí. En este caso es como si la bomba “le avisara a las ranas” a qué distancia explotó de ellas para que reduzcan su energía.

Luego, siempre que llames a una función como enviar_mensaje te tienes que asegurar de implementar una función para “atender ese mensaje”.

Por cierto, estas funciones de mensajes están documentadas acá: PilasEngine

Siguiendo con este ejemplo, imaginá quiero hacer una primer prueba: me gustaría que la rana se “de cuenta” de que cayó una bomba y diga al usuario a qué distancia cayó de ella. Para eso puedo escribir la función que recibe el mensaje así (en el actor rana):

  cuando_llega_el_mensaje_golpe(distancia) {
    this.decir(`${distancia} px de mí`);
  }

y así quedaría en pantalla:

(te paso el código de este mini ejemplo: PilasEngine

Ahora, para que la rana se haga daño, se puede modificar ese código y añadir una barra de energía para cada una de las ranas y mejorar la función cuando_llega_el_mensaje_golpe.

Te paso el código de esta última versión, lo único que cambié respecto a la anterior es el código de la rana:

ojalá te sirva el ejemplo, sino avisame!

¡Saludos!

2 Likes

gracias @hugoruscitti disculpa que nunca te respondí. tomado mi ejemplo, yo estoy haciendo un juego de guerra y hice lo cañones pero como hago para que la bala suba y baje osea que hago una curva, un cañon no dispara derecho…

otra cosita sabes que en los juego luego que tienes poder completo o gran cantidas de moneda, tienes para hacer algo especial mi idea es que salgan de la derrecha varios caballo y que maten al enemigo pero solo que le pasen por encima y se elimine

¡Hola @VictorRico !, hay varias formas de hacer que el misil realice una curva.

Para mí, la forma más sencilla es hacer que el misil tenga física activando estas opciones:

y luego, en el código, llamar a la función impulsar para que el misil salga disparado en la dirección que quiero:
image

El resultado te debería quedar de esta forma:

image

Te paso un ejemplo rápido de cómo quedaría en funcionamiento:

Abrir este proyecto en el editor de pilas

Luego, con respecto a los enemigos, lo que podrías hacer es ir generándolos con un temporizador, por ejemplo que aparezca un caballo enemigo cada 2 segundos. Hay un ejemplo dentro de pilas que muestra similar, te paso el link:

https://app.pilas-engine.com.ar/#/ejemplos/automata-contra-calaveras

1 Like

gracias Hugo, voy a implementar todo lo que me has dicho. MIl gracias por tu tiempo

1 Like