Bienvenue, Invité. Merci de vous connecter ou de vous inscrire.
Avez-vous perdu votre e-mail d'activation ?

Auteur Sujet: Questionnement son + graphique  (Lu 3638 fois)

0 Membres et 1 Invité sur ce sujet

AlexisAG

  • Newbie
  • *
  • Messages: 7
    • Voir le profil
    • E-mail
Questionnement son + graphique
« le: Février 12, 2017, 01:51:11 pm »
Bonjour tout le monde.

Alors voilà je rencontre plusieurs soucis avec la sfml 2.4.1.

Lorsque je créer une classe et que dan celle-ci je créer un élément audio ou graphique, il ne se joue pas/ne se dessine pas, lorsque je j'instancie un objet de cette classe et que j'appel la méthode.

Petit exemple :
 
        sf::SoundBuffer buffer;
        buffer.loadFromFile(PATH_SOUND);
        sf::Sound sound;
        sound.setBuffer(buffer);
        sound.setAttenuation(80.f);
        addBullet();
        sound.play();
 

Voilà se morceau de code appartient à une de mes classes, le son devrait être joué, mais non... ( à la base j'avais créer un buffer et un sound en attribut et je les affectais dans le constructeur, mais ça ne fonctionnais pas non plus... )

et c'est la même chose pour les éléments graphique !
Ma classe possède un vector d'objet d'une autre classe qui elle est en fait un Cercle ( d'SFML ). et bien lorsque je dessine les objets du vector, rien n'apparait ! pourtant les objets sont bien dessiner ( en fait c'est une classe bullet si le cercle me touche je meurt, voilà comment je sais qu'il fonctionne!).

Si quelqu'un sait d'ou provient le problème je suis preneur, merci.
« Modifié: Février 16, 2017, 04:01:03 pm par AlexisAG »

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32498
    • Voir le profil
    • SFML's website
    • E-mail
Re : Questionnement son + graphique
« Réponse #1 le: Février 12, 2017, 04:08:51 pm »
Il faudrait que tu nous fournisses un exemple complet minimal, parce que là c'est très vague.
Laurent Gomila - SFML developer

AlexisAG

  • Newbie
  • *
  • Messages: 7
    • Voir le profil
    • E-mail
Re : Questionnement son + graphique
« Réponse #2 le: Février 12, 2017, 07:24:02 pm »
Voici la méthode permettant de créer une bullet et de la positionner sur la tourelle. Un son est sensé être joué ( mais ne fonctionne pas )
la constante PATH_SOUND est déjà utilisé ailleurs est fonctionne.
void Trap::shoot(TileMap *map, Player *player)
{
    sf::Time wait = sf::microseconds(250000);
    if(p_dir==0 && p_pos.x-player->getPos().x<=150)
    {
        printf("FONCTION SHOOT TRAP \n");
        sf::sleep(wait);
        sf::SoundBuffer buffer;
        buffer.loadFromFile(PATH_SOUND);
        sf::Sound sound;
        sound.setBuffer(buffer);
        sound.setAttenuation(80.f);
        Bullet bullet(sf::Color::Blue);
        bullet.shoot(p_pos,p_dir); //positionne la bullet
        addBullet(); // ajoute la bullet au vector<Bullet> de Trap avec passage par référence
        sound.play(); // ne fonctionne pas

    }
    for(unsigned int i=0; i<p_bullet.size();i++)
    {
        if(p_bullet[i].getIndex(map)==player->getIndex(map))
            player->setAlive(false);
    }
}
 

La fonction se déclenche bien puisque dans la console j'ai bien le message de mon printf. Et les bullet se créer puisque si je saute sur la tourelle je meurt.

Concernant l'affichage des bullet de mon Trap voici la fonction draw :
void Trap::draw(sf::RenderWindow &window, TileMap &map, int level[], sf::View &view, sf::Time deltaTime)
{
    if(isDrawable())
    {
        if(p_type==1)
        {
            for(unsigned int i=0; i<p_bullet.size();i++)
            {
                if(!p_bullet[i].draw(&window,&map,level,view,deltaTime))
                    delBullet(i);
            }
        }
        p_sprite.setPosition(p_pos);
        window.draw(p_sprite);
    }
}
 

Et la fonction draw de Bullet :
bool Bullet::draw(sf::RenderWindow *window, TileMap *map, int level[], sf::View &view, sf::Time deltaTime)
{
    setIndex(map);
    isVisible(view,p_dir,map,level); // check if the bullet is visible
    printf("FONCTION DRAW BULLET \n");
    if(p_isVisible)
    {
        switch(p_dir)
        {
        case 0:
            p_circle.move(-SPEED_BULLET*deltaTime.asSeconds(),0);
            break;
        case 1:
            p_circle.move(SPEED_BULLET*deltaTime.asSeconds(),0);
            break;
        case 2:
            p_circle.move(0,-SPEED_BULLET*deltaTime.asSeconds());
            break;
        case 3:
            p_circle.move(0,SPEED_BULLET*deltaTime.asSeconds());
            break;
        }
        p_pos = p_circle.getPosition();
        window->draw(p_circle);
        return true;
    }
    printf("non Visible \n");
    return false;
}
 

La fonction draw de Bullet ne se déclenche même pas ( pas le message dans la console )
Normalement cette dernière fonctionne parfaitement car déjà utilisé pour mon joueur et aucun soucis.

G.

  • Hero Member
  • *****
  • Messages: 1593
    • Voir le profil
Re : Questionnement son + graphique
« Réponse #3 le: Février 12, 2017, 08:04:10 pm »
Les sons (et les musiques) sont jouées dans un thread à part. Cela signifie que vous pouvez faire tout ce que vous voulez après avoir appelé play() (sauf détruire le son ou son buffer, bien entendu), le son va continuer de jouer jusqu'à ce qu'il se termine ou soit stoppé explicitement.
Comme toutes les variables locales, ton sf::Sound et sf::SoundBuffer sont détruits à la fin du bloc où ils sont déclarés, c'est à dire à la fin du if. Donc à peine t'as appelé play que ton son est détruit et n'est donc jamais joué.
Il faut que tu les crées ailleurs, de sorte à ce qu'ils ne soient pas détruits prématurément.
« Modifié: Février 12, 2017, 08:05:43 pm par G. »

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32498
    • Voir le profil
    • SFML's website
    • E-mail
Re : Questionnement son + graphique
« Réponse #4 le: Février 12, 2017, 08:10:32 pm »
Et je ne vois pas comment ta fonction addBullet sans paramètre peut ajouter où que ce soit le Bullet que tu viens de créer.
Laurent Gomila - SFML developer

AlexisAG

  • Newbie
  • *
  • Messages: 7
    • Voir le profil
    • E-mail
Re : Re : Questionnement son + graphique
« Réponse #5 le: Février 12, 2017, 08:17:22 pm »
Les sons (et les musiques) sont jouées dans un thread à part. Cela signifie que vous pouvez faire tout ce que vous voulez après avoir appelé play() (sauf détruire le son ou son buffer, bien entendu), le son va continuer de jouer jusqu'à ce qu'il se termine ou soit stoppé explicitement.
Comme toutes les variables locales, ton sf::Sound et sf::SoundBuffer sont détruits à la fin du bloc où ils sont déclarés, c'est à dire à la fin du if. Donc à peine t'as appelé play que ton son est détruit et n'est donc jamais joué.
Il faut que tu les crées ailleurs, de sorte à ce qu'ils ne soient pas détruits prématurément.

Oui mais comme je l'ai dit, à la base j'avais créer un attribut buffer et un attribut sound, et que j'initialisais le tout dans le constructeur, et ça ne marchais pas.

Et je ne vois pas comment ta fonction addBullet sans paramètre peut ajouter où que ce soit le Bullet que tu viens de créer.

J'ai mal copié désolé, bien évidemment je met ma bullet en paramètre ^^ 

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32498
    • Voir le profil
    • SFML's website
    • E-mail
Re : Questionnement son + graphique
« Réponse #6 le: Février 12, 2017, 10:31:54 pm »
Citer
Oui mais comme je l'ai dit, à la base j'avais créer un attribut buffer et un attribut sound, et que j'initialisais le tout dans le constructeur, et ça ne marchais pas.
Ca aurait déjà plus de chances de marcher que ce code-là ;)

Citer
J'ai mal copié désolé, bien évidemment je met ma bullet en paramètre ^^
Comment peux-tu te tromper en faisant un copier-coller ? ???
Laurent Gomila - SFML developer

AlexisAG

  • Newbie
  • *
  • Messages: 7
    • Voir le profil
    • E-mail
Re : Re : Questionnement son + graphique
« Réponse #7 le: Février 12, 2017, 11:19:46 pm »
Citer
Oui mais comme je l'ai dit, à la base j'avais créer un attribut buffer et un attribut sound, et que j'initialisais le tout dans le constructeur, et ça ne marchais pas.
Ca aurait déjà plus de chances de marcher que ce code-là ;)

