IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

SFML Discussion :

sf::Thread, vector, ..


Sujet :

SFML

  1. #1
    Membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Avril 2009
    Messages
    61
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2009
    Messages : 61
    Points : 56
    Points
    56
    Par défaut sf::Thread, vector, ..
    Bonjour à tous,

    Actuellement en plein développement d'un projet de Bomberman, je me trouve confronté à un étrange problème. Ma classe "Player" doit posséder un certain nombre de bombes (qui sont représentées par une classe Bomb) ; j'ai choisi de créer un attribut de type vector contenant des pointeurs vers des objets bombe.

    Pourquoi un vector de pointeurs ? Car ma classe "Bomb" dérive de sf::Thread (pour gérer la minuterie de la bombe), et ne peut donc pas être "copiée" dans un vecteur classique. Seulement, il se trouve que ce vecteur de pointeurs présentait des fuites mémoires (étant donné que les objets alloués n'étaient pas désalloués lors du pop_back). N'ayant pas réussi à faire ceci, j'ai essayé avec un vecteur de shared_ptr contenant chacun un objet de type bombe... Et bien ça compile, mais j'ai l'erreur suivante lorsque je veux poser une bombe : "An internal OpenAL call failed in sound.cpp (100) : AL_INVALID_NAME, an unaccept name has been specified"

    Auriez-vous une idée pour résoudre mon problème svp ?

    Voici la partie de mon code qui nous intéresse :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    std::vector<boost::shared_ptr<Bomb> > m_bombs;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    void Player::addBomb() {
    	m_bombs.push_back(boost::shared_ptr<Bomb> (new Bomb));
    }
     
    void Player::delBomb() {
    	if ( !m_bombs.empty() ) {
     
    		m_bombs.pop_back();
    	}
    }
    Merci d'avance

  2. #2
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    Salut

    L'erreur n'a plus rien à voir avec ton problème : c'est une erreur OpenAL, donc liée au module audio.

    Il faudrait que tu isoles la ligne qui provoque l'erreur, et que tu nous montres le code correspondant.

    PS : Bomb qui dérive de sf::Thread... ça sent l'erreur grossière. Tu as voulu faire quoi avec cette conception de classe ?

  3. #3
    Membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Avril 2009
    Messages
    61
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2009
    Messages : 61
    Points : 56
    Points
    56
    Par défaut
    Citation Envoyé par Laurent Gomila Voir le message
    L'erreur n'a plus rien à voir avec ton problème : c'est une erreur OpenAL, donc liée au module audio.
    Oui, ça j'avais compris, mais l'erreur survient justement une fois les vecteurs/etc implémentés, tout marche très bien avant. J'en ai donc déduis (bêtement ?) que ça venait de là.
    Concernant ma classe Bomb, elle dérive des éléments private comme proposé dans ce tuto : http://www.sfml-dev.org/tutorials/1....threads-fr.php

    L'idée, c'est que le joueur pose une bombe, et que celle-ci se gère toute seule (explosion après 3s par exemple) dans un thread annexe étant donné qu'il ne faut pas bloquer le reste du programme.

    J'ai upload l'ensemble de mon code, peut-être est-ce que ça vous aidera à y voir plus clair ? http://www.jeremy-dutheil.fr/projects/Bomberman.rar

  4. #4
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    L'idée, c'est que le joueur pose une bombe, et que celle-ci se gère toute seule (explosion après 3s par exemple) dans un thread annexe étant donné qu'il ne faut pas bloquer le reste du programme.
    C'est une erreur fréquente, malheureusement

    En gros, si tu lances un thread pour chaque objet qui doit gérer un timing, être animé, réflechir ou faire n'importe quoi qui dure un certain temps, tu vas vite tuer ton programme (chaque nouveau thread ajoute du stress à l'OS, qui doit gérer tout ce monde).

    L'idée c'est plutôt de gérer tous tes objets dans le même thread, en leur donnant la main régulièrement un court instant pour qu'ils se mettent à jour en fonction du laps de temps écoulé. Comme tu as une boucle principale qui carbure à plein de tours par seconde, ça se fait très bien.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    class Bomb
    {
    public :
     
        void Update(float elapsedTime)
        {
            myTotalTime += elapsedTime;
            if (myTotalTime > 3.f)
                Explode(); // boum
        }
     
    private :
     
        float myTotalTime;
    };
     
    int main()
    {
        // Initialisations...
        Bomb bomb;
        sf::Clock clock;
     
        // Boucle principale
        while (window.IsOpened())
        {
            // Gestion des évènements...
     
            // Mise à jour des entités...
            float time = clock.GetElapsedTime();
            bomb.Update(time);
            clock.Reset();
     
            // Affichage des entités...
     
            // Fin d'un tour de boucle
            window.Display();
        }
    }
    Du coup ton problème va disparaître tout seul, s'il est bien lié à l'utilisation de threads.

  5. #5
    Membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Avril 2009
    Messages
    61
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2009
    Messages : 61
    Points : 56
    Points
    56
    Par défaut
    Ok je vais essayer ça, merci.

  6. #6
    Membre confirmé Avatar de Bryce de Mouriès
    Profil pro
    CPI
    Inscrit en
    Mars 2007
    Messages
    219
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : CPI

    Informations forums :
    Inscription : Mars 2007
    Messages : 219
    Points : 558
    Points
    558
    Par défaut
    Je réalise également un Bomberman en SFML qui est assez bien avancé -> Bomberman SFML, tu peux trouver les sources en fouillant sur le topic.
    je confirme ce qu'a dit Laurent, un simple compteur dans ta classe suffit largement, simple et efficace ^^. De plus avec les threads si tu mets le jeu en pause tu serais obligé de mettre en pause chaque thread, alors qu'il suffit d'indiquer qu'il n'y pas de temps écoulé avec un compteur.
    Infinity - To The Top, shoot'em up développé en Haxe / OpenFL pour FLASH et Android, piou piou rythmé dans l'espace

Discussions similaires

  1. [Win] Thread passage Structure pointeur Vector + string
    Par jerem3000 dans le forum Threads & Processus
    Réponses: 2
    Dernier message: 31/10/2012, 15h24
  2. vector <string> paramètre thread
    Par parabole33 dans le forum Threads & Processus
    Réponses: 7
    Dernier message: 05/01/2012, 19h41
  3. Tri multi-threadé
    Par Tifauv' dans le forum C
    Réponses: 8
    Dernier message: 28/06/2007, 09h00
  4. Réponses: 5
    Dernier message: 12/06/2002, 15h12
  5. [Kylix] Pb de Thread !!
    Par Anonymous dans le forum EDI
    Réponses: 1
    Dernier message: 25/04/2002, 13h53

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo