Implémentation initiale des modales
This commit is contained in:
parent
8ea50f3202
commit
5dd8608ced
|
@ -0,0 +1,60 @@
|
||||||
|
#ifndef __SKIZZLE_MODAL_HPP__
|
||||||
|
#define __SKIZZLE_MODAL_HPP__
|
||||||
|
|
||||||
|
#include <SFGUI/Widgets.hpp>
|
||||||
|
#include <SFML/Graphics.hpp>
|
||||||
|
#include <functional>
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Classe de base pour les fenêtres modales
|
||||||
|
* qui bloquent l'accès aux autres éléments du jeu
|
||||||
|
*/
|
||||||
|
class Modal {
|
||||||
|
protected:
|
||||||
|
sfg::Window::Ptr modal_main_window;
|
||||||
|
sfg::Window::Ptr modal_inner_window;
|
||||||
|
|
||||||
|
sfg::Box::Ptr layout_box;
|
||||||
|
sfg::Box::Ptr buttons_box;
|
||||||
|
|
||||||
|
sfg::Label::Ptr title_label;
|
||||||
|
sfg::Label::Ptr subtitle_label;
|
||||||
|
|
||||||
|
public:
|
||||||
|
Modal();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Récupère la fenêtre de la modale
|
||||||
|
*/
|
||||||
|
sfg::Window::Ptr getWindow();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Récupère la boîte de layout interne de la modale
|
||||||
|
*/
|
||||||
|
sfg::Box::Ptr getLayoutBox();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Ajoute un nouveau bouton à la modale
|
||||||
|
*/
|
||||||
|
sfg::Button::Ptr addButton(
|
||||||
|
sf::String label,
|
||||||
|
std::function<void()> callback = std::function<void()>()
|
||||||
|
);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Modifie le titre de la modale
|
||||||
|
*/
|
||||||
|
void setTitle(sf::String label);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Modifie le sous-titre de la modale
|
||||||
|
*/
|
||||||
|
void setSubtitle(sf::String label);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Redimensionne la modale pour qu'elle prenne tout l'espace donné
|
||||||
|
*/
|
||||||
|
void resize(sf::Vector2u size);
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif
|
|
@ -1,6 +1,7 @@
|
||||||
#ifndef __SKIZZLE_GAME_HPP__
|
#ifndef __SKIZZLE_GAME_HPP__
|
||||||
#define __SKIZZLE_GAME_HPP__
|
#define __SKIZZLE_GAME_HPP__
|
||||||
|
|
||||||
|
#include "../gui/modal.hpp"
|
||||||
#include "level.hpp"
|
#include "level.hpp"
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -31,6 +32,11 @@ private:
|
||||||
|
|
||||||
float time_left;
|
float time_left;
|
||||||
|
|
||||||
|
sfg::Label::Ptr death_message;
|
||||||
|
Modal pause_modal;
|
||||||
|
Modal won_modal;
|
||||||
|
Modal lost_modal;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Met à jour les objets du jeu pour
|
* Met à jour les objets du jeu pour
|
||||||
* qu'ils s'adaptent au nouvel état
|
* qu'ils s'adaptent au nouvel état
|
||||||
|
|
|
@ -19,6 +19,19 @@
|
||||||
Window {
|
Window {
|
||||||
BackgroundColor: #FFFFFFff;
|
BackgroundColor: #FFFFFFff;
|
||||||
BorderWidth: 0;
|
BorderWidth: 0;
|
||||||
|
TitleBackgroundColor: #00000000;
|
||||||
|
}
|
||||||
|
|
||||||
|
Window.modal {
|
||||||
|
BackgroundColor: #00000000;
|
||||||
|
}
|
||||||
|
|
||||||
|
Window.modal Window {
|
||||||
|
Gap: 20;
|
||||||
|
}
|
||||||
|
|
||||||
|
Window.modal .title {
|
||||||
|
FontSize: 24;
|
||||||
}
|
}
|
||||||
|
|
||||||
ScrolledWindow {
|
ScrolledWindow {
|
||||||
|
|
|
@ -0,0 +1,68 @@
|
||||||
|
#include "gui/modal.hpp"
|
||||||
|
#include <iostream>
|
||||||
|
|
||||||
|
Modal::Modal() {
|
||||||
|
// création des fenêtres
|
||||||
|
modal_main_window = sfg::Window::Create(sfg::Window::Style::BACKGROUND);
|
||||||
|
modal_inner_window = sfg::Window::Create(sfg::Window::Style::BACKGROUND);
|
||||||
|
|
||||||
|
modal_main_window->SetClass("modal");
|
||||||
|
|
||||||
|
// la fenêtre interne est alignée au centre de la principale
|
||||||
|
sfg::Alignment::Ptr inner_alignment = sfg::Alignment::Create();
|
||||||
|
inner_alignment->SetAlignment(sf::Vector2f(.5f, .5f));
|
||||||
|
inner_alignment->SetScale(sf::Vector2f(.0f, .0f));
|
||||||
|
|
||||||
|
// ajout des éléments dans la fenêtre interne
|
||||||
|
layout_box = sfg::Box::Create(sfg::Box::Orientation::VERTICAL, 10.f);
|
||||||
|
buttons_box = sfg::Box::Create(sfg::Box::Orientation::HORIZONTAL, 10.f);
|
||||||
|
sfg::Alignment::Ptr spacer = sfg::Alignment::Create();
|
||||||
|
|
||||||
|
title_label = sfg::Label::Create("");
|
||||||
|
subtitle_label = sfg::Label::Create("");
|
||||||
|
spacer->SetRequisition(sf::Vector2f(1.f, 6.f));
|
||||||
|
title_label->SetClass("title");
|
||||||
|
|
||||||
|
layout_box->PackEnd(title_label);
|
||||||
|
layout_box->PackEnd(subtitle_label);
|
||||||
|
layout_box->PackEnd(spacer);
|
||||||
|
layout_box->PackEnd(buttons_box);
|
||||||
|
modal_inner_window->Add(layout_box);
|
||||||
|
|
||||||
|
inner_alignment->Add(modal_inner_window);
|
||||||
|
modal_main_window->Add(inner_alignment);
|
||||||
|
}
|
||||||
|
|
||||||
|
sfg::Window::Ptr Modal::getWindow() {
|
||||||
|
return modal_main_window;
|
||||||
|
}
|
||||||
|
|
||||||
|
sfg::Box::Ptr Modal::getLayoutBox() {
|
||||||
|
return layout_box;
|
||||||
|
}
|
||||||
|
|
||||||
|
sfg::Button::Ptr Modal::addButton(sf::String label, std::function<void()> callback) {
|
||||||
|
sfg::Button::Ptr button = sfg::Button::Create(label);
|
||||||
|
|
||||||
|
// liaison du bouton avec la callback, s'il y en a une
|
||||||
|
if (callback) {
|
||||||
|
button->GetSignal(sfg::Widget::OnLeftClick).Connect(callback);
|
||||||
|
}
|
||||||
|
|
||||||
|
buttons_box->PackEnd(button);
|
||||||
|
return button;
|
||||||
|
}
|
||||||
|
|
||||||
|
void Modal::setTitle(sf::String label) {
|
||||||
|
title_label->SetText(label);
|
||||||
|
}
|
||||||
|
|
||||||
|
void Modal::setSubtitle(sf::String label) {
|
||||||
|
subtitle_label->SetText(label);
|
||||||
|
}
|
||||||
|
|
||||||
|
void Modal::resize(sf::Vector2u size) {
|
||||||
|
modal_main_window->SetAllocation(sf::FloatRect(
|
||||||
|
0, 0, size.x, size.y
|
||||||
|
));
|
||||||
|
}
|
|
@ -34,9 +34,35 @@ Game::Game(Manager& manager, bool test) : Level(manager),
|
||||||
std::bind(&Game::switchPause, this)
|
std::bind(&Game::switchPause, this)
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// création des modales
|
||||||
|
pause_modal.setTitle("En pause");
|
||||||
|
pause_modal.addButton("Reprendre", std::bind(&Game::switchPause, this));
|
||||||
|
pause_modal.addButton("Recommencer", std::bind(&Game::restart, this));
|
||||||
|
|
||||||
|
won_modal.setTitle(L"Vous avez gagné !");
|
||||||
|
won_modal.addButton("Sortir", std::bind(&Manager::popState, &getManager()));
|
||||||
|
won_modal.addButton("Recommencer", std::bind(&Game::restart, this));
|
||||||
|
|
||||||
|
lost_modal.setTitle(L"Perdu…");
|
||||||
|
lost_modal.addButton("Sortir", std::bind(&Manager::popState, &getManager()));
|
||||||
|
lost_modal.addButton("Recommencer", std::bind(&Game::restart, this));
|
||||||
|
|
||||||
|
// ajout des modales
|
||||||
|
pause_modal.getWindow()->Show(false);
|
||||||
|
won_modal.getWindow()->Show(false);
|
||||||
|
lost_modal.getWindow()->Show(false);
|
||||||
|
|
||||||
|
getManager().addWidget(pause_modal.getWindow());
|
||||||
|
getManager().addWidget(won_modal.getWindow());
|
||||||
|
getManager().addWidget(lost_modal.getWindow());
|
||||||
}
|
}
|
||||||
|
|
||||||
Game::~Game() {}
|
Game::~Game() {
|
||||||
|
getManager().removeWidget(pause_modal.getWindow());
|
||||||
|
getManager().removeWidget(won_modal.getWindow());
|
||||||
|
getManager().removeWidget(lost_modal.getWindow());
|
||||||
|
}
|
||||||
|
|
||||||
void Game::enable() {
|
void Game::enable() {
|
||||||
Level::enable();
|
Level::enable();
|
||||||
|
@ -96,6 +122,29 @@ void Game::frame() {
|
||||||
Level::frame();
|
Level::frame();
|
||||||
sf::Time current_time = getManager().getCurrentTime();
|
sf::Time current_time = getManager().getCurrentTime();
|
||||||
|
|
||||||
|
// on affiche les modales correctes selon l'état du jeu
|
||||||
|
pause_modal.getWindow()->Show(false);
|
||||||
|
won_modal.getWindow()->Show(false);
|
||||||
|
lost_modal.getWindow()->Show(false);
|
||||||
|
|
||||||
|
switch (getMode()) {
|
||||||
|
case Game::Mode::NORMAL:
|
||||||
|
// rien à faire, le jeu suit son cours
|
||||||
|
break;
|
||||||
|
case Game::Mode::PAUSED:
|
||||||
|
pause_modal.resize(getManager().getWindow().getSize());
|
||||||
|
pause_modal.getWindow()->Show(true);
|
||||||
|
break;
|
||||||
|
case Game::Mode::WON:
|
||||||
|
won_modal.resize(getManager().getWindow().getSize());
|
||||||
|
won_modal.getWindow()->Show(true);
|
||||||
|
break;
|
||||||
|
case Game::Mode::LOST:
|
||||||
|
lost_modal.resize(getManager().getWindow().getSize());
|
||||||
|
lost_modal.getWindow()->Show(true);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
if (current_time >= next_frame_time) {
|
if (current_time >= next_frame_time) {
|
||||||
// si nous sommes en retard ou dans les temps
|
// si nous sommes en retard ou dans les temps
|
||||||
// on replanifie la prochaine frame
|
// on replanifie la prochaine frame
|
||||||
|
@ -105,39 +154,6 @@ void Game::frame() {
|
||||||
// si on est en mode normal
|
// si on est en mode normal
|
||||||
if (getMode() == Game::Mode::NORMAL) {
|
if (getMode() == Game::Mode::NORMAL) {
|
||||||
update();
|
update();
|
||||||
} else {
|
|
||||||
// TODO: pour le débogage affichage du mode actuel
|
|
||||||
switch (getMode()) {
|
|
||||||
case Game::Mode::NORMAL:
|
|
||||||
std::cout << "<< Reprise >>" << std::endl;
|
|
||||||
break;
|
|
||||||
case Game::Mode::PAUSED:
|
|
||||||
std::cout << "<< En pause >>" << std::endl;
|
|
||||||
break;
|
|
||||||
case Game::Mode::WON:
|
|
||||||
std::cout << "<< Gagné ! >>" << std::endl;
|
|
||||||
break;
|
|
||||||
case Game::Mode::LOST:
|
|
||||||
std::cout << "<< Perdu : ";
|
|
||||||
|
|
||||||
switch (getDeathCause()) {
|
|
||||||
case Game::DeathCause::OUT_OF_BOUNDS:
|
|
||||||
std::cout << "sortie du cadre";
|
|
||||||
break;
|
|
||||||
case Game::DeathCause::KILLED:
|
|
||||||
std::cout << "tué par bloc";
|
|
||||||
break;
|
|
||||||
case Game::DeathCause::TIME_OUT:
|
|
||||||
std::cout << "temps écoulé";
|
|
||||||
break;
|
|
||||||
case Game::DeathCause::NONE:
|
|
||||||
std::cout << "sans aucune raison";
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
std::cout << " ! >>" << std::endl;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// on s'assure que la caméra soit centrée sur nos joueurs
|
// on s'assure que la caméra soit centrée sur nos joueurs
|
||||||
|
@ -301,6 +317,22 @@ Game::Mode Game::getMode() {
|
||||||
|
|
||||||
void Game::setDeathCause(Game::DeathCause set_death_cause) {
|
void Game::setDeathCause(Game::DeathCause set_death_cause) {
|
||||||
death_cause = set_death_cause;
|
death_cause = set_death_cause;
|
||||||
|
|
||||||
|
// mise à jour du label informant de la cause de la mort
|
||||||
|
switch (getDeathCause()) {
|
||||||
|
case Game::DeathCause::OUT_OF_BOUNDS:
|
||||||
|
lost_modal.setSubtitle(L"Vous êtes sorti de la zone de jeu");
|
||||||
|
break;
|
||||||
|
case Game::DeathCause::KILLED:
|
||||||
|
lost_modal.setSubtitle(L"Vous avez touché un bloc tueur");
|
||||||
|
break;
|
||||||
|
case Game::DeathCause::TIME_OUT:
|
||||||
|
lost_modal.setSubtitle(L"Le temps est écoulé !");
|
||||||
|
break;
|
||||||
|
case Game::DeathCause::NONE:
|
||||||
|
lost_modal.setSubtitle("");
|
||||||
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Game::DeathCause Game::getDeathCause() {
|
Game::DeathCause Game::getDeathCause() {
|
||||||
|
|
Loading…
Reference in New Issue