2016-03-28 13:05:18 +00:00
|
|
|
#include "game.hpp"
|
2016-03-20 13:32:34 +00:00
|
|
|
#include "constants.hpp"
|
2016-03-04 15:29:31 +00:00
|
|
|
|
2016-04-03 19:05:27 +00:00
|
|
|
Game::Game(Manager& manager) : Level(manager),
|
2016-04-03 18:19:48 +00:00
|
|
|
next_frame_time(manager.getCurrentTime()) {}
|
2016-04-03 19:05:27 +00:00
|
|
|
Game::~Game() {}
|
2016-03-28 17:57:55 +00:00
|
|
|
|
2016-03-30 12:03:52 +00:00
|
|
|
void Game::frame() {
|
2016-04-03 18:19:48 +00:00
|
|
|
sf::Time current_time = manager.getCurrentTime();
|
|
|
|
|
|
|
|
if (current_time >= next_frame_time) {
|
|
|
|
// si nous sommes en retard ou dans les temps
|
|
|
|
// on replanifie la prochaine frame
|
|
|
|
next_frame_time += Constants::PHYSICS_TIME;
|
|
|
|
|
|
|
|
// on met à jour la physique d'un cran temporel
|
2016-03-30 12:03:52 +00:00
|
|
|
update();
|
2016-03-04 15:29:31 +00:00
|
|
|
|
2016-04-03 18:19:48 +00:00
|
|
|
// si on a encore suffisamment de temps, on dessine
|
|
|
|
if (current_time < next_frame_time) {
|
|
|
|
draw();
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
// si nous sommes en avance, on endort le processus
|
|
|
|
// le temps nécessaire pour revenir dans les temps
|
|
|
|
sf::sleep(next_frame_time - current_time);
|
|
|
|
}
|
2016-03-09 18:35:40 +00:00
|
|
|
}
|
|
|
|
|
2016-03-30 12:03:52 +00:00
|
|
|
void Game::update() {
|
2016-03-28 00:03:56 +00:00
|
|
|
std::vector<CollisionData> colliding;
|
|
|
|
|
|
|
|
// détection des objets en collision
|
2016-04-03 19:05:27 +00:00
|
|
|
for (unsigned int i = 0; i < getObjects().size(); i++) {
|
|
|
|
ObjectPtr objA = getObjects()[i];
|
2016-03-13 18:07:35 +00:00
|
|
|
|
2016-04-03 19:05:27 +00:00
|
|
|
for (unsigned int j = i + 1; j < getObjects().size(); j++) {
|
|
|
|
ObjectPtr objB = getObjects()[j];
|
2016-03-28 00:03:56 +00:00
|
|
|
CollisionData data(*objA, *objB);
|
|
|
|
|
|
|
|
if (objA->detectCollision(*objB, data)) {
|
|
|
|
colliding.push_back(data);
|
|
|
|
}
|
2016-03-13 18:07:35 +00:00
|
|
|
}
|
|
|
|
}
|
2016-03-27 21:43:05 +00:00
|
|
|
|
|
|
|
// intégration des forces dans la vitesse (première moitié)
|
2016-04-03 19:05:27 +00:00
|
|
|
for (unsigned int i = 0; i < getObjects().size(); i++) {
|
|
|
|
getObjects()[i]->updateVelocity(manager, getObjects(), Constants::PHYSICS_TIME.asSeconds() / 2);
|
2016-03-27 21:43:05 +00:00
|
|
|
}
|
|
|
|
|
2016-03-28 00:03:56 +00:00
|
|
|
// résolution des collisions détectées
|
|
|
|
for (unsigned int i = 0; i < colliding.size(); i++) {
|
|
|
|
CollisionData& collided = colliding[i];
|
|
|
|
collided.objA.solveCollision(collided.objB, collided.normal);
|
|
|
|
}
|
|
|
|
|
2016-03-27 21:43:05 +00:00
|
|
|
// intégration de la vitesse dans la position
|
2016-04-03 19:05:27 +00:00
|
|
|
for (unsigned int i = 0; i < getObjects().size(); i++) {
|
|
|
|
getObjects()[i]->updatePosition(Constants::PHYSICS_TIME.asSeconds());
|
2016-03-27 21:43:05 +00:00
|
|
|
}
|
|
|
|
|
2016-03-28 00:03:56 +00:00
|
|
|
// application de la correction positionnelle
|
|
|
|
for (unsigned int i = 0; i < colliding.size(); i++) {
|
|
|
|
CollisionData& collided = colliding[i];
|
|
|
|
collided.objA.positionalCorrection(
|
|
|
|
collided.objB, collided.normal, collided.depth
|
|
|
|
);
|
|
|
|
}
|
|
|
|
|
2016-03-27 21:43:05 +00:00
|
|
|
// intégration des forces dans la vitesse (seconde moitié)
|
2016-04-03 19:05:27 +00:00
|
|
|
for (unsigned int i = 0; i < getObjects().size(); i++) {
|
|
|
|
getObjects()[i]->updateVelocity(manager, getObjects(), Constants::PHYSICS_TIME.asSeconds() / 2);
|
2016-03-04 15:29:31 +00:00
|
|
|
}
|
|
|
|
}
|