6. Som
Importar os sons
Seção intitulada “Importar os sons”-
Na pasta onde você descompactou o primeiro-jogo-recursos.zip, estão
tiro.wav,explosao.wavedano.wav. -
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)…. -
Cada som aparece com um ▶ verde ao lado. Clique nele para ouvir.
Selecione um som para ver os detalhes dele no Inspetor:
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.
Som do tiro e do dano
Seção intitulada “Som do tiro e do dano”No Player.cpp, acrescente duas linhas: uma logo depois do spawn<Bullet> e outra no hurt(), depois de tirar a vida.
#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 chamadodano, 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.
Som da explosão
Seção intitulada “Som da explosão”No Enemy.cpp, toque a explosão dentro do kill():
#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);Teste agora
Seção intitulada “Teste agora”Aperte Play e jogue: o tiro faz pew, os inimigos explodem e a nave reclama quando leva dano.
O que você aprendeu
Seção intitulada “O que você aprendeu”- 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 →
