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 :

Mise en place d'un Entity System : Problème de template.


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti

    Inscrit en
    Avril 2012
    Messages
    16
    Détails du profil
    Informations forums :
    Inscription : Avril 2012
    Messages : 16
    Par défaut Mise en place d'un Entity System : Problème de template.
    Bonjour,

    J'ai récemment découvert le principe de l'Entity System et j'éprouve quelques difficultés à le mettre en place / comprendre certains principes.

    Explications

    Actuellement j'ai réussi à obtenir un code qui me permet de faire cela :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    // Création d'une nouvelle entité.
    Entity* entity = game.createEntity();
     
    // Configuration.
    entity->addComponent( new TransformableComponent() )
    			->setPosition( 15, 50 )
    			->setRotation( 90 )
    		->addComponent( new PhysicComponent() )
    			->setMass( 70 )
    		->addComponent( new SpriteComponent() )
                            ->setTexture( "name.png" )
                            ->addToSystem( new RendererSystem() );
    Si j'ai bien compris l'Entity System, chaque System possède une liste de composants/component sur lequelle il travaille :

    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
    39
    40
    41
    42
    43
     
    class Component;
     
    /////////////////////////////////////////////////
    /// \brief  An abstract system. (Interface)
    ///
    /////////////////////////////////////////////////
    class System
    {
    public:
     
    	/////////////////////////////////////////////////
    	/// \brief Call when process is created.
    	///
    	/////////////////////////////////////////////////
    	virtual bool start() = 0;
     
    	/////////////////////////////////////////////////
    	/// \brief Call when process is updated.
    	///
    	/////////////////////////////////////////////////       
    	virtual void update() = 0;
     
    	/////////////////////////////////////////////////
    	/// \brief Call when process is removed.
    	///
    	/////////////////////////////////////////////////
    	virtual void end() = 0;
     
    	/////////////////////////////////////////////////
    	/// \brief Call when process is removed.
    	///
    	/////////////////////////////////////////////////
    	virtual void addComponent( Component* component )
        {
            elements.push_back( component );
        }
     
    protected:
     
        std::vector<Component*> elements;
     
    };
    (j'ai mis le code dans le .h le temps de tester si ça peur rassurer ^^)

    Le problème

    Je souhaite ajouter un Component de type T à un System contenant une liste d'éléments de type X.

    Concrètement :
    J'ai actuellement :
    std::vector<Component*> elements;

    J'aimerais avoir quelque chose du genre :
    std::vector<T*> elements;

    Ma classe System est une classe abstraite. Les classes qui héritent de cette classe doivent avoir une liste d'élément de type T donc et non Component. (Afin d'avoir accès aux méthodes de l'objet en question).

    Solution possible

    j'ai tenté de mettre ma classe "System" en tant que class template, du coup j'ai juste à indiquer le type de classe au moment de l'héritage :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    class Renderer : System<Drawable>
    Le soucis c'est que j'ai un System manager qui contient un conteneur de System et il n'apprecie pas le "std::vector<System> systems".

    Auriez-vous une solution à mon problème ? Est ce que je suis dans le bon sujet pour cette question ?

    Merci d'avance.
    Dono.

  2. #2
    Membre averti

    Inscrit en
    Avril 2012
    Messages
    16
    Détails du profil
    Informations forums :
    Inscription : Avril 2012
    Messages : 16
    Par défaut
    J'ai finalement revu l'architecture du code afin d'éviter ce problème. De plus mon architecture n'était pas vraiment basé sur "l'Entity System" puisque mes entités stockent leurs composants, ce qui n'est pas le cas dans une véritable architecture EntitySystem.

  3. #3
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Par défaut
    Salut,
    Une approche, c'est le type erasure
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    class SystemBase
    {
    };
    template<class Compontent>
    class System : public SystemBase
    {
    };
    std::vector<std::unique_ptr<SystemBase>> systems;

    Edit, si tous tes types sont connus à la compilation, tuple à la place de ton vecteur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    template<class Compontent>
    class System
    {
    };
     
    typedef std::tuple<System<Drawable>, System<Movable>> systems_list;
    Voir aussi Boost.fusion

  4. #4
    Membre Expert
    Avatar de Joel F
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Septembre 2002
    Messages
    918
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2002
    Messages : 918
    Par défaut
    et le tout frais Boost.TypeErasure

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 2
    Dernier message: 12/02/2013, 18h26
  2. [MySQL] Mise en place d'un serveur web: Problème avec Apache? ou MySQL?
    Par skandhal dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 24/11/2010, 18h05
  3. Problème de mise en place de datasource pour Hibernate
    Par K-Kaï dans le forum Tomcat et TomEE
    Réponses: 6
    Dernier message: 27/07/2006, 10h41
  4. Problème de mise en place de la log4j
    Par pitit777 dans le forum Logging
    Réponses: 2
    Dernier message: 28/03/2006, 15h17

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