Citer
J'ai mal copié désolé, bien évidemment je met ma bullet en paramètre ^^
Comment peux-tu te tromper en faisant un copier-coller ? ???

Je n'ai pas vraiment copié collé, le code ne possède pas cette faute là c'est tout ^^
Et pour le son, j'ai remis le système de buffer et sound en attribut que j'initialise dans le constructeur, mais toujours rien. Pourtant cela devrait fonctionner étant donné que le buffer n'est pas détruit..

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32498
    • Voir le profil
    • SFML's website
    • E-mail
Re : Questionnement son + graphique
« Réponse #8 le: Février 13, 2017, 06:33:24 am »
Citer
Je n'ai pas vraiment copié collé, le code ne possède pas cette faute là c'est tout
Il faut toujours copier-coller le code original, si on fait quoique ce soit d'autre on introduit forcément des erreurs.

Citer
Et pour le son, j'ai remis le système de buffer et sound en attribut que j'initialise dans le constructeur, mais toujours rien.
Je pense que ton problème vient de la copie des instances de Bullet. Peut-on voir le constructeur de Bullet ainsi que la fonction addBullet ?
Laurent Gomila - SFML developer

AlexisAG

  • Newbie
  • *
  • Messages: 7
    • Voir le profil
    • E-mail
Re : Questionnement son + graphique
« Réponse #9 le: Février 13, 2017, 09:42:42 am »
Voici mes constructeurs pour Bullet
/** CONSTRUCTOR && DESTRUCTOR **/
Bullet::Bullet()
{
    p_isVisible=true;
    p_circle.setRadius(RADIUS_BULLET);
    p_circle.setFillColor(sf::Color::Red);
}
Bullet::Bullet(sf::CircleShape circle)
{
    p_isVisible=true;
    p_circle.setRadius(circle.getRadius());
    p_circle.setFillColor(sf::Color::Red);

}
Bullet::Bullet(sf::Color color)
{
    p_isVisible=true;
    p_circle.setRadius(RADIUS_BULLET);
    p_circle.setFillColor(color);

}
Bullet::Bullet(sf::CircleShape circle, sf::Color color)
{
    p_isVisible=true;
    p_circle.setRadius(circle.getRadius());
    p_circle.setFillColor(color);
}
// destructor
Bullet::~Bullet()
{
   
}
 

