Fonction #enable() pour gestion de caméra plus propre

This commit is contained in:
Mattéo Delabre 2016-04-17 15:25:21 +02:00
parent a20f6c1b4d
commit 3fa5387763
14 changed files with 99 additions and 40 deletions

View File

@ -94,6 +94,11 @@ public:
Editor(Manager& manager); Editor(Manager& manager);
virtual ~Editor(); virtual ~Editor();
/**
* Active l'état
*/
virtual void enable();
/** /**
* Traite l'événement donné * Traite l'événement donné
*/ */

View File

@ -60,6 +60,11 @@ public:
Game(Manager& manager); Game(Manager& manager);
virtual ~Game(); virtual ~Game();
/**
* Active l'état
*/
virtual void enable();
/** /**
* Traite l'événement donné * Traite l'événement donné
*/ */

View File

@ -58,6 +58,11 @@ public:
Level(Manager& manager); Level(Manager& manager);
virtual ~Level(); virtual ~Level();
/**
* Active l'état
*/
virtual void enable();
/** /**
* Obtient le nom du niveau dont le chemin complet * Obtient le nom du niveau dont le chemin complet
* et absolu est en paramètre * et absolu est en paramètre

View File

@ -21,6 +21,7 @@ private:
sf::View gui_view; sf::View gui_view;
sf::String title; sf::String title;
State* previous_state;
std::stack<std::unique_ptr<State>> states; std::stack<std::unique_ptr<State>> states;
public: public:

View File

@ -64,6 +64,11 @@ public:
Menu(Manager& manager); Menu(Manager& manager);
virtual ~Menu(); virtual ~Menu();
/**
* Active l'état
*/
virtual void enable();
/** /**
* Traite l'événement donné * Traite l'événement donné
*/ */

View File

@ -16,6 +16,11 @@ public:
Rules(Manager& manager); Rules(Manager& manager);
virtual ~Rules(); virtual ~Rules();
/**
* Active l'état
*/
virtual void enable();
/** /**
* Traite l'événement donné * Traite l'événement donné
*/ */

View File

@ -17,6 +17,11 @@ public:
State(Manager& manager); State(Manager& manager);
virtual ~State(); virtual ~State();
/**
* Active l'état
*/
virtual void enable() = 0;
/** /**
* Traite l'événement donné * Traite l'événement donné
*/ */

View File

