Pular para o conteúdo
Baixar

6. Som

  1. Na pasta onde você descompactou o primeiro-jogo-recursos.zip, estão tiro.wav, explosao.wav e dano.wav.

  2. Clique na pasta sounds, no painel Recursos, e arraste os três arquivos para o painel: eles vão para a pasta selecionada. Se preferir, clique com o botão direito na pasta e escolha Importar som (WAV)….

  3. Cada som aparece com um ▶ verde ao lado. Clique nele para ouvir.

Selecione um som para ver os detalhes dele no Inspetor:

Inspetor do som tiro: arquivo, duração, canais e taxa, e os botões Ouvir e Copiar código.

O botão Copiar código copia a linha que toca o som, por exemplo Audio::play("tiro");. Depois é só colar no seu código.

No Player.cpp, acrescente duas linhas: uma logo depois do spawn<Bullet> e outra no hurt(), depois de tirar a vida.

objects/Player.cpp
#include "Player.hpp"
#include "src/game.hpp"
#include <algorithm>
using namespace brasa;
void Player::onSpawn() {
animSpeed = 0.2f; // a chama do motor alterna entre os 2 frames
// Encostar num Enemy custa uma vida (e o inimigo some junto).
onCollide<Enemy>([this](Enemy& enemy) {
if (hurt()) enemy.destroy();
});
}
void Player::onUpdate() {
// As ações ficam em Configurações do projeto (teclado e controle).
// axis devolve de -1 a 1: -1 = a primeira ação, 1 = a segunda.
float dx = axis("esquerda", "direita");
float dy = axis("cima", "baixo");
if (dx != 0.0f && dy != 0.0f) { // na diagonal, anda com a mesma velocidade
dx *= 0.7071f;
dy *= 0.7071f;
}
// clamp mantém a nave dentro da tela (a nave tem 16 px, então a margem é 8).
const float maxX = static_cast<float>(roomWidth()) - 8.0f;
const float maxY = static_cast<float>(roomHeight()) - 8.0f;
x = std::clamp(x + dx * velocidade, 8.0f, maxX);
y = std::clamp(y + dy * velocidade, 8.0f, maxY);
// held(ação) é verdadeiro enquanto a tecla ou o botão estão pressionados.
if (held("atirar") && canShoot_) {
spawn<Bullet>(x, y - 8.0f, "Tiros"); // o tiro nasce na camada Tiros, atrás da nave
Audio::play("tiro", {.volume = 0.4f});
canShoot_ = false;
after(intervaloTiro, [this] { canShoot_ = true; }); // só atira de novo daqui a alguns steps
}
if (invincible_ > 0) --invincible_;
}
void Player::onRender() {
// Pisca enquanto está invencível: pula o desenho em alguns steps.
if (invincible_ > 0 && (invincible_ / 4) % 2 == 0) return;
drawSelf();
}
bool Player::hurt() {
if (invincible_ > 0 || isDestroyed()) return false;
--state().lives;
Audio::play("dano");
if (state().lives <= 0) {
destroy();
} else {
invincible_ = 90; // 1,5 s a 60 steps por segundo
}
return true;
}
BRASA_ENTITY(Player);
  • Audio::play("dano") toca o som chamado dano, que é o nome do arquivo sem o .wav.
  • O tiro toca muitas vezes por segundo, então ele vai mais baixo: {.volume = 0.4f} toca a 40% do volume.

No Enemy.cpp, toque a explosão dentro do kill():

objects/Enemy.cpp
#include "Enemy.hpp"
#include "src/game.hpp"
using namespace brasa;
void Enemy::onSpawn() {
animSpeed = 0.1f;
// random(a, b) sorteia um número entre a e b: cada inimigo cai numa velocidade diferente.
vspeed = random(0.8f, 1.6f);
// Quando um Bullet encosta em mim, o tiro some e eu morro.
// Os outros objetos (Bullet, Player...) já são conhecidos aqui, sem #include.
onCollide<Bullet>([this](Bullet& bullet) {
bullet.destroy();
kill();
});
}
void Enemy::onUpdate() {
// roomHeight() é a altura da tela; passou dela (com folga), o inimigo escapou.
if (y > static_cast<float>(roomHeight()) + 16.0f) destroy();
}
void Enemy::kill() {
if (isDestroyed()) return; // evita pontuar duas vezes no mesmo step
state().score += pontos;
Audio::play("explosao", {.volume = 0.5f});
destroy();
}
BRASA_ENTITY(Enemy);

Aperte Play e jogue: o tiro faz pew, os inimigos explodem e a nave reclama quando leva dano.

  • Para importar sons, é só arrastar arquivos WAV para o painel Recursos, e o ▶ deixa ouvir na hora.
  • Audio::play("nome") toca um som, e {.volume = ...} ajusta o volume. Veja Tocar sons.
  • O botão Copiar código do Inspetor já copia a linha pronta.

Próxima parte: 7. Fim de jogo →