Réduction de l'utilisation de la mémoire dans les fonctions critiques

This commit is contained in:
Mattéo Delabre 2016-03-13 17:03:56 +01:00
parent bd9aa54275
commit 4cc2bfa197
10 changed files with 46 additions and 67 deletions

View File

@ -3,7 +3,7 @@
#include <SFML/Graphics.hpp> #include <SFML/Graphics.hpp>
#include <iostream> #include <iostream>
#include "state.hpp" #include "engine_state.hpp"
#include "physics_object.hpp" #include "physics_object.hpp"
class Ball : public PhysicsObject { class Ball : public PhysicsObject {
@ -14,7 +14,7 @@ protected:
/** /**
* Calcule les forces appliquées à l'objet * 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 ATTRACTION = 25000;
static constexpr float MOVE = 100; static constexpr float MOVE = 100;

View File

@ -4,7 +4,7 @@
#include <SFML/Graphics.hpp> #include <SFML/Graphics.hpp>
#include <iostream> #include <iostream>
#include "object.hpp" #include "object.hpp"
#include "state.hpp" #include "engine_state.hpp"
class Block : public Object { class Block : public Object {
protected: protected:
@ -27,7 +27,7 @@ public:
* Met à jour l'objet juste avant le dessin d'une frame * Met à jour l'objet juste avant le dessin d'une frame
* Reçoit l'état actuel du moteur * Reçoit l'état actuel du moteur
*/ */
void update(State state); void update(EngineState& state);
/** /**
* Détermine la couche d'affichage de l'objet * Détermine la couche d'affichage de l'objet

View File

@ -1,9 +1,9 @@
#ifndef __PTF_ENGINE_HPP__ #ifndef __PTF_ENGINE_HPP__
#define __PTF_ENGINE_HPP__ #define __PTF_ENGINE_HPP__
#include <vector>
#include <SFML/Graphics.hpp> #include <SFML/Graphics.hpp>
#include "object.hpp" #include "object.hpp"
#include "engine_state.hpp"
/** /**
* La classe principale Engine coordonne les éléments * La classe principale Engine coordonne les éléments
@ -13,11 +13,7 @@ class Engine {
private: private:
sf::Clock clock; sf::Clock clock;
sf::RenderWindow window; sf::RenderWindow window;
EngineState state;
bool goLeftKey;
bool goRightKey;
std::vector<Object*> objects;
/** /**
* Met à jour les objets du jeu pour * Met à jour les objets du jeu pour

View File

@ -1,7 +1,8 @@
#ifndef __PTF_STATE_HPP__ #ifndef __PTF_ENGINE_STATE_HPP__
#define __PTF_STATE_HPP__ #define __PTF_ENGINE_STATE_HPP__
#include <vector> #include <vector>
#include <array>
// pré-déclaration de Object pour éviter les erreurs de compilation // pré-déclaration de Object pour éviter les erreurs de compilation
// Object est définie dans object.hpp // Object est définie dans object.hpp
@ -12,11 +13,15 @@ class Object;
* Cette structure est passée aux objets pour qu'ils se * Cette structure est passée aux objets pour qu'ils se
* mettent à jour en fonction de cet état * mettent à jour en fonction de cet état
*/ */
struct State { struct EngineState {
std::vector<Object*> objects; std::vector<Object*> objects;
bool goLeftKey; std::array<bool, sf::Keyboard::KeyCount> keys;
bool goRightKey;
float delta; float delta;
EngineState() {
// aucune touche n'est enfoncée au démarrage
keys.fill(false);
}
}; };
#endif #endif

View File

@ -2,7 +2,7 @@
#define __PTF_OBJECT_HPP__ #define __PTF_OBJECT_HPP__
#include <SFML/Graphics.hpp> #include <SFML/Graphics.hpp>
#include "state.hpp" #include "engine_state.hpp"
class Object { class Object {
protected: protected:
@ -22,7 +22,7 @@ public:
* Met à jour l'objet juste avant le dessin d'une frame * Met à jour l'objet juste avant le dessin d'une frame
* Reçoit l'état actuel du moteur * 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 * Détermine la couche d'affichage de l'objet

View File

@ -4,7 +4,7 @@
#include <SFML/Graphics.hpp> #include <SFML/Graphics.hpp>
#include <iostream> #include <iostream>
#include "object.hpp" #include "object.hpp"
#include "state.hpp" #include "engine_state.hpp"
class PhysicsObject : public Object { class PhysicsObject : public Object {
protected: protected:
@ -17,7 +17,7 @@ protected:
/** /**
* Calcule les forces appliquées à l'objet * Calcule les forces appliquées à l'objet
*/ */
virtual sf::Vector2f getForces(State state); virtual sf::Vector2f getForces(EngineState& state);
static constexpr float GRAVITY = 20; static constexpr float GRAVITY = 20;
@ -35,7 +35,7 @@ public:
* Met à jour la physique de l'objet juste avant le dessin d'une frame * Met à jour la physique de l'objet juste avant le dessin d'une frame
* Reçoit l'état actuel du moteur * Reçoit l'état actuel du moteur
*/ */
void update(State state); void update(EngineState& state);
/** /**
* Récupère la vitesse de l'objet * Récupère la vitesse de l'objet

View File

@ -14,15 +14,15 @@ void Ball::draw(sf::RenderWindow& window) {
window.draw(shape); window.draw(shape);
} }
sf::Vector2f Ball::getForces(State state) { sf::Vector2f Ball::getForces(EngineState& state) {
sf::Vector2f forces = PhysicsObject::getForces(state); sf::Vector2f forces = PhysicsObject::getForces(state);
// déplacement de la balle après appui sur les touches de direction // 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); forces += sf::Vector2f(-Ball::MOVE, 0);
} }
if (state.goRightKey) { if (state.keys[sf::Keyboard::Right]) {
forces += sf::Vector2f(Ball::MOVE, 0); forces += sf::Vector2f(Ball::MOVE, 0);
} }

View File

@ -20,6 +20,6 @@ void Block::draw(sf::RenderWindow& window) {
window.draw(shape); window.draw(shape);
} }
void Block::update(State state) { void Block::update(EngineState& state) {
// rien à mettre à jour // rien à mettre à jour
} }

View File

@ -1,5 +1,4 @@
#include "engine.hpp" #include "engine.hpp"
#include "state.hpp"
#include <cmath> #include <cmath>
#include <queue> #include <queue>
@ -7,7 +6,7 @@ Engine::Engine() : window(
sf::VideoMode(400, 300), "Projet CMI", sf::VideoMode(400, 300), "Projet CMI",
sf::Style::Default & ~sf::Style::Resize, sf::Style::Default & ~sf::Style::Resize,
sf::ContextSettings(0, 0, 2) sf::ContextSettings(0, 0, 2)
), goLeftKey(false), goRightKey(false) { ) {
window.setVerticalSyncEnabled(true); window.setVerticalSyncEnabled(true);
} }
@ -23,50 +22,31 @@ void Engine::start() {
window.close(); 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.type == sf::Event::KeyPressed) {
if (event.key.code == sf::Keyboard::Left) { state.keys[event.key.code] = true;
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.type == sf::Event::KeyReleased) {
if (event.key.code == sf::Keyboard::Left) { state.keys[event.key.code] = false;
goLeftKey = false;
}
if (event.key.code == sf::Keyboard::Right) {
goRightKey = false;
}
} }
} }
state.delta = clock.restart().asSeconds();
update(); update();
draw(); draw();
} }
} }
void Engine::addObject(Object& object) { void Engine::addObject(Object& object) {
objects.push_back(&object); state.objects.push_back(&object);
} }
void Engine::update() { 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 // demande la mise à jour de tous les objets du jeu
for (unsigned int i = 0; i < objects.size(); i++) { for (unsigned int i = 0; i < state.objects.size(); i++) {
objects[i]->update(state); state.objects[i]->update(state);
} }
} }
@ -77,8 +57,8 @@ void Engine::draw() {
// chargement de la file d'affichage des objets // chargement de la file d'affichage des objets
std::priority_queue<Object*, std::vector<Object*>, ObjectCompare> display_queue; std::priority_queue<Object*, std::vector<Object*>, ObjectCompare> display_queue;
for (unsigned int i = 0; i < objects.size(); i++) { for (unsigned int i = 0; i < state.objects.size(); i++) {
display_queue.push(objects[i]); display_queue.push(state.objects[i]);
} }
// dessin des objets de la file d'affichage couche par couche // dessin des objets de la file d'affichage couche par couche

View File

@ -15,7 +15,7 @@ void PhysicsObject::draw(sf::RenderWindow& window) {
window.draw(accelLine); window.draw(accelLine);
} }
void PhysicsObject::update(State state) { void PhysicsObject::update(EngineState& state) {
// intégration de la vitesse dans la position // intégration de la vitesse dans la position
position += velocity * state.delta; position += velocity * state.delta;
@ -24,6 +24,15 @@ void PhysicsObject::update(State state) {
velocity += acceleration * state.delta; 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() { sf::Vector2f PhysicsObject::getVelocity() {
return velocity; return velocity;
} }
@ -39,14 +48,3 @@ int PhysicsObject::getMass() {
void PhysicsObject::setMass(int set_mass) { void PhysicsObject::setMass(int set_mass) {
mass = 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;
}