Réimplémentation du compte à rebours pour éditeur & jeu

This commit is contained in:
Mattéo Delabre 2016-04-28 14:27:48 +02:00
parent c9b6ce93ea
commit 231aee482e
7 changed files with 96 additions and 49 deletions

View File

@ -4,32 +4,31 @@
#include <SFGUI/Widgets.hpp>
#include <SFML/Graphics.hpp>
#include "../objects/object.hpp"
#include "../utility.hpp"
/**
* Barre d'outils pour les actions en jeu
* Barre d'outils pour les boutons d'actions en jeu
*/
class ActionToolbar {
private:
// widgets de la barre
sfg::Window::Ptr toolbar_window;
sfg::Box::Ptr toolbar_box;
sfg::Label::Ptr timer_label;
int left_buttons_count;
int time;
public:
ActionToolbar();
/**
* Ajoute un nouveau bouton d'action à la barre d'outils
* Ajoute un nouveau bouton d'action à gauche ou
* à droite de la barre d'action d'outils
*/
sfg::Button::Ptr addButton(
sf::Image image,
std::function<void()> callback = std::function<void()>()
);
/**
* Ajoute un nouvel espaceur
*/
sfg::Alignment::Ptr addSpacer(
float width, bool expand, bool fill
std::string name, Utility::Direction direction,
int position, std::function<void()> callback = std::function<void()>()
);
/**
@ -41,6 +40,16 @@ public:
* Récupère la taille désirée par la barre d'outils
*/
float getHeight();
/**
* Récupère le temps restant
*/
int getTime();
/**
* Modifie le temps restant
*/
void setTime(int set_time);
};
#endif

View File

