pilas-engine

Animación no se ejecuta

Hola, que tal? Estos últimos días estuve realizando un juego en pilas. Y durante el desarrollo surgió un error en mi código, después de buscar y buscar, no pude encontrarlo.

Lo que me pasa es que al momento de realizar una animación de ataque con el personaje jugable, solamente se realiza una vez, es decir que cada vez que apreto el botón de atacar, ataca pero sin la animación (La animación se ejecuta una vez nomás).

Les agradecería un montón si alguien puede darme una pequeña ayuda, dejo el código del actor acá abajo:

Desde ya muchas gracias, saludos.

class hero1 extends Actor {
  toca_el_suelo = false;
  pies = null;

  iniciar() {
    this.estado = "parado";
    this.pies = this.obtener_sensor("pies");
  }

  actualizar() {
    if (this.pies.colisiones.length > 0) {
      this.toca_el_suelo = true;
    } else {
      this.toca_el_suelo = false;
    }
    this.pilas.camara.seguir_al_actor(this);
  }

  parado_iniciar() {
    this.reproducir_animacion("hero_idle");
  }

  parado_actualizar() {
    if (this.pilas.control.izquierda || this.pilas.control.derecha) {
      this.estado = "camina";
    }

    if (this.pilas.control.arriba && this.toca_el_suelo) {
      this.impulsar(0, 8);
      this.estado = "salta";
    }

    if (!this.toca_el_suelo) {
      this.estado = "salta";
    }

    if (this.pilas.control.espacio) this.estado = "golpea";
  }

  camina_iniciar() {
    this.reproducir_animacion("hero_run");
  }

  camina_actualizar() {
    if (this.pilas.control.izquierda) {
      this.x -= 3;
      this.espejado = true;
    }

    if (this.pilas.control.derecha) {
      this.x += 3;
      this.espejado = false;
    }

    if (!this.pilas.control.derecha && !this.pilas.control.izquierda) {
      this.estado = "parado";
      return;
    }

    if (this.pilas.control.arriba && this.toca_el_suelo) {
      this.impulsar(0, 8);
      this.estado = "salta";
    }

    if (!this.toca_el_suelo) {
      this.estado = "salta";
    }
    if (this.pilas.control.espacio) {
      this.estado = "golpea";
    }
  }

  golpea_iniciar() {
    this.animacion = "hero_sword";
  }

  golpea_actualizar() {
    let sensor_derecho = this.obtener_sensor("golpe_der");
    let sensor_izquierdo = this.obtener_sensor("golpe_izq");

    function golpear_enemigo(enemigo: Actor) {
      enemigo.enviar_mensaje("golpear");
    }

    if (this.espejado) {
      if (sensor_izquierdo.colisiona_con_etiqueta("enemigo")) {
        sensor_izquierdo.colisiones.map(golpear_enemigo);
      }
    } else {
      if (sensor_derecho.colisiona_con_etiqueta("enemigo")) {
        sensor_derecho.colisiones.map(golpear_enemigo);
      }
    }
  }

  cuando_finaliza_animacion(nombre: "hero_sword") {
    this.estado = "parado";
  }

  salta_iniciar() {
    this.reproducir_animacion("hero_jump");
  }

  salta_actualizar() {
    if (this.pilas.control.izquierda) {
      this.x -= 2.5;
    }

    if (this.pilas.control.derecha) {
      this.x += 2.5;
    }

    if (this.toca_el_suelo) {
      this.estado = "parado";
    }
  }

  cuando_comienza_una_colision(actor) {
    if (actor.etiqueta === "plataforma") {
      if (this.velocidad_y > 0.1) {
        return true;
      }
    }
  }
}

Hola @facu para reproducir animaciones deberías usar siempre el mismo código, ya que si usas algunas veces:

this.reproducir_animacion("animacion");

Y otras veces:

this.animacion = "animacion";

Sucede que no se cambian correctamente. Al probar tu código eso me sucedió, no me dejaba alternar entre animaciones a menos que usara siempre el mismo.
Creo que lo mejor es usar siempre this.animacion = "animacion" ya que puedes copiarlo desde el panel de animaciones y ahorrarte el escribirlo a mano.
La otra razón por la que puede que se reproduzca solo una vez, es que estas usando la función:

cuando_finaliza_animacion(nombre: "hero_sword") {
   this.estado = "parado";
 }

Pero al no especificar qué animacion debe detectarse, siempre se ejecuta y al finalizar cualquier animación te devuelve el estado parado.
Deberías usar:

golpear_cuando_finaliza_animacion() {
   this.estado = "parado";
 }

De esta manera sólo detectas cuando finaliza la animación del estado golpear.
O sino usar:

cuando_finaliza_animacion(nombre) {
    if (nombre == "hero_sword") {
        this.estado = "parado";
    }
  }

Aunque nunca he probado si esto último funciona, siempre utilizo el del estado y ahora ya no tengo a mano al pilas engine para probarlo.

edit: Leí mal disculpas. Si lo que quieres hacer es que se reproduzca varias veces la animación de golpear, no uses ninguna funcion de cuando_finaliza_aniamción y ya estaría arreglado.

1 Like

Perfecto. Muchas gracias por tu respuesta!