Correction fuite mémoire
This commit is contained in:
parent
3f9f79188e
commit
0c8f5d2e3e
|
@ -1,10 +1,11 @@
|
|||
#ifndef __PTF_EDITOR_HPP__
|
||||
#define __PTF_EDITOR_HPP__
|
||||
|
||||
#include <unordered_map>
|
||||
#include "level.hpp"
|
||||
#include "widget_timer.hpp"
|
||||
#include "widget_toolbar.hpp"
|
||||
#include <unordered_map>
|
||||
#include <memory>
|
||||
|
||||
/**
|
||||
* La classe Editor permet l'édition de
|
||||
|
@ -93,11 +94,6 @@ public:
|
|||
Editor(Manager& manager);
|
||||
virtual ~Editor();
|
||||
|
||||
/**
|
||||
* Appelé par le manager lorsque l'état est utilisé
|
||||
*/
|
||||
virtual void begin();
|
||||
|
||||
/**
|
||||
* Traite l'événement donné
|
||||
*/
|
||||
|
|
|
@ -25,7 +25,6 @@ private:
|
|||
sf::Time next_frame_time;
|
||||
std::vector<Object::Ptr> pending_kill;
|
||||
|
||||
bool test_mode;
|
||||
float time_left;
|
||||
|
||||
std::shared_ptr<Editor> return_state;
|
||||
|
@ -60,11 +59,6 @@ public:
|
|||
Game(Manager& manager);
|
||||
virtual ~Game();
|
||||
|
||||
/**
|
||||
* Appelé par le manager lorsque l'état est utilisé
|
||||
*/
|
||||
virtual void begin();
|
||||
|
||||
/**
|
||||
* Traite l'événement donné
|
||||
*/
|
||||
|
@ -80,17 +74,6 @@ public:
|
|||
*/
|
||||
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
|
||||
*/
|
||||
|
|
|
@ -85,11 +85,6 @@ public:
|
|||
*/
|
||||
void save(std::string path);
|
||||
|
||||
/**
|
||||
* Appelé par le manager lorsque l'état est utilisé
|
||||
*/
|
||||
virtual void begin();
|
||||
|
||||
/**
|
||||
* Traite l'événement donné
|
||||
*/
|
||||
|
|
|
@ -4,6 +4,7 @@
|
|||
#include "resource_manager.hpp"
|
||||
#include "state.hpp"
|
||||
#include <memory>
|
||||
#include <stack>
|
||||
|
||||
/**
|
||||
* Gestionnaire principal de tous les états, vues et
|
||||
|
@ -18,10 +19,7 @@ private:
|
|||
sf::View gui_view;
|
||||
sf::String title;
|
||||
|
||||
std::shared_ptr<State> state;
|
||||
std::shared_ptr<State> next_state;
|
||||
|
||||
bool running;
|
||||
std::stack<std::unique_ptr<State>> states;
|
||||
|
||||
public:
|
||||
/**
|
||||
|
@ -47,19 +45,14 @@ public:
|
|||
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();
|
||||
|
||||
/**
|
||||
* Charge l'état donné dans le jeu
|
||||
*/
|
||||
void setState(std::shared_ptr<State> set_state);
|
||||
void popState();
|
||||
|
||||
/**
|
||||
* Renvoie la fenêtre actuellement utilisée pour le dessin
|
||||
|
|
|
@ -46,11 +46,6 @@ public:
|
|||
Menu(Manager& manager);
|
||||
virtual ~Menu();
|
||||
|
||||
/**
|
||||
* Appelé par le manager lorsque l'état est utilisé
|
||||
*/
|
||||
virtual void begin();
|
||||
|
||||
/**
|
||||
* Traite l'événement donné
|
||||
*/
|
||||
|
|
|
@ -18,11 +18,6 @@ public:
|
|||
State(Manager& manager);
|
||||
virtual ~State();
|
||||
|
||||
/**
|
||||
* Appelé par le manager lorsque l'état est utilisé
|
||||
*/
|
||||
virtual void begin() = 0;
|
||||
|
||||
/**
|
||||
* 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),
|
||||
drag_control_point(nullptr), drag_mode(Editor::DragMode::NONE),
|
||||
widget_timer(manager, true, std::bind(&Editor::setTotalTime, this, std::placeholders::_1)),
|
||||
widget_toolbar(manager) {}
|
||||
|
||||
Editor::~Editor() {}
|
||||
|
||||
void Editor::begin() {
|
||||
Level::begin();
|
||||
widget_toolbar(manager) {
|
||||
|
||||
getResourceManager().playMusic("editor.ogg");
|
||||
getWindow().setFramerateLimit(Manager::FPS);
|
||||
}
|
||||
|
||||
Editor::~Editor() {}
|
||||
|
||||
void Editor::processEvent(const sf::Event& event) {
|
||||
Level::processEvent(event);
|
||||
|
||||
|
@ -475,7 +472,7 @@ void Editor::selectAll() {
|
|||
}
|
||||
|
||||
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();
|
||||
|
||||
// copie des propriétés
|
||||
|
@ -498,7 +495,5 @@ void Editor::test() {
|
|||
game->getZone().push_back(*it);
|
||||
}
|
||||
|
||||
// mise en mode test
|
||||
game->setTestMode(std::dynamic_pointer_cast<Editor>(getManager().getState()));
|
||||
getManager().setState(game);
|
||||
getManager().pushState(std::move(game));
|
||||
}
|
||||
|
|
31
src/game.cpp
31
src/game.cpp
|
@ -6,13 +6,7 @@
|
|||
|
||||
Game::Game(Manager& manager) : Level(manager),
|
||||
widget_timer(manager, false),
|
||||
next_frame_time(manager.getCurrentTime()),
|
||||
test_mode(false), return_state(nullptr) {}
|
||||
|
||||
Game::~Game() {}
|
||||
|
||||
void Game::begin() {
|
||||
Level::begin();
|
||||
next_frame_time(manager.getCurrentTime()) {
|
||||
|
||||
if (getMusic() != "") {
|
||||
getResourceManager().playMusic(getMusic());
|
||||
|
@ -27,19 +21,15 @@ void Game::begin() {
|
|||
getWindow().setFramerateLimit(0);
|
||||
}
|
||||
|
||||
Game::~Game() {}
|
||||
|
||||
void Game::processEvent(const sf::Event& event) {
|
||||
Level::processEvent(event);
|
||||
|
||||
if (event.type == sf::Event::KeyPressed) {
|
||||
// appui sur espace en mode test : retour à l'éditeur
|
||||
if (event.key.code == sf::Keyboard::Space && test_mode) {
|
||||
test_mode = false;
|
||||
|
||||
// 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 espace : retour
|
||||
if (event.key.code == sf::Keyboard::Space) {
|
||||
getManager().popState();
|
||||
}
|
||||
|
||||
// appui sur échap : échange entre le mode pause et normal
|
||||
|
@ -254,15 +244,6 @@ bool Game::isInZone(Object::Ptr object) {
|
|||
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() {
|
||||
return mode;
|
||||
}
|
||||
|
|
|
@ -146,7 +146,12 @@ void loadLevel(
|
|||
}
|
||||
|
||||
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_angle = 180.f;
|
||||
}
|
||||
|
||||
Level::~Level() {}
|
||||
|
@ -264,13 +269,6 @@ void Level::save() {
|
|||
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) {
|
||||
// lorsque la fenêtre est redimensionnée, mise à jour
|
||||
// de la taille de la caméra
|
||||
|
|
|
@ -7,10 +7,10 @@
|
|||
|
||||
int main() {
|
||||
Manager manager;
|
||||
std::shared_ptr<Menu> menu = std::shared_ptr<Menu>(new Menu(manager));
|
||||
auto menu = std::unique_ptr<Menu>(new Menu(manager));
|
||||
|
||||
try {
|
||||
manager.setState(menu);
|
||||
manager.pushState(std::move(menu));
|
||||
manager.start();
|
||||
} catch (const std::exception& exception) {
|
||||
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 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
|
||||
resource_manager.preload();
|
||||
|
||||
|
@ -19,28 +19,16 @@ Manager::Manager() : title(sf::String(L"")), state(NULL), next_state(NULL), runn
|
|||
}
|
||||
|
||||
void Manager::start() {
|
||||
running = true;
|
||||
|
||||
while (running) {
|
||||
while (!states.empty()) {
|
||||
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
|
||||
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) {
|
||||
quit();
|
||||
while (!states.empty()) {
|
||||
states.pop();
|
||||
}
|
||||
}
|
||||
|
||||
// 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
|
||||
state->frame();
|
||||
states.top()->frame();
|
||||
window.display();
|
||||
}
|
||||
}
|
||||
|
||||
void Manager::quit() {
|
||||
running = false;
|
||||
void Manager::pushState(std::unique_ptr<State> set_state) {
|
||||
states.push(std::move(set_state));
|
||||
}
|
||||
|
||||
std::shared_ptr<State> Manager::getState() {
|
||||
return state;
|
||||
}
|
||||
|
||||
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;
|
||||
void Manager::popState() {
|
||||
states.pop();
|
||||
}
|
||||
|
||||
sf::RenderWindow& Manager::getWindow() {
|
||||
|
|
28
src/menu.cpp
28
src/menu.cpp
|
@ -1,20 +1,21 @@
|
|||
#include "menu.hpp"
|
||||
#include "rules.hpp"
|
||||
#include "editor.hpp"
|
||||
#include "game.hpp"
|
||||
#include <cmath>
|
||||
|
||||
const float MAX_WIDTH_PROPORTION = 1.f / 3.f;
|
||||
|
||||
Menu::Menu(Manager& manager) : State(manager) {}
|
||||
Menu::~Menu() {}
|
||||
|
||||
void Menu::begin() {
|
||||
Menu::Menu(Manager& manager) : State(manager) {
|
||||
background.setTexture(getResourceManager().getTexture("bg_menu.tga"));
|
||||
loadMainMenu();
|
||||
|
||||
getResourceManager().playMusic("menu.ogg");
|
||||
getWindow().setFramerateLimit(Manager::FPS);
|
||||
}
|
||||
|
||||
Menu::~Menu() {}
|
||||
|
||||
void Menu::processEvent(const sf::Event& event) {
|
||||
// gestion des touches
|
||||
if (event.type == sf::Event::KeyPressed) {
|
||||
|
@ -175,27 +176,22 @@ void Menu::loadLevelMenu() {
|
|||
}
|
||||
|
||||
void Menu::loadRules() {
|
||||
choices.clear();
|
||||
getWindow().clear(sf::Color::Black);
|
||||
|
||||
sf::Texture& texture = getResourceManager().getTexture("regles_jeu.png");
|
||||
background.setTexture(texture);
|
||||
auto rules = std::unique_ptr<Rules>(new Rules(getManager()));
|
||||
getManager().pushState(std::move(rules));
|
||||
}
|
||||
|
||||
void Menu::launchEditor() {
|
||||
std::shared_ptr<Editor> editor = std::shared_ptr<Editor>(new Editor(getManager()));
|
||||
|
||||
// TODO: charger dynamiquement le niveau dans l'éditeur
|
||||
auto editor = std::unique_ptr<Editor>(new Editor(getManager()));
|
||||
editor->load(getResourceManager().getLevelPath("editor_result.dat"));
|
||||
getManager().setState(editor);
|
||||
getManager().pushState(std::move(editor));
|
||||
}
|
||||
|
||||
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);
|
||||
getManager().setState(game);
|
||||
getManager().pushState(std::move(game));
|
||||
}
|
||||
|
||||
void Menu::quit() {
|
||||
getManager().quit();
|
||||
getManager().popState();
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue