Pular para o conteúdo
Baixar

Atirar

Você quer que o jogador atire quando aperta uma tecla. O tiro é outro objeto, criado na hora pelo código.

Crie um objeto Bullet com o sprite do tiro e este código:

#include <brasa/brasa.hpp>
using namespace brasa;
class Bullet : public Entity {
public:
void onSpawn() override { vspeed = -5.0f; } // sobe 5 pixels por passo
void onUpdate() override {
if (y < -8.0f) destroy(); // saiu da tela: some
}
};
BRASA_ENTITY(Bullet);

E no objeto que atira:

void onUpdate() override {
if (pressed(Key::Space)) spawn<Bullet>(x, y, "Instancias");
}
  • spawn<Bullet>(x, y, "Instancias") cria uma instância nova de Bullet na posição dada. Aqui, na posição de quem atirou. O terceiro valor é a camada em que o tiro entra: Instancias é a que toda room nova já tem.
  • No onSpawn do tiro, vspeed = -5 faz ele subir sozinho: a Brasa soma hspeed/vspeed à posição a cada passo.
  • O tiro que sai da tela é destruído, para não acumular objetos invisíveis.

Segurar para atirar em rajada, com pausa entre os tiros:

// na classe: bool canShoot_ = true;
if (held(Key::Space) && canShoot_) {
spawn<Bullet>(x, y, "Instancias");
canShoot_ = false;
after(10, [this] { canShoot_ = true; }); // de novo daqui a 10 passos
}

Atirar numa direção qualquer. spawn devolve o tiro criado, então dá para trocar a velocidade dele. Vec2::fromAngle(força, graus) transforma um ângulo numa velocidade (0 = direita, 90 = cima):

if (Bullet* bullet = spawn<Bullet>(x, y, "Instancias")) {
const Vec2 v = Vec2::fromAngle(5.0f, angleTo(mouseX(), mouseY())); // na direção do mouse
bullet->hspeed = v.x;
bullet->vspeed = v.y;
}

O onSpawn do tiro roda dentro do spawn, então a velocidade que você define depois é a que vale.