From 4cc2bfa1975298780816a8ecd951ad4d16ea1552 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Matt=C3=A9o=20Delabre?= Date: Sun, 13 Mar 2016 17:03:56 +0100 Subject: [PATCH] =?UTF-8?q?R=C3=A9duction=20de=20l'utilisation=20de=20la?= =?UTF-8?q?=20m=C3=A9moire=20dans=20les=20fonctions=20critiques?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- include/ball.hpp | 4 +-- include/block.hpp | 4 +-- include/engine.hpp | 8 ++--- include/{state.hpp => engine_state.hpp} | 15 ++++++--- include/object.hpp | 4 +-- include/physics_object.hpp | 6 ++-- src/ball.cpp | 6 ++-- src/block.cpp | 2 +- src/engine.cpp | 42 +++++++------------------ src/physics_object.cpp | 22 ++++++------- 10 files changed, 46 insertions(+), 67 deletions(-) rename include/{state.hpp => engine_state.hpp} (58%) diff --git a/include/ball.hpp b/include/ball.hpp index 28b0478..9369000 100644 --- a/include/ball.hpp +++ b/include/ball.hpp @@ -3,7 +3,7 @@ #include #include -#include "state.hpp" +#include "engine_state.hpp" #include "physics_object.hpp" class Ball : public PhysicsObject { @@ -14,7 +14,7 @@ protected: /** * Calcule les forces appliquées à l'objet */ - virtual sf::Vector2f getForces(State state); + virtual sf::Vector2f getForces(EngineState& state); static constexpr float ATTRACTION = 25000; static constexpr float MOVE = 100; diff --git a/include/block.hpp b/include/block.hpp index 669b644..9d39a74 100644 --- a/include/block.hpp +++ b/include/block.hpp @@ -4,7 +4,7 @@ #include #include #include "object.hpp" -#include "state.hpp" +#include "engine_state.hpp" class Block : public Object { protected: @@ -27,7 +27,7 @@ public: * Met à jour l'objet juste avant le dessin d'une frame * Reçoit l'état actuel du moteur */ - void update(State state); + void update(EngineState& state); /** * Détermine la couche d'affichage de l'objet diff --git a/include/engine.hpp b/include/engine.hpp index ec11e23..47efd34 100644 --- a/include/engine.hpp +++ b/include/engine.hpp @@ -1,9 +1,9 @@ #ifndef __PTF_ENGINE_HPP__ #define __PTF_ENGINE_HPP__ -#include #include #include "object.hpp" +#include "engine_state.hpp" /** * La classe principale Engine coordonne les éléments @@ -13,11 +13,7 @@ class Engine { private: sf::Clock clock; sf::RenderWindow window; - - bool goLeftKey; - bool goRightKey; - - std::vector objects; + EngineState state; /** * Met à jour les objets du jeu pour diff --git a/include/state.hpp b/include/engine_state.hpp similarity index 58% rename from include/state.hpp rename to include/engine_state.hpp index e7016a7..2b96563 100644 --- a/include/state.hpp +++ b/include/engine_state.hpp @@ -1,7 +1,8 @@ -#ifndef __PTF_STATE_HPP__ -#define __PTF_STATE_HPP__ +#ifndef __PTF_ENGINE_STATE_HPP__ +#define __PTF_ENGINE_STATE_HPP__ #include +#include // pré-déclaration de Object pour éviter les erreurs de compilation // Object est définie dans object.hpp @@ -12,11 +13,15 @@ class Object; * Cette structure est passée aux objets pour qu'ils se * mettent à jour en fonction de cet état */ -struct State { +struct EngineState { std::vector objects; - bool goLeftKey; - bool goRightKey; + std::array keys; float delta; + + EngineState() { + // aucune touche n'est enfoncée au démarrage + keys.fill(false); + } }; #endif diff --git a/include/object.hpp b/include/object.hpp index 0381cd9..31e2b33 100644 --- a/include/object.hpp +++ b/include/object.hpp @@ -2,7 +2,7 @@ #define __PTF_OBJECT_HPP__ #include -#include "state.hpp" +#include "engine_state.hpp" class Object { protected: @@ -22,7 +22,7 @@ public: * Met à jour l'objet juste avant le dessin d'une frame * Reçoit l'état actuel du moteur */ - virtual void update(State state) = 0; + virtual void update(EngineState& state) = 0; /** * Détermine la couche d'affichage de l'objet diff --git a/include/physics_object.hpp b/include/physics_object.hpp index ce95211..fa4951d 100644 --- a/include/physics_object.hpp +++ b/include/physics_object.hpp @@ -4,7 +4,7 @@ #include #include #include "object.hpp" -#include "state.hpp" +#include "engine_state.hpp" class PhysicsObject : public Object { protected: @@ -17,7 +17,7 @@ protected: /** * Calcule les forces appliquées à l'objet */ - virtual sf::Vector2f getForces(State state); + virtual sf::Vector2f getForces(EngineState& state); static constexpr float GRAVITY = 20; @@ -35,7 +35,7 @@ public: * Met à jour la physique de l'objet juste avant le dessin d'une frame * Reçoit l'état actuel du moteur */ - void update(State state); + void update(EngineState& state); /** * Récupère la vitesse de l'objet diff --git a/src/ball.cpp b/src/ball.cpp index c20cdbe..7350096 100644 --- a/src/ball.cpp +++ b/src/ball.cpp @@ -14,15 +14,15 @@ void Ball::draw(sf::RenderWindow& window) { window.draw(shape); } -sf::Vector2f Ball::getForces(State state) { +sf::Vector2f Ball::getForces(EngineState& state) { sf::Vector2f forces = PhysicsObject::getForces(state); // déplacement de la balle après appui sur les touches de direction - if (state.goLeftKey) { + if (state.keys[sf::Keyboard::Left]) { forces += sf::Vector2f(-Ball::MOVE, 0); } - if (state.goRightKey) { + if (state.keys[sf::Keyboard::Right]) { forces += sf::Vector2f(Ball::MOVE, 0); } diff --git a/src/block.cpp b/src/block.cpp index 6410f9c..0c36883 100644 --- a/src/block.cpp +++ b/src/block.cpp @@ -20,6 +20,6 @@ void Block::draw(sf::RenderWindow& window) { window.draw(shape); } -void Block::update(State state) { +void Block::update(EngineState& state) { // rien à mettre à jour } diff --git a/src/engine.cpp b/src/engine.cpp index 55f7a7c..d4e7f5f 100644 --- a/src/engine.cpp +++ b/src/engine.cpp @@ -1,5 +1,4 @@ #include "engine.hpp" -#include "state.hpp" #include #include @@ -7,7 +6,7 @@ Engine::Engine() : window( sf::VideoMode(400, 300), "Projet CMI", sf::Style::Default & ~sf::Style::Resize, sf::ContextSettings(0, 0, 2) -), goLeftKey(false), goRightKey(false) { +) { window.setVerticalSyncEnabled(true); } @@ -23,50 +22,31 @@ void Engine::start() { window.close(); } - // une touche a été enfoncée + // suivi de l'enfoncement et du relâchement des touches if (event.type == sf::Event::KeyPressed) { - if (event.key.code == sf::Keyboard::Left) { - goLeftKey = true; - } - - if (event.key.code == sf::Keyboard::Right) { - goRightKey = true; - } + state.keys[event.key.code] = 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; - } + state.keys[event.key.code] = false; } } + state.delta = clock.restart().asSeconds(); + update(); draw(); } } void Engine::addObject(Object& object) { - objects.push_back(&object); + state.objects.push_back(&object); } void Engine::update() { - // calcul du temps écoulé depuis la dernière frame - // et création de l'objet state stockant l'état du moteur - State state; - state.delta = clock.restart().asSeconds(); - state.goLeftKey = goLeftKey; - state.goRightKey = goRightKey; - state.objects = objects; - // demande la mise à jour de tous les objets du jeu - for (unsigned int i = 0; i < objects.size(); i++) { - objects[i]->update(state); + for (unsigned int i = 0; i < state.objects.size(); i++) { + state.objects[i]->update(state); } } @@ -77,8 +57,8 @@ void Engine::draw() { // 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]); + for (unsigned int i = 0; i < state.objects.size(); i++) { + display_queue.push(state.objects[i]); } // dessin des objets de la file d'affichage couche par couche diff --git a/src/physics_object.cpp b/src/physics_object.cpp index 32f1c36..76f148b 100644 --- a/src/physics_object.cpp +++ b/src/physics_object.cpp @@ -15,7 +15,7 @@ void PhysicsObject::draw(sf::RenderWindow& window) { window.draw(accelLine); } -void PhysicsObject::update(State state) { +void PhysicsObject::update(EngineState& state) { // intégration de la vitesse dans la position position += velocity * state.delta; @@ -24,6 +24,15 @@ void PhysicsObject::update(State state) { velocity += acceleration * state.delta; } +sf::Vector2f PhysicsObject::getForces(EngineState& state) { + sf::Vector2f forces(0, 0); + + // force de gravité + forces += sf::Vector2f(0, PhysicsObject::GRAVITY); + + return forces; +} + sf::Vector2f PhysicsObject::getVelocity() { return velocity; } @@ -39,14 +48,3 @@ int PhysicsObject::getMass() { void PhysicsObject::setMass(int set_mass) { mass = set_mass; } - -sf::Vector2f PhysicsObject::getForces(State state) { - sf::Vector2f forces(0, 0); - - // force de gravité - forces += sf::Vector2f(0, PhysicsObject::GRAVITY); - - // TODO: collisions entre objets - - return forces; -}