Correction fuite mémoire

This commit is contained in:
Mattéo Delabre 2016-04-11 21:11:34 +02:00
parent 3f9f79188e
commit 0c8f5d2e3e
13 changed files with 60 additions and 141 deletions

View File

@ -1,10 +1,11 @@
#ifndef __PTF_EDITOR_HPP__ #ifndef __PTF_EDITOR_HPP__
#define __PTF_EDITOR_HPP__ #define __PTF_EDITOR_HPP__
#include <unordered_map>
#include "level.hpp" #include "level.hpp"
#include "widget_timer.hpp" #include "widget_timer.hpp"
#include "widget_toolbar.hpp" #include "widget_toolbar.hpp"
#include <unordered_map>
#include <memory>
/** /**
* La classe Editor permet l'édition de * La classe Editor permet l'édition de
@ -93,11 +94,6 @@ public:
Editor(Manager& manager); Editor(Manager& manager);
virtual ~Editor(); virtual ~Editor();
/**
* Appelé par le manager lorsque l'état est utilisé
*/
virtual void begin();
/** /**
* Traite l'événement donné * Traite l'événement donné
*/ */

View File

@ -25,7 +25,6 @@ private:
sf::Time next_frame_time; sf::Time next_frame_time;
std::vector<Object::Ptr> pending_kill; std::vector<Object::Ptr> pending_kill;
bool test_mode;
float time_left; float time_left;
std::shared_ptr<Editor> return_state; std::shared_ptr<Editor> return_state;
@ -60,11 +59,6 @@ public:
Game(Manager& manager); Game(Manager& manager);
virtual ~Game(); virtual ~Game();
/**
* Appelé par le manager lorsque l'état est utilisé
*/
virtual void begin();
/** /**
* Traite l'événement donné * Traite l'événement donné
*/ */
@ -80,17 +74,6 @@ public:
*/ */
void kill(Object::Ptr object); void kill(Object::Ptr object);
/**
* Récupère si on est en mode test ou pas
*/
bool getTestMode();
/**
* Mise en mode test : l'appui sur espace renvoie
* vers l'éditeur donné
*/
void setTestMode(std::shared_ptr<Editor> set_return_state);
/** /**
* Récupère le mode actuel de jeu * Récupère le mode actuel de jeu
*/ */

View File

@ -85,11 +85,6 @@ public:
*/ */
void save(std::string path); void save(std::string path);
/**
* Appelé par le manager lorsque l'état est utilisé
*/
virtual void begin();
/** /**
* Traite l'événement donné * Traite l'événement donné
*/ */

View File

@ -4,6 +4,7 @@
#include "resource_manager.hpp" #include "resource_manager.hpp"
#include "state.hpp" #include "state.hpp"
#include <memory> #include <memory>
#include <stack>
/** /**
* Gestionnaire principal de tous les états, vues et * Gestionnaire principal de tous les états, vues et
@ -18,10 +19,7 @@ private:
sf::View gui_view; sf::View gui_view;
sf::String title; sf::String title;
std::shared_ptr<State> state; std::stack<std::unique_ptr<State>> states;
std::shared_ptr<State> next_state;
bool running;
public: public:
/** /**
@ -47,19 +45,14 @@ public:
void start(); void start();
/** /**
* Termine la boucle principale et quitte le jeu * Empile l'état donné
*/ */
void quit(); void pushState(std::unique_ptr<State> set_state);
/** /**
* Renvoie l'état actuel du jeu * Dépile l'état actuel
*/ */
std::shared_ptr<State> getState(); void popState();
/**
* Charge l'état donné dans le jeu
*/
void setState(std::shared_ptr<State> set_state);
/** /**
* Renvoie la fenêtre actuellement utilisée pour le dessin * Renvoie la fenêtre actuellement utilisée pour le dessin

View File

@ -46,11 +46,6 @@ public:
Menu(Manager& manager); Menu(Manager& manager);
virtual ~Menu(); virtual ~Menu();
/**
* Appelé par le manager lorsque l'état est utilisé
*/
virtual void begin();
/** /**
* Traite l'événement donné * Traite l'événement donné
*/ */

View File

@ -18,11 +18,6 @@ public:
State(Manager& manager); State(Manager& manager);
virtual ~State(); virtual ~State();
/**
* Appelé par le manager lorsque l'état est utilisé
*/
virtual void begin() = 0;
/** /**
* Traite l'événement donné * Traite l'événement donné
*/ */

View File

Before

Width:  |  Height:  |  Size: 1022 KiB

After

Width:  |  Height:  |  Size: 1022 KiB

View File

