Forum de la communauté SFML

Aide => Audio => Discussion démarrée par: ZeonSoldier le Janvier 25, 2019, 11:36:04 pm

Titre: Son qui ne se joue pas avec if(sf::Mouse::isButtonPressed(sf::Mouse::Left))
Posté par: ZeonSoldier le Janvier 25, 2019, 11:36:04 pm
Bonsoir,
désolé pour le titre à rallonge, je me dis que ça peut aider quelqu'un plus tard :D

Je vous explique, ça serait pour un projet de jeu éducatif, grosso modo en fonction de la position de la souris, cela va envoyer une valeur à la fonction qui suit afin de donner le chemin du fichier audio à charger et si la personne clique, le son est sensé se jouer.

Cependant cela ne marche pas et j'aimerais savoir si quelqu'un pourrait éclairer ma lanterne (je précise que le fichier audio a été testé dans un autre programme, il se lit normalement), je me demande si c'est pas le if avec le sf::Mouse::... étant donné que c'est une condition brève, je ne sais pas comment faire...

void soundPlayer(int &soundNumber)
{
    sf::SoundBuffer buffer;


    ostringstream pathBuilder;
    string path;

    pathBuilder << "files/" << soundNumber << ".wav";
    path = pathBuilder.str();

    if(!buffer.loadFromFile(path))
    cerr << "Erreur lors du chargement de " << path << endl;

    pathBuilder.str("");

    sf::Sound sound(buffer);

    if(sf::Mouse::isButtonPressed(sf::Mouse::Left))
    sound.play();

}
 

Désolé si la question a déjà été posée j'ai fait une recherche mais je ne suis pas retombé sur ce cas précis :(
Titre: Re: Son qui ne se joue pas avec if(sf::Mouse::isButtonPressed(sf::Mouse::Left))
Posté par: G. le Janvier 26, 2019, 12:33:07 am
Tes sf::Sound et sf::SoundBuffer sont déclarés localement dans la fonction soundPlayer et sont donc détruits à la fin de celle-ci. Et quand ils sont détruits le son s'arrête, il faut donc les déclarer ailleurs où ils auront une durée de vie plus longue.

En ce qui concerne ton isButtonPressed, il est peut être bizarrement placé mais suivant comment tu fais le reste qu'on voit pas ça peut marcher. Donc je ne sais pas mais c'est plutôt facile de savoir si tu rentres dans ce if ou pas :p
Titre: Re: Son qui ne se joue pas avec if(sf::Mouse::isButtonPressed(sf::Mouse::Left))
Posté par: ZeonSoldier le Janvier 27, 2019, 12:21:06 pm
Le problème c'est que j'ai tenté avec un vector<sf::SoundBuffer> que j'ai rempli avec un for(), je l'envoie dans la fonction mais le son ne se joue toujours pas :/

Titre: Re: Son qui ne se joue pas avec if(sf::Mouse::isButtonPressed(sf::Mouse::Left))
Posté par: ZeonSoldier le Janvier 28, 2019, 10:09:22 pm
Tes sf::Sound et sf::SoundBuffer sont déclarés localement dans la fonction soundPlayer et sont donc détruits à la fin de celle-ci. Et quand ils sont détruits le son s'arrête, il faut donc les déclarer ailleurs où ils auront une durée de vie plus longue.

En ce qui concerne ton isButtonPressed, il est peut être bizarrement placé mais suivant comment tu fais le reste qu'on voit pas ça peut marcher. Donc je ne sais pas mais c'est plutôt facile de savoir si tu rentres dans ce if ou pas :p

Désolé pour le double post mais je me demandais ce que tu entendais par "en ce qui concerne ton isButtonPressed, il est peut être bizarrement placé" ?
Titre: Re: Son qui ne se joue pas avec if(sf::Mouse::isButtonPressed(sf::Mouse::Left))
Posté par: G. le Janvier 28, 2019, 10:59:10 pm
Pour que tu rentres dans ton if(sf::Mouse::isButtonPressed(sf::Mouse::Left)) il faut que soundPlayer soit appelé à chaque frame, sinon tu risques de louper le moment où le bouton est pressé. C'est bizarre.
De plus, si c'est ce que tu fais (pour chaque son si tu en as plusieurs d'ailleurs) tu risques d'avoir des bons ralentissements car tu charges (loadFromFile) le son à chaque passage dans la fonction soundPlayer, et c'est une opération plutôt lourde généralement.

L'idéal (dans un premier temps) ça serait peut être de charger tous tes sons une fois à un moment donné dans ton appli (genre quand tu la lances par exemple :p ), et de jouer le son que tu veux quand tu détectes un appuie sur la souris.
Titre: Re: Son qui ne se joue pas avec if(sf::Mouse::isButtonPressed(sf::Mouse::Left))
Posté par: ZeonSoldier le Février 01, 2019, 10:29:11 am
Merci pour le commentaire, je te tiens au courant une fois le code retouché :D
Je vais déjà corriger le soucis du loadFromFile, pour ce qui est de l'appel à la fonction soundPlayer à chaque frame, théoriquement si l'appel et dans le main ça devrait être appelé à chaque fois non ?

Désolé en fait je fais ça en autodidacte en parallèle du travail ou autre quand j'ai le temps, il y a pas mal de réflexes que j'ai pas forcement acquis :s
Titre: Re: Son qui ne se joue pas avec if(sf::Mouse::isButtonPressed(sf::Mouse::Left))
Posté par: ZeonSoldier le Février 03, 2019, 11:38:18 am
J'ai suivi ton conseil, j'ai chargé tous les buffers et mêmes tous les sounds au lancement du programme, tout fonctionne parfaitement, merci pour les conseils ;)