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

C++ Discussion :

Gestion des sprites dans un SpriteManager


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé Avatar de trecks
    Étudiant
    Inscrit en
    Janvier 2007
    Messages
    91
    Détails du profil
    Informations personnelles :
    Âge : 38

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2007
    Messages : 91
    Par défaut Gestion des sprites dans un SpriteManager
    Bonjour à tous

    Voila mon pti problème : dans le cadre d'un moteur de jeu 2D (avec la lib SFML) je souhaite réaliser un SpriteManager qui gère l'affichage des sprites, les collisions entre eux... qu'ils soient statiques ou pas.
    Voici le code de la classe :
    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
     
    #ifndef __CSpriteManager_h__
    #define __CSpriteManager_h__
     
    #include <iostream>
    #include <vector>
    #include <SFML/Graphics.hpp>
    #include "CSingleton.h"
    #include "CSprite.h"
     
    namespace SLE
    {
        class CSpriteManager : public CSingleton<CSpriteManager>
        {
            friend class CSingleton<CSpriteManager>;
     
        public:
            //Enregistre un sprite
            void RegisterSprite(CSprite *pSprite);
     
            //Dessine tous les sprites selon leur ZOrder
            void DrawAll(sf::RenderWindow *pWindow);
     
            //Supprime un sprite du conteneur
            void DeleteSprite(CSprite *pSprite);
     
        private:
            CSpriteManager();
            virtual ~CSpriteManager();
     
            typedef std::vector<CSprite*> m_Vector;
     
            m_Vector m_SpriteVector;  //Conteneur des sprites
            m_Vector::iterator m_SpriteIter;    //Itérateur de parcours du conteneur
        };
    }
     
    #endif
    Mon problème est comme vous pouvez le voir que les méthodes RegisterSprite et DeleteSprite attendent en paramètres un POINTEUR sur un objet sprite ce qui veut dire que pour l'utilisateur tous les sprites qu'il veut créer et enregistrer dans le SpriteManager devront être des pointeurs sur des objets sprite et non des objets simples.
    Comment puis-je faire pour que l'utilisateur puisse enregistrer les 2 types de sprites ? (au début j'ai pensé faire 2 méthodes Register : une RegisterPointerSprite et une RegisterSprite mais ceci implique que je dois aussi utiliser 2 conteneurs de sprites, un pour les pointeurs sur objet sprite et un pour les objets sprites normaux).

    PS : sf::RenderWindow *pWindow signifie que l'on attend un pointeur sur la fenêtre SFML de destination

  2. #2
    Membre très actif
    Avatar de TheDrev
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    310
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Novembre 2006
    Messages : 310
    Par défaut
    Salut, je ne suis pas sûr, mais voila ce que je propose :

    A lieu d'attendre un pointeur, tes fonctions pourrait attendre une référence
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void RegisterSprite(CSprite &theSprite);
    et a l'appelle.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    //Soit  pSprite un pointeur
    mySpritManager.RegisterSprite(*pSprite);  //de-ref
     
    //Soit Sprite un ...Sprite
    mySpritManager.RegisterSprite(Sprite);

  3. #3
    Membre confirmé Avatar de trecks
    Étudiant
    Inscrit en
    Janvier 2007
    Messages
    91
    Détails du profil
    Informations personnelles :
    Âge : 38

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2007
    Messages : 91
    Par défaut
    A oué super j'y avais pas du tout pensé. Mais maintenant mon problème vient du destructeur qui ce charge de libérer de la mémoire les sprites et de vider le conteneur de son contenu

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    CSpriteManager::~CSpriteManager()
    {
        for(m_SpriteIter = m_SpriteVector.begin(); m_SpriteIter != m_SpriteVector.end(); m_SpriteIter++)
        {
            delete *m_SpriteIter;
            m_SpriteVector.pop_back();
        }
    }
    Ici j'ai mis delete *m_SpriteIter mais il peut ne pas s'agit d'un pointeur sur un objet sprite mais d'un objet sprite simple auquel cas le programme risque de planter

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

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    Il faut que tu définisses clairement qui doit gérer la durée de vie des sprites. Est-ce le manager ou bien ne fait-il que référencer des sprites externes ? Dans le premier cas il peut carrément stocker les sprites par valeur, dans le second il peut pointer dessus mais ne doit jamais les détruire.

  5. #5
    Membre confirmé Avatar de trecks
    Étudiant
    Inscrit en
    Janvier 2007
    Messages
    91
    Détails du profil
    Informations personnelles :
    Âge : 38

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2007
    Messages : 91
    Par défaut
    Et bien en fait c'est à la fois l'utilisateur et le spritemanager qui gère la durée de vie des sprites. Par exemple admettons dans mon jeu j'ai un petit lézard ennemi, je lui tire dessus il disparait de l'écran et donc de la mémoire puisqu'il ne sert plus à rien donc l'utilisateur dira :
    pSpriteManager->DeleteSprite(pLezard);

    Maintenat arrivé à la fin du niveau l'utilisateur ne vas pas faire cet appel pour chaque sprite du jeu mais c'est le spritemanager qui va supprimer de la mémoire tous les sprites restant, maintenant peut être que cette méthodes n'est pas bonne et que la gestion de la mémoire ne doit être faite que par le spritemanager

    Et de plus si je passe les sprites par valeur, je ne pourrai plus les supprimer dans le spritemanager lors de la fermeture du programme.

    PS : j'ai remplacé le conteneur list par un conteneur vector

Discussions similaires

  1. Utilisation de LESS dans la gestion des sprites (tiles)
    Par cahnory dans le forum Mise en page CSS
    Réponses: 0
    Dernier message: 06/12/2010, 15h18
  2. [Référencement] Gestion des "includes" dans Google
    Par odelayen dans le forum Référencement
    Réponses: 5
    Dernier message: 20/04/2005, 17h07
  3. [Sécurité]Gestion des accès dans plusieurs bases
    Par vincentj dans le forum Débuter
    Réponses: 1
    Dernier message: 05/01/2005, 14h19
  4. Gestion des headers dans un Makefile
    Par Weren dans le forum Autres éditeurs
    Réponses: 1
    Dernier message: 09/11/2004, 10h44
  5. [VB6] Gestion des erreurs dans une dll
    Par zimba-tm dans le forum VB 6 et antérieur
    Réponses: 8
    Dernier message: 02/08/2004, 11h20

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