@ -29,17 +29,14 @@ inline sf::Vector2f roundVectorToGrid(sf::Vector2f input) {
Editor::Editor(Manager& manager) : Level(manager), Editor::Editor(Manager& manager) : Level(manager),
drag_control_point(nullptr), drag_mode(Editor::DragMode::NONE), drag_control_point(nullptr), drag_mode(Editor::DragMode::NONE),
widget_timer(manager, true, std::bind(&Editor::setTotalTime, this, std::placeholders::_1)), widget_timer(manager, true, std::bind(&Editor::setTotalTime, this, std::placeholders::_1)),
widget_toolbar(manager) {} widget_toolbar(manager) {
Editor::~Editor() {}
void Editor::begin() {
Level::begin();
getResourceManager().playMusic("editor.ogg"); getResourceManager().playMusic("editor.ogg");
getWindow().setFramerateLimit(Manager::FPS); getWindow().setFramerateLimit(Manager::FPS);
} }
Editor::~Editor() {}
void Editor::processEvent(const sf::Event& event) { void Editor::processEvent(const sf::Event& event) {
Level::processEvent(event); Level::processEvent(event);
@ -475,7 +472,7 @@ void Editor::selectAll() {
} }
void Editor::test() { void Editor::test() {
std::shared_ptr<Game> game = std::shared_ptr<Game>(new Game(getManager())); auto game = std::unique_ptr<Game>(new Game(getManager()));
clearSelection(); clearSelection();
// copie des propriétés // copie des propriétés
@ -498,7 +495,5 @@ void Editor::test() {
game->getZone().push_back(*it); game->getZone().push_back(*it);
} }
// mise en mode test getManager().pushState(std::move(game));
game->setTestMode(std::dynamic_pointer_cast<Editor>(getManager().getState()));
getManager().setState(game);
} }

View File

@ -6,13 +6,7 @@
Game::Game(Manager& manager) : Level(manager), Game::Game(Manager& manager) : Level(manager),
widget_timer(manager, false), widget_timer(manager, false),
next_frame_time(manager.getCurrentTime()), next_frame_time(manager.getCurrentTime()) {
test_mode(false), return_state(nullptr) {}
Game::~Game() {}
void Game::begin() {
Level::begin();
if (getMusic() != "") { if (getMusic() != "") {
getResourceManager().playMusic(getMusic()); getResourceManager().playMusic(getMusic());
@ -27,19 +21,15 @@ void Game::begin() {
getWindow().setFramerateLimit(0); getWindow().setFramerateLimit(0);
} }
Game::~Game() {}
void Game::processEvent(const sf::Event& event) { void Game::processEvent(const sf::Event& event) {
Level::processEvent(event); Level::processEvent(event);
if (event.type == sf::Event::KeyPressed) { if (event.type == sf::Event::KeyPressed) {
// appui sur espace en mode test : retour à l'éditeur // appui sur espace : retour
if (event.key.code == sf::Keyboard::Space && test_mode) { if (event.key.code == sf::Keyboard::Space) {
test_mode = false; getManager().popState();
// on s'assure que la position de la caméra reste la même
return_state->setCamera(getCamera());
getManager().setState(return_state);
return_state = nullptr;
} }
// appui sur échap : échange entre le mode pause et normal // appui sur échap : échange entre le mode pause et normal
@ -254,15 +244,6 @@ bool Game::isInZone(Object::Ptr object) {
return result; return result;
} }
bool Game::getTestMode() {
return test_mode;
}
void Game::setTestMode(std::shared_ptr<Editor> set_return_state) {
return_state = set_return_state;
test_mode = true;
}
Game::Mode Game::getMode() { Game::Mode Game::getMode() {
return mode; return mode;
} }

View File

@ -146,7 +146,12 @@ void loadLevel(
} }
Level::Level(Manager& manager) : State(manager) { Level::Level(Manager& manager) : State(manager) {
sf::Vector2u window_size = getWindow().getSize();
gravity_direction = GravityDirection::SOUTH;
camera.setSize(window_size.x, window_size.y);
camera.setCenter(0, 0); camera.setCenter(0, 0);
camera_angle = 180.f;
} }
Level::~Level() {} Level::~Level() {}
@ -264,13 +269,6 @@ void Level::save() {
save(current_path); save(current_path);
} }
void Level::begin() {
sf::Vector2u window_size = getWindow().getSize();
camera.setSize(window_size.x, window_size.y);
camera_angle = 180.f;
gravity_direction = GravityDirection::SOUTH;
}
void Level::processEvent(const sf::Event& event) { void Level::processEvent(const sf::Event& event) {
// lorsque la fenêtre est redimensionnée, mise à jour // lorsque la fenêtre est redimensionnée, mise à jour
// de la taille de la caméra // de la taille de la caméra

View File

@ -7,10 +7,10 @@
int main() { int main() {
Manager manager; Manager manager;
std::shared_ptr<Menu> menu = std::shared_ptr<Menu>(new Menu(manager)); auto menu = std::unique_ptr<Menu>(new Menu(manager));
try { try {
manager.setState(menu); manager.pushState(std::move(menu));
manager.start(); manager.start();
} catch (const std::exception& exception) { } catch (const std::exception& exception) {
std::cerr << "Le programme a quitté après une erreur d'exécution." << std::endl; std::cerr << "Le programme a quitté après une erreur d'exécution." << std::endl;

View File

@ -3,7 +3,7 @@
const unsigned int Manager::FPS = 60; const unsigned int Manager::FPS = 60;
const sf::Time Manager::FRAME_TIME = sf::seconds(1.f / Manager::FPS); const sf::Time Manager::FRAME_TIME = sf::seconds(1.f / Manager::FPS);
Manager::Manager() : title(sf::String(L"")), state(NULL), next_state(NULL), running(false) { Manager::Manager() : title(sf::String(L"")) {
// préchargement des textures // préchargement des textures
resource_manager.preload(); resource_manager.preload();
@ -19,28 +19,16 @@ Manager::Manager() : title(sf::String(L"")), state(NULL), next_state(NULL), runn
} }
void Manager::start() { void Manager::start() {
running = true; while (!states.empty()) {
while (running) {
sf::Event event; sf::Event event;
// si un changement d'état a été demandé, on l'effectue maintenant
if (next_state != nullptr) {
state = next_state;
next_state->begin();
next_state = nullptr;
}
// vérification de sécurité
if (state == NULL) {
throw std::runtime_error("Aucun état à afficher pour le jeu");
}
// traitement des évènements reçus // traitement des évènements reçus
while (window.pollEvent(event)) { while (window.pollEvent(event)) {
// fermeture de la fenêtre // fermeture de la fenêtre : on dépile tous les états
if (event.type == sf::Event::Closed) { if (event.type == sf::Event::Closed) {
quit(); while (!states.empty()) {
states.pop();
}
} }
// redimensionnement de la vue par défaut // redimensionnement de la vue par défaut
@ -50,27 +38,31 @@ void Manager::start() {
)); ));
} }
state->processEvent(event); // s'il n'y a plus d'état, on quitte
if (states.empty()) {
return;
}
states.top()->processEvent(event);
}
// s'il n'y a plus d'état, on quitte
if (states.empty()) {
return;
} }
// affichage de la prochaine frame // affichage de la prochaine frame
state->frame(); states.top()->frame();
window.display(); window.display();
} }
} }
void Manager::quit() { void Manager::pushState(std::unique_ptr<State> set_state) {
running = false; states.push(std::move(set_state));
} }
std::shared_ptr<State> Manager::getState() { void Manager::popState() {
return state; states.pop();
}
void Manager::setState(std::shared_ptr<State> set_state) {
// on ne change pas immédiatement l'état, on attend
// la prochaine frame pour éviter toute erreur de segmentation
next_state = set_state;
} }
sf::RenderWindow& Manager::getWindow() { sf::RenderWindow& Manager::getWindow() {

View File

@ -1,20 +1,21 @@
#include "menu.hpp" #include "menu.hpp"
#include "rules.hpp"
#include "editor.hpp" #include "editor.hpp"
#include "game.hpp" #include "game.hpp"
#include <cmath> #include <cmath>
const float MAX_WIDTH_PROPORTION = 1.f / 3.f; const float MAX_WIDTH_PROPORTION = 1.f / 3.f;
Menu::Menu(Manager& manager) : State(manager) {} Menu::Menu(Manager& manager) : State(manager) {
Menu::~Menu() {} background.setTexture(getResourceManager().getTexture("bg_menu.tga"));
void Menu::begin() {
loadMainMenu(); loadMainMenu();
getResourceManager().playMusic("menu.ogg"); getResourceManager().playMusic("menu.ogg");
getWindow().setFramerateLimit(Manager::FPS); getWindow().setFramerateLimit(Manager::FPS);
} }
Menu::~Menu() {}
void Menu::processEvent(const sf::Event& event) { void Menu::processEvent(const sf::Event& event) {
// gestion des touches // gestion des touches
if (event.type == sf::Event::KeyPressed) { if (event.type == sf::Event::KeyPressed) {
@ -175,27 +176,22 @@ void Menu::loadLevelMenu() {
} }
void Menu::loadRules() { void Menu::loadRules() {
choices.clear(); auto rules = std::unique_ptr<Rules>(new Rules(getManager()));
getWindow().clear(sf::Color::Black); getManager().pushState(std::move(rules));
sf::Texture& texture = getResourceManager().getTexture("regles_jeu.png");
background.setTexture(texture);
} }
void Menu::launchEditor() { void Menu::launchEditor() {
std::shared_ptr<Editor> editor = std::shared_ptr<Editor>(new Editor(getManager())); auto editor = std::unique_ptr<Editor>(new Editor(getManager()));
// TODO: charger dynamiquement le niveau dans l'éditeur
editor->load(getResourceManager().getLevelPath("editor_result.dat")); editor->load(getResourceManager().getLevelPath("editor_result.dat"));
getManager().setState(editor); getManager().pushState(std::move(editor));
} }
void Menu::launchGame(std::string path) { void Menu::launchGame(std::string path) {
std::shared_ptr<Game> game = std::shared_ptr<Game>(new Game(getManager())); auto game = std::unique_ptr<Game>(new Game(getManager()));
game->load(path); game->load(path);
getManager().setState(game); getManager().pushState(std::move(game));
} }
void Menu::quit() { void Menu::quit() {
getManager().quit(); getManager().popState();
} }