Correction fuite mémoire
This commit is contained in:
parent
3f9f79188e
commit
0c8f5d2e3e
|
@ -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é
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -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
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -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é
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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é
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -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é
|
||||||
*/
|
*/
|
||||||
|
|
Before Width: | Height: | Size: 1022 KiB After Width: | Height: | Size: 1022 KiB |
|
@ -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);
|
|
||||||
}
|
}
|
||||||
|
|
31
src/game.cpp
31
src/game.cpp
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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() {
|
||||||
|
|
28
src/menu.cpp
28
src/menu.cpp
|
@ -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();
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue