Ir al contenido
Descargar

6. Sonido

  1. En la carpeta donde descomprimiste el primeiro-jogo-recursos.zip, están tiro.wav, explosao.wav y dano.wav.

  2. Haz clic en la carpeta sounds, en el panel Recursos, y arrastra los tres archivos al panel: van a la carpeta seleccionada. Si prefieres, haz clic derecho en la carpeta y elige Importar som (WAV)… (importar sonido).

  3. Cada sonido aparece con un ▶ verde al lado. Haz clic en él para escucharlo.

Selecciona un sonido para ver sus detalles en el Inspetor (Inspector):

Inspector del sonido tiro: archivo, duración, canales y frecuencia, y los botones Ouvir y Copiar código.

El botón Copiar código copia la línea que reproduce el sonido, por ejemplo Audio::play("tiro");. Después solo hay que pegarla en tu código.

En el Player.cpp, agrega dos líneas: una justo después del spawn<Bullet> y otra en el hurt(), después de quitar la vida.

objects/Player.cpp
#include "Player.hpp"
#include "src/game.hpp"
#include <algorithm>
using namespace brasa;
void Player::onSpawn() {
animSpeed = 0.2f; // la llama del motor alterna entre los 2 frames
// Tocar un Enemy cuesta una vida (y el enemigo desaparece también).
onCollide<Enemy>([this](Enemy& enemy) {
if (hurt()) enemy.destroy();
});
}
void Player::onUpdate() {
// Las acciones están en la configuración del proyecto (teclado y mando).
// axis devuelve de -1 a 1: -1 = la primera acción, 1 = la segunda.
float dx = axis("esquerda", "direita");
float dy = axis("cima", "baixo");
if (dx != 0.0f && dy != 0.0f) { // en diagonal, avanza a la misma velocidad
dx *= 0.7071f;
dy *= 0.7071f;
}
// clamp mantiene la nave dentro de la pantalla (la nave mide 16 px, así que el margen es 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(acción) es verdadero mientras la tecla o el botón están pulsados.
if (held("atirar") && canShoot_) {
spawn<Bullet>(x, y - 8.0f, "Tiros"); // el disparo nace en la capa Tiros, detrás de la nave
Audio::play("tiro", {.volume = 0.4f});
canShoot_ = false;
after(intervaloTiro, [this] { canShoot_ = true; }); // solo dispara de nuevo dentro de algunos steps
}
if (invincible_ > 0) --invincible_;
}
void Player::onRender() {
// Parpadea mientras es invencible: se salta el dibujo en algunos 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") reproduce el sonido llamado dano, que es el nombre del archivo sin el .wav.
  • El disparo suena muchas veces por segundo, así que va más bajo: {.volume = 0.4f} lo reproduce al 40% del volumen.

En el Enemy.cpp, reproduce la explosión dentro del kill():

objects/Enemy.cpp
#include "Enemy.hpp"
#include "src/game.hpp"
using namespace brasa;
void Enemy::onSpawn() {
animSpeed = 0.1f;
// random(a, b) sortea un número entre a y b: cada enemigo cae a una velocidad distinta.
vspeed = random(0.8f, 1.6f);
// Cuando un Bullet me toca, el disparo desaparece y yo muero.
// Los demás objetos (Bullet, Player...) ya son conocidos aquí, sin #include.
onCollide<Bullet>([this](Bullet& bullet) {
bullet.destroy();
kill();
});
}
void Enemy::onUpdate() {
// roomHeight() es la altura de la pantalla; si la pasó (con margen), el enemigo escapó.
if (y > static_cast<float>(roomHeight()) + 16.0f) destroy();
}
void Enemy::kill() {
if (isDestroyed()) return; // evita puntuar dos veces en el mismo step
state().score += pontos;
Audio::play("explosao", {.volume = 0.5f});
destroy();
}
BRASA_ENTITY(Enemy);

Pulsa Play y juega: el disparo hace pew, los enemigos explotan y la nave se queja cuando recibe daño.

  • Para importar sonidos, basta con arrastrar archivos WAV al panel Recursos, y el ▶ deja escucharlos al momento.
  • Audio::play("nombre") reproduce un sonido, y {.volume = ...} ajusta el volumen. Mira Reproducir sonidos.
  • El botón Copiar código del Inspector ya copia la línea lista.

Siguiente parte: 7. Fin del juego →