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 44 45
| class World
{
std::vector< Entity > entities;
public:
void addEntity(Position pos, Entity* entity); // facile a coder pour l'instant
void removeEntity(Entity* entity); // facile a coder pour l'instant
void frameUpdate();
void moveEntity(Entity* entity, Position offset);
};
void World::frameUpdate()
{
//la fonction délicate; toute les entités doivent être mises a jour
// en fonction de ce qu'elles veulent faire, et de ce qu'elles peuvent faire =)
// je choisis de faire ainsi: chaque entité a un ControlBehaviour et ce
// controle behaviour est celui qui est appelé a chaque frame
for(std::vector it = entities.begin(); it != entities.end(); ++it)
{
entities->ControlBehaviour->frameUpdate(this);
// un control behaviour pourrait demander par exemple de
// déplacer l'entité dans le monde, ce qui va declencher un
// update de position, des collisions, etc etc
// par exemple si le player appuie sur droite, le ControlBehaviour
// du player va être appelé, vérifier l'input, demander au monde
// de deplacer l'entité vers la droite
}
}
void World::moveEntity(Entity* entity, Position offset)
{
bool doMove = true;
Position pos = getEntityPosition(entity);
newpos = pos + offset;
std::vector<Entity> entities = getEntitiesAtPosition();
for (collision in entities)
{
move &= collision->CollisionBehaviour->onCollision(collision, entity, world);
move &= entity->CollisionBehaviour->onCollision(entity, collision, world);
}
if (move)
{
// aucune collision n'a provoqué d'erreur =)
setEntityPosition(entity, newpos);
}
} |
Partager