diff --git a/include/rules.hpp b/include/rules.hpp new file mode 100644 index 0000000..b451a22 --- /dev/null +++ b/include/rules.hpp @@ -0,0 +1,30 @@ +#ifndef __PTF_RULES_HPP__ +#define __PTF_RULES_HPP__ + +#include "manager.hpp" +#include "state.hpp" + +/** + * La classe Rules affiche les règles du jeu + */ +class Rules : public State { +private: + sf::Sprite background; + +public: + Rules(Manager& manager); + virtual ~Rules(); + + /** + * Traite l'événement donné + */ + virtual void processEvent(const sf::Event& event); + + /** + * Demande le dessin d'une frame + */ + virtual void frame(); +}; + + +#endif diff --git a/src/game.cpp b/src/game.cpp index e05adb0..98dce3d 100644 --- a/src/game.cpp +++ b/src/game.cpp @@ -31,8 +31,9 @@ void Game::processEvent(const sf::Event& event) { getManager().popState(); } - // appui sur échap : échange entre le mode pause et normal - if (event.key.code == sf::Keyboard::Escape) { + // appui sur retour échap : échange entre le mode pause et normal + if (event.key.code == sf::Keyboard::Escape || + event.key.code == sf::Keyboard::BackSpace) { if (getMode() == Game::Mode::NORMAL) { setMode(Game::Mode::PAUSED); } else if (getMode() == Game::Mode::PAUSED) { diff --git a/src/menu.cpp b/src/menu.cpp index 3a86a4f..bcb5c6e 100644 --- a/src/menu.cpp +++ b/src/menu.cpp @@ -37,10 +37,17 @@ void Menu::processEvent(const sf::Event& event) { } } - // touche entrée : on exécute le choix sélectionné - if (event.key.code == sf::Keyboard::Return) { + // touche entrée ou espace : on exécute le choix sélectionné + if (event.key.code == sf::Keyboard::Return || + event.key.code == sf::Keyboard::Space) { actions[selection](); } + + // touche retour ou échap : on revient au menu principal + if (event.key.code == sf::Keyboard::BackSpace || + event.key.code == sf::Keyboard::Escape) { + loadMainMenu(); + } } // au clic, on exécute le choix pointé s'il y a lieu @@ -82,11 +89,13 @@ void Menu::frame() { // dessin du fond window.clear(sf::Color::White); + // on met à l'échelle le fond de telle sorte qu'il soit toujours + // entièrement visible en largeur float bg_scale = size.x / background.getLocalBounds().width; background.setScale(bg_scale, bg_scale); + background.setPosition(sf::Vector2f( - size.x / 2 - background.getGlobalBounds().width / 2, - size.y - background.getGlobalBounds().height + 0, size.y - background.getGlobalBounds().height )); window.draw(background); diff --git a/src/rules.cpp b/src/rules.cpp new file mode 100644 index 0000000..c269576 --- /dev/null +++ b/src/rules.cpp @@ -0,0 +1,48 @@ +#include "rules.hpp" +#include + +Rules::Rules(Manager& manager) : State(manager) { + background.setTexture(getResourceManager().getTexture("bg_rules.png")); + getWindow().setFramerateLimit(Manager::FPS); +} + +Rules::~Rules() {} + +void Rules::processEvent(const sf::Event& event) { + // appui sur échap, retour, entrée, espace : on dépile l'état + if (event.type == sf::Event::KeyPressed) { + if (event.key.code == sf::Keyboard::Escape || + event.key.code == sf::Keyboard::BackSpace || + event.key.code == sf::Keyboard::Return || + event.key.code == sf::Keyboard::Space) { + getManager().popState(); + } + } +} + +void Rules::frame() { + sf::RenderWindow& window = getWindow(); + sf::Vector2f size = (sf::Vector2f) window.getSize(); + + // titre de la fenêtre + getManager().setTitle(L"Règles"); + + // on s'assure d'être dans la vue par défaut (pas de zoom, 0x0 en haut gauche) + getManager().useGUIView(); + + // affichage du fond + window.clear(sf::Color(22, 22, 22)); + + // on met à l'échelle le fond de telle sorte qu'il soit toujours + // entièrement visible en hauteur + float bg_scale = size.y / 1100; + background.setScale(bg_scale, bg_scale); + + background.setPosition(sf::Vector2f( + size.x / 2 - background.getGlobalBounds().width / 2, + size.y / 2 - 720 * bg_scale + )); + + window.draw(background); + window.display(); +}