es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿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!

Tags:  ,

Answer

  1. Avatar for 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 objeto sf::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étodo sf::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;

    // 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);
    
    // Cargar el búfer de sonido fuera del bucle
    sf::SoundBuffer buffer;
    if(!buffer.loadFromFile("ruta/al/sonido.wav")) {
        std::cout << "Archivo de sonido no encontrado" << std::endl;
    }
    
    // Establecer la fuente de sonido para el objeto de sonido
    sf::Sound sound(buffer);
    
    //Bucle principal
    while (app.isOpen()) {
        // Lógica del juego...
    
        // Reproducir el sonido en un bucle
        if(player.getHit()) {
            sound.play();
        }
    }
    
    return EXIT_SUCCESS;
    

    }
    “`

    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!

Comments are closed.