Le menu à la souris ? C'est pas possible...

Mais si, c'est possible ! avec la carte kiwi : l'enfant de moins
de 16 ans - et ceux qui l'accompagnent, jusqu'à 4 personnes -
payent tous moitié prix ! Un enfant, une carte kiwi, et on voyage
à moitié prix !
This commit is contained in:
Mattéo Delabre 2016-04-09 03:11:14 +02:00
parent dc8a0e05d8
commit 0057debdfe
3 changed files with 67 additions and 32 deletions

View File

@ -14,6 +14,7 @@
class Menu : public View { class Menu : public View {
private: private:
std::vector<sf::String> choices; std::vector<sf::String> choices;
std::vector<sf::Text> labels;
std::vector<std::function<void(void)>> actions; std::vector<std::function<void(void)>> actions;
unsigned int selection; unsigned int selection;
@ -23,6 +24,26 @@ protected:
*/ */
virtual void processEvent(const sf::Event& event); virtual void processEvent(const sf::Event& event);
/**
* Affiche les règles du jeu
*/
void loadRules();
/**
* Démarre l'éditeur
*/
void launchEditor();
/**
* Démarre le jeu avec le niveau donné
*/
void launchGame(std::string name);
/**
* Quitte le jeu et le menu
*/
void quit();
public: public:
Menu(Manager& manager); Menu(Manager& manager);
virtual ~Menu(); virtual ~Menu();
@ -47,26 +68,6 @@ public:
* Affiche le menu de choix des niveaux * Affiche le menu de choix des niveaux
*/ */
void loadLevelMenu(); void loadLevelMenu();
/**
* Affiche les règles du jeu
*/
void loadRules();
/**
* Démarre l'éditeur
*/
void launchEditor();
/**
* Démarre le jeu avec le niveau donné
*/
void launchGame(std::string name);
/**
* Quitte le jeu et le menu
*/
void quit();
}; };

View File

@ -118,6 +118,8 @@ void Level::begin() {
if (music_name != "") { if (music_name != "") {
resources.setMusic(music_name); resources.setMusic(music_name);
resources.playMusic(); resources.playMusic();
} else {
resources.stopMusic();
} }
} }

View File

@ -4,7 +4,6 @@
#include <cmath> #include <cmath>
const float MAX_WIDTH_PROPORTION = 1.f / 3.f; const float MAX_WIDTH_PROPORTION = 1.f / 3.f;
const float PADDING = 24.f;
Menu::Menu(Manager& manager) : View(manager) {} Menu::Menu(Manager& manager) : View(manager) {}
Menu::~Menu() {} Menu::~Menu() {}
@ -31,32 +30,42 @@ void Menu::frame(const std::vector<sf::Event>& events) {
sf::Vector2f size = (sf::Vector2f) window.getSize(); sf::Vector2f size = (sf::Vector2f) window.getSize();
sf::Font font = manager.getResourceManager().getFont("raleway.ttf"); sf::Font font = manager.getResourceManager().getFont("raleway.ttf");
manager.resetDefaultView();
window.clear(sf::Color(66, 40, 245)); window.clear(sf::Color(66, 40, 245));
// TODO: dessiner l'image du fond // TODO: dessiner l'image du fond
// on crée les textes pour chaque choix et on les dessine // on crée les textes pour chaque choix et on les dessine
float step = size.y / (choices.size() + 1); float step = size.y / (choices.size() + 1);
int font_size = std::max((int) std::floor(step - PADDING), 12); int font_size = std::max((int) step / 3, 12);
labels.clear();
for (unsigned int i = 0; i < choices.size(); i++) { for (unsigned int i = 0; i < choices.size(); i++) {
sf::Text label(choices[i], font, 32); sf::Text label(choices[i], font, font_size);
sf::Vector2f position( sf::FloatRect text_size = label.getLocalBounds();
(1 - MAX_WIDTH_PROPORTION) * size.x,
step * (i + 1) - font_size / 2 sf::Vector2f base_position(
size.x - (font_size * 8),
step * (i + 1)
); );
float width = label.getGlobalBounds().width;
label.setPosition(position);
label.setColor(sf::Color::White); label.setColor(sf::Color::White);
label.setPosition(base_position - sf::Vector2f(
text_size.left, text_size.top + text_size.height / 2
));
// si c'est le choix sélecitonné, on le souligne // si c'est le choix sélectionné, on le souligne
if (selection == i) { if (selection == i) {
sf::RectangleShape underline(sf::Vector2f(width, 2.f)); sf::RectangleShape underline(sf::Vector2f(text_size.width, 2.f));
underline.setPosition(position.x, position.y + font_size / 2 + 6);
underline.setFillColor(sf::Color::White); underline.setFillColor(sf::Color::White);
underline.setPosition(base_position + sf::Vector2f(
0, text_size.height / 2 + 8
));
window.draw(underline); window.draw(underline);
} }
labels.push_back(label);
window.draw(label); window.draw(label);
} }
@ -77,7 +86,7 @@ void Menu::processEvent(const sf::Event& event) {
// touche flèche bas : on passe au choix suivant // touche flèche bas : on passe au choix suivant
if (event.key.code == sf::Keyboard::Down) { if (event.key.code == sf::Keyboard::Down) {
if (selection == choices.size()) { if (selection == choices.size() - 1) {
selection = 0; selection = 0;
} else { } else {
selection++; selection++;
@ -89,6 +98,29 @@ void Menu::processEvent(const sf::Event& event) {
actions[selection](); 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() {