#include "game.hpp" #include "constants.hpp" #include #include Game::Game() : accumulator(0.f) { if (!music.openFromFile("./res/music_lvl1.wav")) { // erreur } music.play(); music.setVolume(15); music.setLoop(true); } void Game::addObject(Object& object) { objects.push_back(&object); } void Game::frame(Manager& manager) { accumulator += manager.getElapsedTime(); // tant qu'il reste du temps à passer, // effectuer la simulation physique étape par étape while (accumulator >= Constants::PHYSICS_TIME) { accumulator -= Constants::PHYSICS_TIME; update(manager); } draw(manager); } void Game::update(const Manager& manager) { std::vector colliding; // détection des objets en collision for (unsigned int i = 0; i < objects.size(); i++) { Object* objA = objects[i]; for (unsigned int j = i + 1; j < objects.size(); j++) { Object* objB = objects[j]; CollisionData data(*objA, *objB); if (objA->detectCollision(*objB, data)) { colliding.push_back(data); } } } // intégration des forces dans la vitesse (première moitié) for (unsigned int i = 0; i < objects.size(); i++) { objects[i]->updateVelocity(manager, objects, Constants::PHYSICS_TIME / 2); } // 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); } // intégration de la vitesse dans la position for (unsigned int i = 0; i < objects.size(); i++) { objects[i]->updatePosition(Constants::PHYSICS_TIME); } // 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 ); } // intégration des forces dans la vitesse (seconde moitié) for (unsigned int i = 0; i < objects.size(); i++) { objects[i]->updateVelocity(manager, objects, Constants::PHYSICS_TIME / 2); } } void Game::draw(Manager& manager) { // efface la scène précédente et dessine la couche de fond manager.getWindow().clear(sf::Color(66, 165, 245)); // chargement de la file d'affichage des objets std::priority_queue, ObjectCompare> display_queue; for (unsigned int i = 0; i < objects.size(); i++) { display_queue.push(objects[i]); } // dessin des objets de la file d'affichage couche par couche while (!display_queue.empty()) { display_queue.top()->draw(manager); display_queue.pop(); } manager.getWindow().display(); }