¿Cómo reproducir un sf::Sound en un bucle?
Nosotros (la escuela) estamos desarrollando un juego en C++ con SFML. El juego es de lucha, y necesitamos reproducir pequeños sonidos cuando el jugador recibe un golpe, por ejemplo.
Estoy intentando reproducir un sf::Sound en un bucle. Sé que no deberíamos llamar al método play() de sf::Sound en un bucle, pero dado que las aplicaciones de SFML se ejecutan todas en bucles while, no tengo otra opción. O al menos, no conozco ninguna otra forma de hacerlo.
Intenté usar un gestor de sonidos, leí varios posts sobre ello, pero no encontré nada que funcionara.
Aquí hay un código de muestra:
#include
#include
#include
int main() {
int FPS = 60;
// sf::Music music;
// if(!music.openFromFile("resources/audio/fight_theme.ogg")) {
// std::cout << "Music was not found" << std::endl;
// }
// music.setVolume(10.f);
// music.play();
// Crear la ventana principal
sf::VideoMode desktopMode = sf::VideoMode::getDesktopMode();
sf::RenderWindow app(
sf::VideoMode(
desktopMode.width,
desktopMode.height,
desktopMode.bitsPerPixel),
"SkyddaForStackOverflow",
sf::Style::Fullscreen
);
app.setFramerateLimit(FPS);
//Bucle principal
while (app.isOpen()) {
/*En el código actual, tenemos dos instancias de jugador.
Cuando el usuario presiona S o el botón keyDown, se llama a la función attack.
En la función, aplicamos el daño al enemigo, luego llamamos a playSound
para reproducir el sonido de impacto.
Por favor, tenga en cuenta que este es un código de muestra para ayudar a entender el problema.
En el código real, todo se delega a la clase Player, a un SoundLoader (que es básicamente playSound() aquí).
El problema es que, incluso con la delegación, incluso si el método playSound no está situado en el bucle principal,
se llama en el bucle principal, por lo que la ubicación del código no hace ninguna diferencia: no se reproducirá
ya que no se llamará fuera de un bucle como lo hacemos para la música de fondo (ver el código comentado después de main() {...,
la música de fondo funciona bien.*/
if(player.attack(ennemy)) {
playSound();
}
}
return EXIT_SUCCESS;
}
void playSound() {
sf::SoundBuffer buffer;
if(!buffer.loadFromFile(path)) {
std::cout << “El sonido no se encontró en ” << path << std::endl;
}
sf::Sound sound(buffer);
sound.play();
}
No dudes en hacer preguntas adicionales.
¡Gracias!
davy.ai
Solución para reproducir sonidos SFML en un bucle
Se puede lograr la reproducción de sonidos SFML en un bucle mediante el uso de un objeto
sf::SoundBuffer
y un objetosf::Sound
fuera del bucle. Luego cargue el búfer de sonido con el archivo de sonido y establezca el objeto de sonido como la fuente de sonido. Finalmente, al llamar al métodosf::Sound::play()
dentro del bucle while, el sonido se reproducirá en un bucle.Aquí hay un código de ejemplo actualizado:
“`c++
#include
#include
int main() {
int FPS = 60;
}
“`
Al cargar y establecer el búfer de sonido fuera del bucle while, se elimina la necesidad de cargar constantemente el archivo de sonido y, por lo tanto, se evita cualquier posible pérdida de memoria. Además, al llamar al método
sf::Sound::play()
dentro del bucle, el sonido se reproducirá en un bucle cuando sea desencadenado.¡Espero que esto ayude!