#include "engine.hpp" #include /** * Fonction d'initialisation de la classe Engine */ Engine::Engine() { // initialise et ouvre la fenêtre window.create( sf::VideoMode(300, 150), "La cage de Jacob", sf::Style::Default & ~sf::Style::Resize, sf::ContextSettings(0, 0, 2) ); window.setVerticalSyncEnabled(true); // au démarrage, aucune touche n'est enfoncée goLeftKey = false; goRightKey = false; // boucle d'événements sur la fenêtre while (window.isOpen()) { sf::Event event; // traitement des évènements reçus while (window.pollEvent(event)) { // fermeture de la fenêtre if (event.type == sf::Event::Closed) { window.close(); } // une touche a été enfoncée if (event.type == sf::Event::KeyPressed) { if (event.key.code == sf::Keyboard::Left) { goLeftKey = true; } if (event.key.code == sf::Keyboard::Right) { goRightKey = true; } } // une touche a été relâchée if (event.type == sf::Event::KeyReleased) { if (event.key.code == sf::Keyboard::Left) { goLeftKey = false; } if (event.key.code == sf::Keyboard::Right) { goRightKey = false; } } } // réinitialise l'horloge à zéro // et stocke la différence de temps dans delta float delta = clock.restart().asSeconds(); update(delta); draw(); } } /** * Mise à jour de la physique du jeu */ void Engine::update(float delta) { for (int i = 0; i < balls.size(); i++) { sf::Vector2f forces(0, 0); // force de gravité forces += sf::Vector2f(0, Engine::GRAVITY); // déplacement de la balle après appui sur les touches de direction if (goLeftKey) { forces += sf::Vector2f(-Engine::MOVE, 0); } if (goRightKey) { forces += sf::Vector2f(Engine::MOVE, 0); } // force d'attraction entre les balles et les blocs for (int j = 0; j < balls.size(); j++) { if (i != j && balls[i].getCharge() && balls[j].getCharge()) { sf::Vector2f attraction(balls[i].getPosition() - balls[j].getPosition()); float distanceSquared = attraction.x * attraction.x + attraction.y * attraction.y; // normalisation du vecteur direction qui porte la force d'attraction attraction /= std::sqrt(distanceSquared); attraction *= Engine::ATTRACTION * ( (balls[i].getCharge() * balls[j].getCharge()) / distanceSquared ); forces += attraction; } } // TODO: COLLISIONS balls[i].update(forces, delta); } } /** * Dessine la scène du jeu couche par couche */ void Engine::draw() { // couche de fond window.clear(sf::Color(66, 165, 245)); // grille de blocs for (int i = 0; i < blocks.size(); i++) { blocks[i].draw(); } // dessin des balles for (int i = 0; i < balls.size(); i++) { balls[i].draw(); } }