Buttons on screens work and most screens now have a continue/quit button.

This commit is contained in:
Zed A. Shaw 2026-04-02 14:14:54 -04:00
parent 532366091b
commit 17f05e7093
9 changed files with 165 additions and 17 deletions

View file

@ -68,11 +68,18 @@ namespace gui {
switch(ev) {
case MOUSE_CLICK:
mouse_action(guecs::NO_MODS);
break;
case MOUSE_MOVE: {
mouse_action({1 << guecs::ModBit::hover});
} break;
case START:
close_scene();
state(State::IDLE);
break;
case MOUSE_MOVE: {
} break;
case QUIT:
FSM::IDLE(ev, {});
break;
case TICK:
break;
default:
@ -86,8 +93,17 @@ namespace gui {
switch(ev) {
case MOUSE_CLICK:
show_scene("STARTING");
state(State::START_SCENE);
mouse_action(guecs::NO_MODS);
break;
case MOUSE_MOVE: {
mouse_action({1 << guecs::ModBit::hover});
} break;
case START:
close_scene();
state(State::IDLE);
break;
case QUIT:
FSM::IDLE(ev, {});
break;
default:
break;
@ -99,8 +115,17 @@ namespace gui {
switch(ev) {
case MOUSE_CLICK:
show_scene("STARTING");
state(State::START_SCENE);
mouse_action(guecs::NO_MODS);
break;
case MOUSE_MOVE: {
mouse_action({1 << guecs::ModBit::hover});
} break;
case START:
close_scene();
state(State::IDLE);
break;
case QUIT:
FSM::IDLE(ev, {});
break;
default:
break;
@ -112,10 +137,18 @@ namespace gui {
switch(ev) {
case MOUSE_CLICK:
next_level();
mouse_action(guecs::NO_MODS);
break;
case MOUSE_MOVE: {
mouse_action({1 << guecs::ModBit::hover});
} break;
case START:
close_scene();
state(State::IDLE);
break;
case QUIT:
FSM::IDLE(ev, {});
break;
default:
break;
}
@ -246,7 +279,7 @@ namespace gui {
fmt::println("!!!!!!!!!!!!!! COMBAT START in IDLE");
break;
case COMBAT_STOP:
fmt::println("!!!!!!!!!!!!!!!! COMBAT STOP in IDLE");
fmt::println("!!!!!!!!!!!!!! COMBAT STOP in IDLE");
break;
default:
break; // ignore everything else
@ -278,6 +311,12 @@ namespace gui {
void FSM::mouse_action(guecs::Modifiers mods) {
sf::Vector2f pos = mouse_position();
if($cur_scene != nullptr) {
$cur_scene->mouse(pos.x, pos.y, mods);
return;
}
if($debug_ui.active) $debug_ui.mouse(pos.x, pos.y, mods);
$status_ui.mouse(pos.x, pos.y, mods);
@ -460,6 +499,9 @@ namespace gui {
show_scene("NEXT_LEVEL");
state(State::NEXT_LEVEL_SCENE);
break;
case eGUI::START:
event(Event::START, data);
break;
case eGUI::DEATH: {
$status_ui.update();

View file

@ -1,16 +1,60 @@
#include "gui/scene_ui.hpp"
#include "game/config.hpp"
#include "events.hpp"
#include "gui/guecstra.hpp"
#include <iostream>
#define DEBUG 0
namespace gui {
void SceneUI::init() {
$view_sprite.setPosition({0,0});
$scene.init();
create_buttons($scene.buttons());
}
void SceneUI::create_buttons(nlohmann::json& buttons) {
// buttons are optional
if(buttons.size() == 0) return;
// alright have buttons
has_buttons = true;
std::string layout{};
auto& actions = buttons["actions"];
for(auto& line : buttons["layout"]) {
layout.append(line);
}
auto& button_cell = $scene.button_cell();
$ui.position(button_cell.x, button_cell.y, button_cell.w, button_cell.h);
$ui.layout(layout);
for(auto& [name, cell] : $ui.cells()) {
auto ui_id = $ui.entity(name);
$ui.set<guecs::Text>(ui_id, {guecs::to_wstring(name)});
$ui.set<guecs::Rectangle>(ui_id, {});
$ui.set<guecs::Effect>(ui_id, {});
if(actions.contains(name)) {
auto event_id = actions[name];
$ui.set<guecs::Clickable>(ui_id, guecs::make_action(ui_id, event_id));
}
}
$ui.init();
}
void SceneUI::render(sf::RenderTarget &target) {
$scene.render($view_texture);
target.draw($view_sprite);
if(has_buttons) {
$ui.render(target);
if(DEBUG) $ui.debug_layout(target);
}
}
void SceneUI::update() {
@ -19,6 +63,7 @@ namespace gui {
bool SceneUI::mouse(float x, float y, guecs::Modifiers mods) {
$scene.mouse(x, y, mods);
$ui.mouse(x, y, mods);
return false;
}

View file

@ -12,8 +12,11 @@ namespace gui {
sf::Sprite $view_sprite{$view_texture.getTexture()};
AnimatedScene $scene_data{load_scene(name)};
scene::Engine $scene{$scene_data};
bool has_buttons = false;
guecs::UI $ui;
AnimatedScene load_scene(const std::string& name);
void create_buttons(nlohmann::json& buttons);
void init();
void render(sf::RenderTarget &target);