Meilleure séparation du processEvent

This commit is contained in:
Mattéo Delabre 2016-04-09 23:57:23 +02:00
parent 340d245c27
commit 3b2aac5ffc
11 changed files with 112 additions and 142 deletions

View File

@ -74,25 +74,24 @@ protected:
*/ */
virtual void draw(); virtual void draw();
/**
* Traite un événement
*/
virtual void processEvent(const sf::Event& event);
public: public:
Editor(Manager& manager); Editor(Manager& manager);
virtual ~Editor(); virtual ~Editor();
/** /**
* Appelé par le manager lorsque l'état commence à * Appelé par le manager lorsque l'état est utilisé
* être utilisée
*/ */
virtual void begin(); virtual void begin();
/** /**
* Demande le passage à la frame suivante sur cet état * Traite l'événement donné
*/ */
virtual void frame(const std::vector<sf::Event>& events); virtual void processEvent(const sf::Event& event);
/**
* Demande le dessin d'une frame
*/
virtual void frame();
}; };
#endif #endif

View File

@ -28,11 +28,6 @@ protected:
*/ */
virtual void draw(); virtual void draw();
/**
* Traite un événement
*/
virtual void processEvent(const sf::Event& event);
/** /**
* S'assure que la caméra est centrée sur les joueurs * S'assure que la caméra est centrée sur les joueurs
*/ */
@ -43,14 +38,19 @@ public:
virtual ~Game(); virtual ~Game();
/** /**
* Appelé par le manager lorsque le jeu commence * Appelé par le manager lorsque l'état est utilisé
*/ */
virtual void begin(); virtual void begin();
/** /**
* Demande le passage à la frame suivante du jeu * Traite l'événement donné
*/ */
virtual void frame(const std::vector<sf::Event>& events); virtual void processEvent(const sf::Event& event);
/**
* Demande le dessin d'une frame
*/
virtual void frame();
/** /**
* Mise en mode test : l'appui sur espace renvoie * Mise en mode test : l'appui sur espace renvoie

View File

@ -37,11 +37,6 @@ protected:
*/ */
virtual void draw(); virtual void draw();
/**
* Traite un événement
*/
virtual void processEvent(const sf::Event& event);
/** /**
* Convertit les coordonnées à l'écran en coordonnées du monde * Convertit les coordonnées à l'écran en coordonnées du monde
* d'après la vue caméra * d'après la vue caméra
@ -69,14 +64,14 @@ public:
virtual void save(std::string name); virtual void save(std::string name);
/** /**
* Appelé par le manager lorsque l'état commence à être utilisé * Appelé par le manager lorsque l'état est utilisé
*/ */
virtual void begin(); virtual void begin();
/** /**
* Demande le passage à la frame suivante sur cet état * Traite l'événement donné
*/ */
virtual void frame(const std::vector<sf::Event>& events); virtual void processEvent(const sf::Event& event);
/** /**
* Récupère le nom du niveau * Récupère le nom du niveau

View File

@ -21,11 +21,6 @@ private:
unsigned int selection; unsigned int selection;
protected: protected:
/**
* Traite l'événement donné
*/
virtual void processEvent(const sf::Event& event);
/** /**
* Affiche les règles du jeu * Affiche les règles du jeu
*/ */
@ -51,14 +46,19 @@ public:
virtual ~Menu(); virtual ~Menu();
/** /**
* Appelé par le manager lorsque le menu est affiché * Appelé par le manager lorsque l'état est utilisé
*/ */
virtual void begin(); virtual void begin();
/** /**
* Dessine la prochaine frame du menu * Traite l'événement donné
*/ */
virtual void frame(const std::vector<sf::Event>& events); virtual void processEvent(const sf::Event& event);
/**
* Demande le dessin d'une frame
*/
virtual void frame();
/** /**
* Affiche le menu principal * Affiche le menu principal

View File

@ -14,26 +14,24 @@ class State {
private: private:
Manager& manager; Manager& manager;
protected:
/**
* Traite l'événement donné
*/
virtual void processEvent(const sf::Event& event) = 0;
public: public:
State(Manager& manager); State(Manager& manager);
virtual ~State(); virtual ~State();
/** /**
* Appelé par le manager lorsque l'état commence à * Appelé par le manager lorsque l'état est utilisé
* être utilisé
*/ */
virtual void begin() = 0; virtual void begin() = 0;
/** /**
* Demande le passage à la frame suivante sur cet état * Traite l'événement donné
*/ */
virtual void frame(const std::vector<sf::Event>& events); virtual void processEvent(const sf::Event& event) = 0;
/**
* Demande le dessin d'une frame
*/
virtual void frame() = 0;
/** /**
* Récupère le gestionnaire * Récupère le gestionnaire

View File

@ -39,17 +39,6 @@ void Editor::begin() {
getWindow().setFramerateLimit(60); getWindow().setFramerateLimit(60);
} }
void Editor::frame(const std::vector<sf::Event>& events) {
// traitement des événements
Level::frame(events);
// titre de la fenêtre
getManager().setTitle(sf::String(L"Édition de ") + getName());
// dessin de la frame
draw();
}
void Editor::processEvent(const sf::Event& event) { void Editor::processEvent(const sf::Event& event) {
Level::processEvent(event); Level::processEvent(event);
@ -173,6 +162,14 @@ void Editor::processEvent(const sf::Event& event) {
} }
} }
void Editor::frame() {
// titre de la fenêtre
getManager().setTitle(sf::String(L"Édition de ") + getName());
// dessin de la frame
draw();
}
void Editor::draw() { void Editor::draw() {
sf::RenderWindow& window = getWindow(); sf::RenderWindow& window = getWindow();
sf::Vector2i window_size = (sf::Vector2i) window.getSize(); sf::Vector2i window_size = (sf::Vector2i) window.getSize();

View File

@ -17,10 +17,17 @@ void Game::begin() {
getWindow().setFramerateLimit(0); getWindow().setFramerateLimit(0);
} }
void Game::frame(const std::vector<sf::Event>& events) { void Game::processEvent(const sf::Event& event) {
// traitement des événements Level::processEvent(event);
Level::frame(events);
// 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;
getManager().setState(return_state);
}
}
void Game::frame() {
// titre de la fenêtre // titre de la fenêtre
getManager().setTitle(getName()); getManager().setTitle(getName());
sf::Time current_time = getManager().getCurrentTime(); sf::Time current_time = getManager().getCurrentTime();
@ -47,16 +54,6 @@ void Game::frame(const std::vector<sf::Event>& events) {
} }
} }
void Game::processEvent(const sf::Event& event) {
Level::processEvent(event);
// 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;
getManager().setState(return_state);
}
}
void Game::draw() { void Game::draw() {
sf::Vector2i window_size = (sf::Vector2i) getWindow().getSize(); sf::Vector2i window_size = (sf::Vector2i) getWindow().getSize();

View File

@ -138,11 +138,6 @@ void Level::begin() {
} }
} }
void Level::frame(const std::vector<sf::Event>& events) {
// traitement des événements
State::frame(events);
}
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

View File

@ -19,6 +19,11 @@ void Manager::start() {
next_state = nullptr; 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
@ -33,16 +38,11 @@ void Manager::start() {
)); ));
} }
events.push_back(event); state->processEvent(event);
} }
// demande à l'état de se mettre à jour sur // affichage de la prochaine frame
// la prochaine frame state->frame();
if (state == NULL) {
throw std::runtime_error("Aucune état à afficher pour le jeu");
}
state->frame(events);
window.display(); window.display();
} }
} }

View File

@ -15,10 +15,58 @@ void Menu::begin() {
getWindow().setFramerateLimit(60); getWindow().setFramerateLimit(60);
} }
void Menu::frame(const std::vector<sf::Event>& events) { void Menu::processEvent(const sf::Event& event) {
// traitement des événements // gestion des touches
State::frame(events); if (event.type == sf::Event::KeyPressed) {
// touche flèche haut : on passe au choix précédent
if (event.key.code == sf::Keyboard::Up) {
if (selection == 0) {
selection = choices.size() - 1;
} else {
selection--;
}
}
// touche flèche bas : on passe au choix suivant
if (event.key.code == sf::Keyboard::Down) {
if (selection == choices.size() - 1) {
selection = 0;
} else {
selection++;
}
}
// touche entrée : on exécute le choix sélectionné
if (event.key.code == sf::Keyboard::Return) {
actions[selection]();
}
}
// au clic, on exécute le choix pointé s'il y a lieu
if (event.type == sf::Event::MouseButtonPressed) {
sf::Vector2f position(event.mouseButton.x, event.mouseButton.y);
for (unsigned int i = 0; i < labels.size(); i++) {
if (labels[i].getGlobalBounds().contains(position)) {
actions[i]();
return;
}
}
}
// au déplacement de souris, on sélectionne le choix pointé s'il y a lieu
if (event.type == sf::Event::MouseMoved) {
sf::Vector2f position(event.mouseMove.x, event.mouseMove.y);
for (unsigned int i = 0; i < labels.size(); i++) {
if (labels[i].getGlobalBounds().contains(position)) {
selection = i;
}
}
}
}
void Menu::frame() {
// titre de la fenêtre // titre de la fenêtre
getManager().setTitle(""); getManager().setTitle("");
@ -87,57 +135,6 @@ void Menu::frame(const std::vector<sf::Event>& events) {
window.display(); window.display();
} }
void Menu::processEvent(const sf::Event& event) {
// gestion des touches
if (event.type == sf::Event::KeyPressed) {
// touche flèche haut : on passe au choix précédent
if (event.key.code == sf::Keyboard::Up) {
if (selection == 0) {
selection = choices.size() - 1;
} else {
selection--;
}
}
// touche flèche bas : on passe au choix suivant
if (event.key.code == sf::Keyboard::Down) {
if (selection == choices.size() - 1) {
selection = 0;
} else {
selection++;
}
}
// touche entrée : on exécute le choix sélectionné
if (event.key.code == sf::Keyboard::Return) {
actions[selection]();
}
}
// au clic, on exécute le choix pointé s'il y a lieu
if (event.type == sf::Event::MouseButtonPressed) {
sf::Vector2f position(event.mouseButton.x, event.mouseButton.y);
for (unsigned int i = 0; i < labels.size(); i++) {
if (labels[i].getGlobalBounds().contains(position)) {
actions[i]();
return;
}
}
}
// au déplacement de souris, on sélectionne le choix pointé s'il y a lieu
if (event.type == sf::Event::MouseMoved) {
sf::Vector2f position(event.mouseMove.x, event.mouseMove.y);
for (unsigned int i = 0; i < labels.size(); i++) {
if (labels[i].getGlobalBounds().contains(position)) {
selection = i;
}
}
}
}
void Menu::loadMainMenu() { void Menu::loadMainMenu() {
choices.clear(); choices.clear();
actions.clear(); actions.clear();

View File

@ -4,18 +4,10 @@
State::State(Manager& manager) : manager(manager) {} State::State(Manager& manager) : manager(manager) {}
State::~State() {} State::~State() {}
void State::frame(const std::vector<sf::Event>& events) {
// traitement des événements
for (unsigned int i = 0; i < events.size(); i++) {
processEvent(events[i]);
}
}
Manager& State::getManager() { Manager& State::getManager() {
return manager; return manager;
} }
// raccourcis vers des méthodes du gestionnaire
ResourceManager& State::getResourceManager() { ResourceManager& State::getResourceManager() {
return manager.getResourceManager(); return manager.getResourceManager();
} }