Précédent   Forum du club des développeurs et IT Pro > Applications > Développement 2D, 3D et Jeux > API graphiques > SFML
SFML Forum d'entraide sur l'API SFML
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 30/03/2010, 16h09   #1
NainTernaute
Membre à l'essai
 
Jérémy DUTHEIL
Étudiant
Inscription : 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 : 20
Points : 20
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
NainTernaute est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/03/2010, 16h24   #2
Laurent Gomila
Rédacteur
 
Avatar de Laurent Gomila
 
Développeur informatique
Inscription : avril 2003
Messages : 10 651
Détails du profil
Informations personnelles :
Âge : 29
Localisation : France, Moselle (Lorraine)

Informations professionnelles :
Activité : Développeur informatique

Informations forums :
Inscription : avril 2003
Messages : 10 651
Points : 17 860
Points : 17 860
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
Laurent Gomila est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/03/2010, 17h01   #3
NainTernaute
Membre à l'essai
 
Jérémy DUTHEIL
Étudiant
Inscription : 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 : 20
Points : 20
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
NainTernaute est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/03/2010, 18h46   #4
Laurent Gomila
Rédacteur
 
Avatar de Laurent Gomila
 
Développeur informatique
Inscription : avril 2003
Messages : 10 651
Détails du profil
Informations personnelles :
Âge : 29
Localisation : France, Moselle (Lorraine)

Informations professionnelles :
Activité : Développeur informatique

Informations forums :
Inscription : avril 2003
Messages : 10 651
Points : 17 860
Points : 17 860
Citation:
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
Laurent Gomila est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/03/2010, 23h31   #5
NainTernaute
Membre à l'essai
 
Jérémy DUTHEIL
Étudiant
Inscription : 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 : 20
Points : 20
Ok je vais essayer ça, merci.
NainTernaute est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 31/03/2010, 14h24   #6
Bryce de Mouriès
Membre actif
 
Inscription : mars 2007
Messages : 152
Détails du profil
Informations personnelles :
Âge : 25

Informations forums :
Inscription : mars 2007
Messages : 152
Points : 166
Points : 166
Envoyer un message via MSN à Bryce de Mouriès
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.
Bryce de Mouriès est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 18h46.


 
 
 
 
Partenaires

Hébergement Web