diff --git a/include/editor.hpp b/include/editor.hpp index 7df48e8..c131746 100644 --- a/include/editor.hpp +++ b/include/editor.hpp @@ -1,5 +1,5 @@ -#ifndef __PTF_GAME_HPP__ -#define __PTF_GAME_HPP__ +#ifndef __PTF_EDITOR_HPP__ +#define __PTF_EDITOR_HPP__ #include #include "level.hpp" @@ -32,6 +32,11 @@ private: */ bool updateSelection(sf::Vector2f position); + /** + * Lance le test du niveau + */ + void testLevel(); + protected: /** * Dessine tous les objets, le fond et diff --git a/include/game.hpp b/include/game.hpp index 559af1d..3e3e0d9 100644 --- a/include/game.hpp +++ b/include/game.hpp @@ -2,6 +2,7 @@ #define __PTF_GAME_HPP__ #include "level.hpp" +#include "editor.hpp" /** * La classe Game gère l'affichage et les objets @@ -10,6 +11,8 @@ class Game : public Level { private: sf::Time next_frame_time; + bool test_mode; + std::shared_ptr return_view; /** * Met à jour les objets du jeu pour @@ -31,6 +34,12 @@ public: * cette vue */ void frame(); + + /** + * Mise en mode test : l'appui sur espace renvoie + * vers l'éditeur donné + */ + void setTestMode(std::shared_ptr set_return_view); }; #endif diff --git a/include/manager.hpp b/include/manager.hpp index 68cd25e..73493c2 100644 --- a/include/manager.hpp +++ b/include/manager.hpp @@ -29,6 +29,11 @@ public: */ void start(); + /** + * Renvoie la vue actuelle du jeu + */ + std::shared_ptr getView(); + /** * Charge la vue donnée dans le jeu */ diff --git a/src/editor.cpp b/src/editor.cpp index 6ffd07c..56c58c3 100644 --- a/src/editor.cpp +++ b/src/editor.cpp @@ -1,6 +1,7 @@ #include #include #include "editor.hpp" +#include "game.hpp" #include "block.hpp" #include "constants.hpp" @@ -46,6 +47,16 @@ void Editor::frame() { removeObject(position); } } + + // gestion des touches + if (event.type == sf::Event::KeyPressed) { + // appui sur espace : test du niveau en cours d'édition + if (event.key.code == sf::Keyboard::Space) { + testLevel(); + return; // important : ne pas dessiner la frame + // on risque d'avoir perdu le pointeur en changeant de vue + } + } } // dessin de la frame @@ -161,3 +172,29 @@ bool Editor::updateSelection(sf::Vector2f position) { return has_changed; } + +void Editor::testLevel() { + std::shared_ptr game = std::shared_ptr(new Game(manager)); + + // copie des propriétés + game->setName(getName()); + game->setTotalTime(getTotalTime()); + + // copie des objets du niveau vers le jeu + std::vector& objects = getObjects(); + + for (unsigned int i = 0; i < objects.size(); i++) { + game->getObjects().push_back(objects[i]); + } + + // copie de la zone de jeu + std::vector>& zone = getZone(); + + for (unsigned int i = 0; i < zone.size(); i++) { + game->getZone().push_back(zone[i]); + } + + // mise en mode test + game->setTestMode(manager.getView()); + manager.setView(game); +} diff --git a/src/game.cpp b/src/game.cpp index cfb02cd..99526e5 100644 --- a/src/game.cpp +++ b/src/game.cpp @@ -1,7 +1,10 @@ #include "game.hpp" #include "constants.hpp" -Game::Game(Manager& manager) : Level(manager), next_frame_time(manager.getCurrentTime()) { +Game::Game(Manager& manager) : Level(manager), + next_frame_time(manager.getCurrentTime()), + test_mode(false), return_view(nullptr) { + // on s'assure que la synchronisation verticale soit // bien désactivée : on s'occupe de la limitation du // framerate manuellement dans la fonction frame pour mettre @@ -17,8 +20,22 @@ void Game::load(std::ifstream& file) { } void Game::frame() { + const std::vector& events = manager.getEvents(); sf::Time current_time = manager.getCurrentTime(); + // traitement des événements + for (unsigned int i = 0; i < events.size(); i++) { + const sf::Event& event = events[i]; + + // appui sur espace en mode test : retour à l'éditeur + if (event.type == sf::Event::KeyPressed && event.key.code == sf::Keyboard::Space && test_mode) { + test_mode = false; + manager.setView(return_view); + return; // important : ne pas dessiner la frame + // on risque d'avoir perdu le pointeur en changeant de vue + } + } + if (current_time >= next_frame_time) { // si nous sommes en retard ou dans les temps // on replanifie la prochaine frame @@ -84,3 +101,8 @@ void Game::update() { getObjects()[i]->updateVelocity(manager, getObjects(), Constants::PHYSICS_TIME.asSeconds() / 2); } } + +void Game::setTestMode(std::shared_ptr set_return_view) { + return_view = set_return_view; + test_mode = true; +} diff --git a/src/manager.cpp b/src/manager.cpp index 57b753c..1f2a7e2 100644 --- a/src/manager.cpp +++ b/src/manager.cpp @@ -39,6 +39,10 @@ void Manager::start() { } } +std::shared_ptr Manager::getView() { + return view; +} + void Manager::setView(std::shared_ptr set_view) { view = set_view; }