@ -38,6 +38,17 @@ Editor::Editor(Manager& manager) : Level(manager),
Editor::~Editor() {} Editor::~Editor() {}
void Editor::enable() {
Level::enable();
// attributs de la fenêtre
getManager().setTitle(sf::String(L"Édition de ") + getName());
getManager().setFramerate(Manager::FPS);
// joue la musique de l'éditeur
getResourceManager().playMusic("editor.ogg");
}
void Editor::processEvent(const sf::Event& event) { void Editor::processEvent(const sf::Event& event) {
Level::processEvent(event); Level::processEvent(event);
@ -240,13 +251,6 @@ void Editor::processEvent(const sf::Event& event) {
} }
void Editor::frame() { void Editor::frame() {
// attributs de la fenêtre
getManager().setTitle(sf::String(L"Édition de ") + getName());
getManager().setFramerate(Manager::FPS);
// joue la musique de l'éditeur
getResourceManager().playMusic("editor.ogg");
// dessin de la frame // dessin de la frame
draw(); draw();
} }

View File

@ -23,6 +23,21 @@ Game::Game(Manager& manager) : Level(manager),
Game::~Game() {} Game::~Game() {}
void Game::enable() {
Level::enable();
// attributs de la fenêtre
getManager().setTitle(getName());
getManager().setFramerate(0);
// si musique il y a, on la joue
if (getMusic() != "") {
getResourceManager().playMusic(getMusic());
} else {
getResourceManager().stopMusic();
}
}
void Game::processEvent(const sf::Event& event) { void Game::processEvent(const sf::Event& event) {
Level::processEvent(event); Level::processEvent(event);
@ -45,17 +60,6 @@ void Game::processEvent(const sf::Event& event) {
} }
void Game::frame() { void Game::frame() {
// attributs de la fenêtre
getManager().setTitle(getName());
getManager().setFramerate(0);
// si musique il y a, on la joue
if (getMusic() != "") {
getResourceManager().playMusic(getMusic());
} else {
getResourceManager().stopMusic();
}
sf::Time current_time = getManager().getCurrentTime(); sf::Time current_time = getManager().getCurrentTime();
if (current_time >= next_frame_time) { if (current_time >= next_frame_time) {

View File

@ -152,14 +152,8 @@ namespace {
} }
Level::Level(Manager& manager) : State(manager) { Level::Level(Manager& manager) : State(manager) {
sf::Vector2u window_size = getWindow().getSize();
gravity_direction = GravityDirection::SOUTH; gravity_direction = GravityDirection::SOUTH;
// positionnement par défaut de la caméra
camera.setSize(window_size.x, window_size.y);
camera.setCenter(0, 0);
camera_angle = 180.f;
// métadonnées par défaut // métadonnées par défaut
setName(sf::String("Nouveau niveau")); setName(sf::String("Nouveau niveau"));
current_path = getResourceManager().getLevelPath("new_level.dat"); current_path = getResourceManager().getLevelPath("new_level.dat");
@ -178,6 +172,15 @@ Level::Level(Manager& manager) : State(manager) {
Level::~Level() {} Level::~Level() {}
void Level::enable() {
// positionnement par défaut de la caméra
sf::Vector2u window_size = getWindow().getSize();
camera.setSize(window_size.x, window_size.y);
camera.setCenter(0, 0);
camera_angle = 180.f;
}
sf::String Level::getLevelName(std::string path) { sf::String Level::getLevelName(std::string path) {
sf::String name; sf::String name;
int total_time; int total_time;

View File

@ -6,10 +6,14 @@
#include <memory> #include <memory>
int main() { int main() {
// le gestionnaire du jeu gère la pile d'états
Manager manager; Manager manager;
// on crée une instance de l'état "menu"
auto menu = std::unique_ptr<Menu>(new Menu(manager)); auto menu = std::unique_ptr<Menu>(new Menu(manager));
try { try {
// on empile l'état du menu et on démarre
manager.pushState(std::move(menu)); manager.pushState(std::move(menu));
manager.start(); manager.start();
} catch (const std::exception& exception) { } catch (const std::exception& exception) {

View File

@ -5,7 +5,7 @@ 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);
const float Manager::GRID = 32; const float Manager::GRID = 32;
Manager::Manager() : title(sf::String(L"")) { Manager::Manager() : title(sf::String(L"")), previous_state(nullptr) {
// préchargement des textures // préchargement des textures
resource_manager.preload(); resource_manager.preload();
@ -53,7 +53,16 @@ void Manager::start() {
return; return;
} }
// affichage de la prochaine frame // si l'état que l'on va utiliser n'est pas le
// même que précédemment, on l'active
// Ceci permet un partage plus facile des
// ressources globales (vue, musique)
if (previous_state != states.top().get()) {
previous_state = states.top().get();
previous_state->enable();
}
// demande à l'état actuel d'afficher une frame
states.top()->frame(); states.top()->frame();
window.display(); window.display();
} }

View File

@ -12,6 +12,15 @@ Menu::Menu(Manager& manager) : State(manager) {
Menu::~Menu() {} Menu::~Menu() {}
void Menu::enable() {
// attributs de la fenêtre
getManager().setTitle("");
getManager().setFramerate(Manager::FPS);
// joue la musique du menu
getResourceManager().playMusic("menu.ogg");
}
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) {
@ -71,13 +80,6 @@ void Menu::processEvent(const sf::Event& event) {
} }
void Menu::frame() { void Menu::frame() {
// attributsde la fenêtre
getManager().setTitle("");
getManager().setFramerate(Manager::FPS);
// joue la musique du menu
getResourceManager().playMusic("menu.ogg");
// affichage du menu // affichage du menu
sf::RenderWindow& window = getWindow(); sf::RenderWindow& window = getWindow();
sf::Vector2f size = (sf::Vector2f) window.getSize(); sf::Vector2f size = (sf::Vector2f) window.getSize();

View File

@ -8,6 +8,15 @@ Rules::Rules(Manager& manager) : State(manager) {
Rules::~Rules() {} Rules::~Rules() {}
void Rules::enable() {
// attributs de la fenêtre
getManager().setTitle(L"Règles");
getManager().setFramerate(Manager::FPS);
// joue la musique du menu
getResourceManager().playMusic("menu.ogg");
}
void Rules::processEvent(const sf::Event& event) { void Rules::processEvent(const sf::Event& event) {
// appui sur échap, retour, entrée, espace : on dépile l'état // appui sur échap, retour, entrée, espace : on dépile l'état
if (event.type == sf::Event::KeyPressed) { if (event.type == sf::Event::KeyPressed) {
@ -24,13 +33,6 @@ void Rules::frame() {
sf::RenderWindow& window = getWindow(); sf::RenderWindow& window = getWindow();
sf::Vector2f size = (sf::Vector2f) window.getSize(); sf::Vector2f size = (sf::Vector2f) window.getSize();
// attributs de la fenêtre
getManager().setTitle(L"Règles");
getManager().setFramerate(Manager::FPS);
// joue la musique du menu
getResourceManager().playMusic("menu.ogg");
// on s'assure d'être dans la vue par défaut (pas de zoom, 0x0 en haut gauche) // on s'assure d'être dans la vue par défaut (pas de zoom, 0x0 en haut gauche)
getManager().useGUIView(); getManager().useGUIView();