As a small exercise I am trying to write a very small, simple game engine that just handles entities (moving, basic AI etc.)
As such, I am trying to think about how a game handles the updates for all of the entities, and I am getting a little bit confused (Probably because I am going about it in the wrong way)
So I decided to post this question here to show you my current way of thinking about it, and to see if anyone can suggest to me a better way of doing it.
Currently, I have a CEngine class which take pointers to other classes that it needs (For example a CWindow class, CEntityManager class etc.)
I have a game loop which in pseudo code would go like this (Within the CEngine class)
while(isRunning) {
Window->clear_screen();
EntityManager->draw();
Window->flip_screen();
// Cap FPS
}
My CEntityManager class looked like this:
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;
};
And my CEntity class looked like this:
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;
};
After that, I would create classes for example, for an enemy, and give it a sprite sheet, its own functions etc.
For example:
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();
};
All of this worked fine for just drawing sprites to the screen.
But then I came to the problem of using functions which exist in one entity, but not in another.
In the above pseudo code example, do_ai_stuff(); and handle_input();
As you can see from my game loop, there is a call to EntityManager->draw(); This just iterated through the entityVector and called the draw(); function for each entity - Which worked fine seeing as all entities have a draw(); function.
But then I thought, what if it is a player entity that needs to handle input? How does that work?
I haven't tried but I assume that I can't just loop through as I did with the draw() function, because entities like enemies won't have a handle_input() function.
I could use an if statement to check the entityType, like so:
for(entityVectorIter = entityVector.begin(); entityVectorIter != entityVector.end(); entityVectorIter++) {
if((*entityVectorIter)->get_type() == PLAYER) {
(*entityVectorIter)->handle_input();
}
}
But I don't know how people normally go about writing this stuff so I'm not sure of the best way to do it.
I wrote a lot here and I didn't ask any concrete questions, so I will clarify what I am looking for here:
- Is the way I have laid out/designed my code ok, and is it practical?
- Is there a better more efficient way for me to update my entities and call functions that other entities may not have?
- Is using an enum to keep track of an entities type a good way to identify entities?