Et voici la fonction addBullet() elle n'a rien de spécial :
void Trap::addBullet(Bullet &bullet)
{
    p_bullet.push_back(bullet);
}
 

p_bullet étant un vector<Bullet> en attribut.
Le son est géré du tir est toutefois sensé être géré par la classe Trap, le buffer est initialiser dans le constructeur de celui-ci puis le j'attribut le buffer au sound toujours dans le constructeur. Le buffer et le sound sont en attribut, mais toujours pas de son..

AlexisAG

  • Newbie
  • *
  • Messages: 7
    • Voir le profil
    • E-mail
Re : Questionnement son + graphique
« Réponse #10 le: Février 14, 2017, 07:41:18 pm »
Bonsoir,
J'apportes quelques précisions.

En fait la fonction shoott tourne dans un thread alors que la fonction draw tourne dans la boucle du jeu.

JJ'ai fais le test de créer un Trap et de faire tourner la fonction shoot et draww dans la boucle du jeu, et là.. j'ai bbien le son qui se lance, mais toujours pas d'affichage des bullets !

Le thread si jamais :
void thread_trap(sf::RenderWindow *window, TileMap *map, Player *player, int level[], std::array<Trap,NB_TRAP> &v_trap)
{
    sf::Clock clock;
    sf::View view;
    while(player->isAlive() && window->isOpen())
    {
        sf::Time deltaTime = clock.restart();
        //get view
        view = window->getView();
        //launch all
        for(unsigned int i=0; i<NB_TRAP; i++)
            v_trap[i].launch(window,map,player,level,view,deltaTime,player->getBulletVector());
    }
}
 

EDIT : Voici le lien vers mon drive ou se situe les fichiers du projet. https://drive.google.com/drive/folders/0B38UTGF6GjZffjk3RVV2bmhseVk5eXFtY1RfX3FhX3g4TG0wZWhXRnRRaU5mZ3FycWgwSUk?usp=sharing
« Modifié: Février 15, 2017, 10:28:42 am par AlexisAG »