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();
/**
* Traite un événement
*/
virtual void processEvent(const sf::Event& event);
public:
Editor(Manager& manager);
virtual ~Editor();
/**
* Appelé par le manager lorsque l'état commence à
* être utilisée
* Appelé par le manager lorsque l'état est utilisé
*/
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

View File

@ -28,11 +28,6 @@ protected:
*/
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
*/
@ -43,14 +38,19 @@ public:
virtual ~Game();
/**
* Appelé par le manager lorsque le jeu commence
* Appelé par le manager lorsque l'état est utilisé
*/
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

View File

@ -37,11 +37,6 @@ protected:
*/
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
* d'après la vue caméra
@ -69,14 +64,14 @@ public:
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();
/**
* 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

View File

@ -21,11 +21,6 @@ private:
unsigned int selection;
protected:
/**
* Traite l'événement donné
*/
virtual void processEvent(const sf::Event& event);
/**
* Affiche les règles du jeu
*/
@ -51,14 +46,19 @@ public:
virtual ~Menu();
/**
* Appelé par le manager lorsque le menu est affiché
* Appelé par le manager lorsque l'état est utilisé
*/
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

View File

@ -14,26 +14,24 @@ class State {
private:
Manager& manager;
protected:
/**
* Traite l'événement donné
*/
virtual void processEvent(const sf::Event& event) = 0;
public:
State(Manager& manager);
virtual ~State();
/**
* Appelé par le manager lorsque l'état commence à
* être utilisé
* Appelé par le manager lorsque l'état est utilisé
*/
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

View File

@ -39,17 +39,6 @@ void Editor::begin() {
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) {
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() {
sf::RenderWindow& window = getWindow();
sf::Vector2i window_size = (sf::Vector2i) window.getSize();

View File

@ -17,10 +17,17 @@ void Game::begin() {
getWindow().setFramerateLimit(0);
}
void Game::frame(const std::vector<sf::Event>& events) {
// traitement des événements
Level::frame(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::frame() {
// titre de la fenêtre
getManager().setTitle(getName());
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() {
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) {
// lorsque la fenêtre est redimensionnée, mise à jour
// de la taille de la caméra

View File

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

View File

@ -15,10 +15,58 @@ void Menu::begin() {
getWindow().setFramerateLimit(60);
}
void Menu::frame(const std::vector<sf::Event>& events) {
// traitement des événements
State::frame(events);
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::frame() {
// titre de la fenêtre
getManager().setTitle("");
@ -87,57 +135,6 @@ void Menu::frame(const std::vector<sf::Event>& events) {
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() {
choices.clear();
actions.clear();

View File

@ -4,18 +4,10 @@
State::State(Manager& manager) : manager(manager) {}
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() {
return manager;
}
// raccourcis vers des méthodes du gestionnaire
ResourceManager& State::getResourceManager() {
return manager.getResourceManager();
}