Test du niveau dans l'éditeur avec (espace)

This commit is contained in:
Mattéo Delabre 2016-04-06 01:13:00 +02:00
parent e5d3212a08
commit a166ef7e86
6 changed files with 85 additions and 3 deletions

View File

@ -1,5 +1,5 @@
#ifndef __PTF_GAME_HPP__ #ifndef __PTF_EDITOR_HPP__
#define __PTF_GAME_HPP__ #define __PTF_EDITOR_HPP__
#include <unordered_map> #include <unordered_map>
#include "level.hpp" #include "level.hpp"
@ -32,6 +32,11 @@ private:
*/ */
bool updateSelection(sf::Vector2f position); bool updateSelection(sf::Vector2f position);
/**
* Lance le test du niveau
*/
void testLevel();
protected: protected:
/** /**
* Dessine tous les objets, le fond et * Dessine tous les objets, le fond et

View File

@ -2,6 +2,7 @@
#define __PTF_GAME_HPP__ #define __PTF_GAME_HPP__
#include "level.hpp" #include "level.hpp"
#include "editor.hpp"
/** /**
* La classe Game gère l'affichage et les objets * La classe Game gère l'affichage et les objets
@ -10,6 +11,8 @@
class Game : public Level { class Game : public Level {
private: private:
sf::Time next_frame_time; sf::Time next_frame_time;
bool test_mode;
std::shared_ptr<View> return_view;
/** /**
* Met à jour les objets du jeu pour * Met à jour les objets du jeu pour
@ -31,6 +34,12 @@ public:
* cette vue * cette vue
*/ */
void frame(); void frame();
/**
* Mise en mode test : l'appui sur espace renvoie
* vers l'éditeur donné
*/
void setTestMode(std::shared_ptr<View> set_return_view);
}; };
#endif #endif

View File

@ -29,6 +29,11 @@ public:
*/ */
void start(); void start();
/**
* Renvoie la vue actuelle du jeu
*/
std::shared_ptr<View> getView();
/** /**
* Charge la vue donnée dans le jeu * Charge la vue donnée dans le jeu
*/ */

View File

@ -1,6 +1,7 @@
#include <cmath> #include <cmath>
#include <iostream> #include <iostream>
#include "editor.hpp" #include "editor.hpp"
#include "game.hpp"
#include "block.hpp" #include "block.hpp"
#include "constants.hpp" #include "constants.hpp"
@ -46,6 +47,16 @@ void Editor::frame() {
removeObject(position); 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 // dessin de la frame
@ -161,3 +172,29 @@ bool Editor::updateSelection(sf::Vector2f position) {
return has_changed; return has_changed;
} }
void Editor::testLevel() {
std::shared_ptr<Game> game = std::shared_ptr<Game>(new Game(manager));
// copie des propriétés
game->setName(getName());
game->setTotalTime(getTotalTime());
// copie des objets du niveau vers le jeu
std::vector<ObjectPtr>& 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<std::pair<float, float>>& 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);
}

View File

@ -1,7 +1,10 @@
#include "game.hpp" #include "game.hpp"
#include "constants.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 // on s'assure que la synchronisation verticale soit
// bien désactivée : on s'occupe de la limitation du // bien désactivée : on s'occupe de la limitation du
// framerate manuellement dans la fonction frame pour mettre // framerate manuellement dans la fonction frame pour mettre
@ -17,8 +20,22 @@ void Game::load(std::ifstream& file) {
} }
void Game::frame() { void Game::frame() {
const std::vector<sf::Event>& events = manager.getEvents();
sf::Time current_time = manager.getCurrentTime(); 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) { if (current_time >= next_frame_time) {
// si nous sommes en retard ou dans les temps // si nous sommes en retard ou dans les temps
// on replanifie la prochaine frame // on replanifie la prochaine frame
@ -84,3 +101,8 @@ void Game::update() {
getObjects()[i]->updateVelocity(manager, getObjects(), Constants::PHYSICS_TIME.asSeconds() / 2); getObjects()[i]->updateVelocity(manager, getObjects(), Constants::PHYSICS_TIME.asSeconds() / 2);
} }
} }
void Game::setTestMode(std::shared_ptr<View> set_return_view) {
return_view = set_return_view;
test_mode = true;
}

View File

@ -39,6 +39,10 @@ void Manager::start() {
} }
} }
std::shared_ptr<View> Manager::getView() {
return view;
}
void Manager::setView(std::shared_ptr<View> set_view) { void Manager::setView(std::shared_ptr<View> set_view) {
view = set_view; view = set_view;
} }