6. Sonido
Importar los sonidos
Sección titulada «Importar los sonidos»-
En la carpeta donde descomprimiste el primeiro-jogo-recursos.zip, están
tiro.wav,explosao.wavydano.wav. -
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). -
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):
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.
Sonido del disparo y del daño
Sección titulada «Sonido del disparo y del daño»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.
#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 llamadodano, 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.
Sonido de la explosión
Sección titulada «Sonido de la explosión»En el Enemy.cpp, reproduce la explosión dentro del kill():
#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);Pruébalo ahora
Sección titulada «Pruébalo ahora»Pulsa Play y juega: el disparo hace pew, los enemigos explotan y la nave se queja cuando recibe daño.
Lo que aprendiste
Sección titulada «Lo que aprendiste»- 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 →
