La manipulation d'entités dans un jeu

Comme un petit exercice que je suis en train d'écrire un très petit, simple moteur de jeu qui vient de poignées entités (déménagement, base de l'IA, etc.)

En tant que tel, je suis en train de penser à la façon d'un jeu gère les mises à jour pour l'ensemble des entités, et je suis un peu confus (Probablement parce que je vais à ce sujet dans le mauvais sens)

J'ai donc décidé de poster cette question ici de vous montrer ma façon actuelle de penser à ce sujet, et à voir si quelqu'un peut me font croire à une meilleure façon de le faire.

Actuellement, j'ai un CEngine classe qui prennent des pointeurs vers d'autres classes dont il a besoin (Par exemple un CWindow classe, CEntityManager classe etc.)

J'ai une boucle de jeu qui en pseudo code irait comme ceci (Dans le CEngine classe)

while(isRunning) {
    Window->clear_screen();

    EntityManager->draw();

    Window->flip_screen();

    //Cap FPS
}

Mon CEntityManager classe ressemblait à ceci:

enum {
    PLAYER,
    ENEMY,
    ALLY
};

class CEntityManager {
    public:
        void create_entity(int entityType); //PLAYER, ENEMY, ALLY etc.
        void delete_entity(int entityID);

    private:
        std::vector<CEntity*> entityVector;
        std::vector<CEntity*> entityVectorIter;
};

Et mon CEntity classe ressemblait à ceci:

class CEntity() {
    public:
        virtual void draw() = 0;
        void set_id(int nextEntityID);
        int get_id();
        int get_type();

    private:
        static nextEntityID;
        int entityID;
        int entityType;
};

Après, j'aurais créer des classes par exemple, pour un ennemi, et de lui donner une feuille sprite, ses propres fonctions, etc.

Par exemple:

class CEnemy : public CEntity {
    public:
        void draw(); //Implement draw();
        void do_ai_stuff();

};

class CPlayer : public CEntity {
    public:
        void draw(); //Implement draw();
        void handle_input();
};

Tout cela a bien fonctionné pour juste dessiner des sprites à l'écran.

Mais puis je suis venu sur le problème de l'utilisation de fonctions qui existent dans une seule entité, mais pas dans un autre.

Dans le pseudo-code ci-dessus exemple, do_ai_stuff(); et handle_input();

Comme vous pouvez le voir sur ma boucle de jeu, il est un appel à l'EntityManager->draw();
Cette juste itérer le entityVector et a appelé le tirage au sort(); la fonction pour chaque entité - ce Qui a bien fonctionné vu que toutes les entités ont un tirage au sort(); fonction.

Mais ensuite j'ai pensé, si c'est un joueur de l'entité qui doit gérer les signaux d'entrée?
Comment cela fonctionne?

Je n'ai pas essayé mais je suppose que je ne peux pas juste en boucle comme je l'ai fait avec le tirage au sort() de la fonction, parce que des entités telles que les ennemis n'ont pas une handle_input() fonction.

Je pourrais utiliser une instruction if pour vérifier la entityType, comme suit:

for(entityVectorIter = entityVector.begin(); entityVectorIter != entityVector.end(); entityVectorIter++) {
    if((*entityVectorIter)->get_type() == PLAYER) {
        (*entityVectorIter)->handle_input();
    }
}

Mais je ne sais pas comment les gens vont normalement sur l'écriture de ce genre de choses donc je ne suis pas sûr de la meilleure façon de le faire.

J'ai écrit beaucoup de choses ici, et je ne me posais pas de questions concrètes, donc je vais préciser ce que je recherche ici:

  • Est la façon dont j'ai disposé/conçu mon code ok, et est-il pratique?
  • Est-il un meilleur moyen plus efficace pour moi de mettre à jour mes entités et fonctions d'appel que d'autres entités peuvent ne pas avoir?
  • Est à l'aide d'un enum pour garder une trace de l'une des entités de type un bon moyen d'identifier les entités?

OriginalL'auteur Jake Lucas | 2010-11-06