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 <iostream>
#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;

View File

@ -4,7 +4,7 @@
#include <SFML/Graphics.hpp>
#include <iostream>
#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

View File

@ -1,9 +1,9 @@
#ifndef __PTF_ENGINE_HPP__
#define __PTF_ENGINE_HPP__
#include <vector>
#include <SFML/Graphics.hpp>
#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<Object*> objects;
EngineState state;
/**
* Met à jour les objets du jeu pour

View File

@ -1,7 +1,8 @@
#ifndef __PTF_STATE_HPP__
#define __PTF_STATE_HPP__
#ifndef __PTF_ENGINE_STATE_HPP__
#define __PTF_ENGINE_STATE_HPP__
#include <vector>
#include <array>
// 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<Object*> objects;
bool goLeftKey;
bool goRightKey;
std::array<bool, sf::Keyboard::KeyCount> keys;
float delta;
EngineState() {
// aucune touche n'est enfoncée au démarrage
keys.fill(false);
}
};
#endif

View File

@ -2,7 +2,7 @@
#define __PTF_OBJECT_HPP__
#include <SFML/Graphics.hpp>
#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

View File

@ -4,7 +4,7 @@
#include <SFML/Graphics.hpp>
#include <iostream>
#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

View File

@ -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);
}

View File

@ -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
}

View File

@ -1,5 +1,4 @@
#include "engine.hpp"
#include "state.hpp"
#include <cmath>
#include <queue>
@ -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<Object*, std::vector<Object*>, 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

View File

@ -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;
}