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á: https://app.pilas-engine.com.ar/#/manual?seccion=mensajes

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: https://app.pilas-engine.com.ar/#/proyecto/8d3ac3d5-1ab6-4588-905f-d1ddc0d1ddec

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!

1 me gusta