Publicité
+ Répondre à la discussion
Affichage des résultats 1 à 6 sur 6
  1. #1
    Futur Membre du Club
    Profil pro Jérémy DUTHEIL
    Étudiant
    Inscrit en
    avril 2009
    Messages
    62
    Détails du profil
    Informations personnelles :
    Nom : Jérémy DUTHEIL

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : avril 2009
    Messages : 62
    Points : 19
    Points
    19

    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 :
    std::vector<boost::shared_ptr<Bomb> > m_bombs;
    Code :
    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 : 30
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : avril 2003
    Messages : 10 651
    Points : 16 141
    Points
    16 141

    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 ?
    Mieux que SDL : découvrez SFML

  3. #3
    Futur Membre du Club
    Profil pro Jérémy DUTHEIL
    Étudiant
    Inscrit en
    avril 2009
    Messages
    62
    Détails du profil
    Informations personnelles :
    Nom : Jérémy DUTHEIL

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : avril 2009
    Messages : 62
    Points : 19
    Points
    19

    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 : 30
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : avril 2003
    Messages : 10 651
    Points : 16 141
    Points
    16 141

    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 :
    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.
    Mieux que SDL : découvrez SFML

  5. #5
    Futur Membre du Club
    Profil pro Jérémy DUTHEIL
    Étudiant
    Inscrit en
    avril 2009
    Messages
    62
    Détails du profil
    Informations personnelles :
    Nom : Jérémy DUTHEIL

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : avril 2009
    Messages : 62
    Points : 19
    Points
    19

    Par défaut

    Ok je vais essayer ça, merci.

  6. #6
    Membre actif
    Inscrit en
    mars 2007
    Messages
    152
    Détails du profil
    Informations personnelles :
    Âge : 26

    Informations forums :
    Inscription : mars 2007
    Messages : 152
    Points : 161
    Points
    161

    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.

Liens sociaux

Règles de messages

  • Vous ne pouvez pas créer de nouvelles discussions
  • Vous ne pouvez pas envoyer des réponses
  • Vous ne pouvez pas envoyer des pièces jointes
  • Vous ne pouvez pas modifier vos messages
  •