@ -11,6 +11,11 @@
Color: #141414ff;
}
.timer {
FontName: monoid;
FontSize: 18;
}
Window {
BackgroundColor: #FFFFFFff;
BorderWidth: 0;

View File

@ -1,6 +1,7 @@
#include "resource_manager.hpp"
#include "gui/action_toolbar.hpp"
ActionToolbar::ActionToolbar() {
ActionToolbar::ActionToolbar() : left_buttons_count(0) {
// création de la boîte de la barre d'outils
toolbar_box = sfg::Box::Create(sfg::Box::Orientation::HORIZONTAL, 5.f);
@ -8,37 +9,50 @@ ActionToolbar::ActionToolbar() {
toolbar_window = sfg::Window::Create(sfg::Window::Style::BACKGROUND);
toolbar_window->Add(toolbar_box);
// ajout du timer et des espaceurs
sfg::Alignment::Ptr left_spacer = sfg::Alignment::Create();
sfg::Alignment::Ptr right_spacer = sfg::Alignment::Create();
timer_label = sfg::Label::Create("00:00");
left_spacer->SetRequisition(sf::Vector2f(5.f, 1.f));
timer_label->SetClass("timer");
right_spacer->SetRequisition(sf::Vector2f(5.f, 1.f));
toolbar_box->PackEnd(left_spacer, true, false);
toolbar_box->PackEnd(timer_label);
toolbar_box->PackEnd(right_spacer, true, false);
// pour les styles
toolbar_window->SetId("action_toolbar");
}
sfg::Button::Ptr ActionToolbar::addButton(
sf::Image image, std::function<void()> callback
std::string name, Utility::Direction direction,
int position, std::function<void()> callback
) {
// création d'un bouton avec pour image l'image passée
sfg::Button::Ptr button = sfg::Button::Create("");
button->SetImage(sfg::Image::Create(image));
button->SetClass("notext");
button->SetImage(sfg::Image::Create(
*ResourceManager::get().getImage("toolbar/icon_" + name + ".tga")
));
// liaison du bouton avec la callback, s'il y en a une
if (callback) {
button->GetSignal(sfg::Widget::OnLeftClick).Connect(callback);
}
// ajout du bouton à la barre
toolbar_box->PackEnd(button, false, false);
return button;
// ajout du bouton à la barre selon la position donnée
if (direction == Utility::Direction::WEST) {
position += left_buttons_count + 3;
} else {
left_buttons_count++;
}
sfg::Alignment::Ptr ActionToolbar::addSpacer(
float width, bool expand, bool fill
) {
sfg::Alignment::Ptr spacer = sfg::Alignment::Create();
spacer->SetRequisition(sf::Vector2f(width, 1.f));
toolbar_box->PackEnd(button, false, false);
toolbar_box->ReorderChild(button, position);
// ajout de l'espaceur à la barre
toolbar_box->PackEnd(spacer, expand, fill);
return spacer;
return button;
}
sfg::Window::Ptr ActionToolbar::getWindow() {
@ -48,3 +62,26 @@ sfg::Window::Ptr ActionToolbar::getWindow() {
float ActionToolbar::getHeight() {
return toolbar_window->GetRequisition().y;
}
int ActionToolbar::getTime() {
return time;
}
void ActionToolbar::setTime(int set_time) {
time = set_time;
// mise à jour du temps affiché sur le label
sf::String minutes = std::to_string(time / 60);
sf::String seconds = std::to_string(time % 60);
// ajout d'un zéro devant les secondes si nécessaire
if (minutes.getSize() == 1) {
minutes = "0" + minutes;
}
if (seconds.getSize() == 1) {
seconds = "0" + seconds;
}
timer_label->SetText(minutes + ":" + seconds);
}

View File

@ -36,14 +36,14 @@ ObjectToolbar::ObjectToolbar() {
&ObjectToolbar::createGravityBlock, this, Utility::Direction::EAST
));
addCreator("gravity_block_south", std::bind(
&ObjectToolbar::createGravityBlock, this, Utility::Direction::SOUTH
));
addCreator("gravity_block_west", std::bind(
&ObjectToolbar::createGravityBlock, this, Utility::Direction::WEST
));
addCreator("gravity_block_south", std::bind(
&ObjectToolbar::createGravityBlock, this, Utility::Direction::SOUTH
));
// attachement de la liste des créateurs à l'interface
toolbar_box->PackEnd(creators_table);

View File

@ -36,21 +36,18 @@ Editor::Editor(Manager& manager) : Level(manager),
drag_control_point(nullptr), drag_mode(Editor::DragMode::NONE) {
// ajout des boutons d'action de la barre d'action
action_toolbar.addButton("gear", Utility::Direction::WEST, 0);
action_toolbar.addButton(
*ResourceManager::get().getImage("toolbar/icon_gear.tga")
);
action_toolbar.addButton(
*ResourceManager::get().getImage("toolbar/icon_save.tga"),
"save", Utility::Direction::WEST, 1,
std::bind(&Editor::save, this)
);
action_toolbar.addButton(
*ResourceManager::get().getImage("toolbar/icon_test.tga"),
"test", Utility::Direction::WEST, 2,
std::bind(&Editor::test, this)
);
// ajout de la barre d'objets
// ajout de la barre d'objets à l'écran
getManager().addWidget(object_toolbar.getWindow());
}
@ -271,6 +268,9 @@ void Editor::frame() {
// dessin de la frame
draw();
// màj du temps du timer
action_toolbar.setTime(total_time);
// scroll de la caméra lorsque la souris se situe sur les bords
if (window.hasFocus()) {
sf::Vector2f cur_center = getCenterGoal();

View File

@ -25,12 +25,12 @@ Game::Game(Manager& manager, bool test) : Level(manager),
// ajout des boutons d'action de la barre d'action
if (!isTest()) {
action_toolbar.addButton(
*ResourceManager::get().getImage("toolbar/icon_restart.tga"),
"restart", Utility::Direction::WEST, 0,
std::bind(&Game::restart, this)
);
action_toolbar.addButton(
*ResourceManager::get().getImage("toolbar/icon_pause.tga"),
"pause", Utility::Direction::WEST, 1,
std::bind(&Game::switchPause, this)
);
}
@ -197,6 +197,8 @@ void Game::update() {
time_left -= Manager::FRAME_TIME.asSeconds();
}
action_toolbar.setTime(std::ceil(time_left));
// on tue les objets qui étaient déjà planifiés pour mourir
for (auto it = pending_kill.begin(); it != pending_kill.end(); it++) {
removeObject(*it);

View File

@ -70,27 +70,21 @@ Level::Level(Manager& manager) : State(manager),
// ajout des boutons d'action de la barre d'action
action_toolbar.addButton(
*ResourceManager::get().getImage("toolbar/icon_back.tga"),
"back", Utility::Direction::EAST, 0,
std::bind(&Manager::popState, &getManager())
);
mute_button = action_toolbar.addButton(
*ResourceManager::get().getImage("toolbar/icon_music.tga"),
"music", Utility::Direction::EAST, 1,
[]() {
// on inverse le drapeau de muet
// on inverse l'état muet ou non
ResourceManager::get().setMuted(
!ResourceManager::get().isMuted()
);
}
);
action_toolbar.addSpacer(5, true, false);
action_toolbar.addButton(
*ResourceManager::get().getImage("toolbar/icon_no_music.tga")
);
action_toolbar.addSpacer(5, true, false);
// ajout de la barre d'objets à l'écran
getManager().addWidget(action_toolbar.getWindow());
}