Ir al contenido
Descargar

Disparar

Quieres que el jugador dispare cuando pulsa una tecla. El disparo es otro objeto, creado en el momento por el código.

Crea un objeto Bullet con el sprite del disparo y este código:

#include <brasa/brasa.hpp>
using namespace brasa;
class Bullet : public Entity {
public:
void onSpawn() override { vspeed = -5.0f; } // sube 5 píxeles por paso
void onUpdate() override {
if (y < -8.0f) destroy(); // salió de la pantalla: desaparece
}
};
BRASA_ENTITY(Bullet);

Y en el objeto que dispara:

void onUpdate() override {
if (pressed(Key::Space)) spawn<Bullet>(x, y, "Instancias");
}
  • spawn<Bullet>(x, y, "Instancias") crea una instancia nueva de Bullet en la posición dada. Aquí, en la posición de quien disparó. El tercer valor es la capa en la que entra el disparo: Instancias es la que toda room nueva ya tiene.
  • En el onSpawn del disparo, vspeed = -5 hace que suba solo: Brasa suma hspeed/vspeed a la posición en cada paso.
  • El disparo que sale de la pantalla se destruye, para no acumular objetos invisibles.

Mantener para disparar en ráfaga, con una pausa entre los disparos:

// en la clase: bool canShoot_ = true;
if (held(Key::Space) && canShoot_) {
spawn<Bullet>(x, y, "Instancias");
canShoot_ = false;
after(10, [this] { canShoot_ = true; }); // otra vez dentro de 10 pasos
}

Disparar en cualquier dirección. spawn devuelve el disparo creado, así que puedes cambiarle la velocidad. Vec2::fromAngle(fuerza, grados) convierte un ángulo en una velocidad (0 = derecha, 90 = arriba):

if (Bullet* bullet = spawn<Bullet>(x, y, "Instancias")) {
const Vec2 v = Vec2::fromAngle(5.0f, angleTo(mouseX(), mouseY())); // en dirección al mouse
bullet->hspeed = v.x;
bullet->vspeed = v.y;
}

El onSpawn del disparo se ejecuta dentro del spawn, así que la velocidad que defines después es la que vale.