From 70a9420c1114d7673ae080437b1236f6168bef15 Mon Sep 17 00:00:00 2001 From: "Zed A. Shaw" Date: Thu, 20 Feb 2025 02:33:09 -0500 Subject: [PATCH] Started the overlay UI but need to make it possible to add/remove components to it. --- combat_ui.hpp | 2 -- guecs.cpp | 12 +----------- guecs.hpp | 14 ++++++++++++++ gui.cpp | 37 ++++++++++--------------------------- gui.hpp | 5 ++--- meson.build | 1 + overlay_ui.cpp | 36 ++++++++++++++++++++++++++++++++++++ overlay_ui.hpp | 27 +++++++++++++++++++++++++++ 8 files changed, 91 insertions(+), 43 deletions(-) create mode 100644 overlay_ui.cpp create mode 100644 overlay_ui.hpp diff --git a/combat_ui.hpp b/combat_ui.hpp index 1380e6b..5d0ac47 100644 --- a/combat_ui.hpp +++ b/combat_ui.hpp @@ -1,5 +1,4 @@ #pragma once -#include "panel.hpp" #include "levelmanager.hpp" #include #include @@ -17,7 +16,6 @@ namespace gui { void render(TexturePack& texture); void draw(sf::RenderWindow& window); void update_level(GameLevel &level) { $level = level; } - void click(int x, int y); void set_damage(float percent); }; } diff --git a/guecs.cpp b/guecs.cpp index b21ef4c..ebe1422 100644 --- a/guecs.cpp +++ b/guecs.cpp @@ -51,17 +51,7 @@ namespace guecs { }); $world.query([&](auto, auto &cell, auto &sprite) { - auto sprite_texture = textures.get(sprite.name); - sprite.texture = sprite_texture.texture; - sprite.sprite = make_shared(*sprite.texture); - sprite.sprite->setPosition({ - float(cell.x + GUECS_PADDING), - float(cell.y + GUECS_PADDING)}); - - auto size = sprite.texture->getSize(); - sprite.sprite->setScale({ - float(cell.w - GUECS_PADDING * 2) / size.x, - float(cell.h - GUECS_PADDING * 2) / size.y}); + sprite.init(cell, textures); }); } diff --git a/guecs.hpp b/guecs.hpp index ef223e0..f68146b 100644 --- a/guecs.hpp +++ b/guecs.hpp @@ -56,6 +56,20 @@ namespace guecs { std::string name; std::shared_ptr sprite = nullptr; std::shared_ptr texture = nullptr; + + void init(lel::Cell &cell, TexturePack &textures) { + auto sprite_texture = textures.get(name); + texture = sprite_texture.texture; + sprite = make_shared(*texture); + sprite->setPosition({ + float(cell.x + GUECS_PADDING), + float(cell.y + GUECS_PADDING)}); + + auto size = texture->getSize(); + sprite->setScale({ + float(cell.w - GUECS_PADDING * 2) / size.x, + float(cell.h - GUECS_PADDING * 2) / size.y}); + } }; struct Rectangle { diff --git a/gui.cpp b/gui.cpp index a29eb54..35962e3 100644 --- a/gui.cpp +++ b/gui.cpp @@ -18,6 +18,7 @@ namespace gui { $map_view($level), $combat_view($level), $status_view($level), + $overlay_view($level), $font{FONT_FILE_NAME}, $text{$font}, $rayview($textures, RAY_VIEW_WIDTH, RAY_VIEW_HEIGHT) @@ -53,7 +54,7 @@ namespace gui { $rayview.position_camera($player.x + 0.5, $player.y + 0.5); $combat_view.render($textures); - + $overlay_view.render($textures); $status_view.render($textures); $status_view.log("Welcome to the game!"); @@ -94,17 +95,11 @@ namespace gui { void FSM::ATTACKING(Event ev) { using enum Event; switch(ev) { - case TICK: - $rotation_count++; - - // just do 10 ticks - if($rotation_count % 10 == 0) { - System::combat($level); - run_systems(); - $rotation = -10.0f; - state(State::IN_COMBAT); - } - break; + case TICK: { + System::combat($level); + run_systems(); + state(State::IN_COMBAT); + } break; case STOP_COMBAT: dbc::log("Exiting ATTACKING STATE"); state(State::IDLE); @@ -186,7 +181,6 @@ namespace gui { switch(ev) { case ATTACK: $status_view.log("You attack!"); - $rotation = -30.0f; state(State::ATTACKING); break; case ROTATE_LEFT: @@ -281,14 +275,6 @@ namespace gui { $combat_view.set_damage(float(player_combat.hp) / float(player_combat.max_hp)); } - void FSM::draw_weapon() { - return; - auto weapon = $rayview.$textures.sword.sprite; - weapon->setPosition({SCREEN_WIDTH/2, SCREEN_HEIGHT/2}); - weapon->setRotation(sf::degrees($rotation)); - $window.draw(*weapon); - } - void FSM::draw_stats() { auto player = $level.world->get_the(); auto player_combat = $level.world->get(player.entity); @@ -316,16 +302,15 @@ namespace gui { auto player_combat = $level.world->get(player.entity); if(float(player_combat.hp) / float(player_combat.max_hp) < 0.5) { - auto blood = $textures.sprite_textures.at("blood_splatter").sprite; - blood->setPosition({RAY_VIEW_X,0}); - blood->setScale({3.0, 3.0}); - $window.draw(*blood); + $overlay_view.set("middle", {"blood_splatter"}); + $overlay_view.$gui.init($textures); } } void FSM::draw_gui() { $status_view.draw($window); $combat_view.draw($window); + $overlay_view.draw($window); auto debug = $level.world->get_the(); if(debug.FPS) draw_stats(); @@ -345,7 +330,6 @@ namespace gui { draw_gui(); draw_blood(); - draw_weapon(); } $window.display(); @@ -420,7 +404,6 @@ namespace gui { } break; case eGUI::ATTACK: - $rotation = 0; event(Event::ATTACK); break; case eGUI::DEATH: { diff --git a/gui.hpp b/gui.hpp index 225a94b..51687b7 100644 --- a/gui.hpp +++ b/gui.hpp @@ -9,6 +9,7 @@ #include "map_view.hpp" #include "combat_ui.hpp" #include "status_ui.hpp" +#include "overlay_ui.hpp" namespace gui { enum class State { @@ -43,8 +44,6 @@ namespace gui { class FSM : public DeadSimpleFSM { public: // ZED: these two will go away soon - int $rotation_count = 0; - float $rotation = -10.0f; bool $draw_stats = false; Point $player{0,0}; LevelManager $levels; @@ -54,6 +53,7 @@ namespace gui { MapViewUI $map_view; CombatUI $combat_view; StatusUI $status_view; + OverlayUI $overlay_view; CameraLOL $camera; sf::Font $font; sf::Text $text; @@ -77,7 +77,6 @@ namespace gui { void try_move(int dir, bool strafe); void keyboard(); - void draw_weapon(); void draw_stats(); void draw_gui(); void draw_blood(); diff --git a/meson.build b/meson.build index 5ab9bf8..6f21845 100644 --- a/meson.build +++ b/meson.build @@ -71,6 +71,7 @@ sources = [ 'map_view.cpp', 'matrix.cpp', 'matrix.cpp', + 'overlay_ui.cpp', 'panel.cpp', 'pathing.cpp', 'rand.cpp', diff --git a/overlay_ui.cpp b/overlay_ui.cpp new file mode 100644 index 0000000..b03a517 --- /dev/null +++ b/overlay_ui.cpp @@ -0,0 +1,36 @@ +#include "overlay_ui.hpp" +#include "constants.hpp" +#include "color.hpp" +#include "events.hpp" + +namespace gui { + using namespace guecs; + + OverlayUI::OverlayUI(GameLevel level) : + $level(level) + { + $gui.position(RAY_VIEW_X, RAY_VIEW_Y, RAY_VIEW_WIDTH, RAY_VIEW_HEIGHT); + $gui.layout( + "[top_left|top|top_right]" + "[*%(300,300)middle|_|_]" + "[_|_|_]" + "[_|_|_]" + "[bottom_left|bottom|bottom_right]" + ); + } + + void OverlayUI::render(TexturePack &textures) { + auto &world = $gui.world(); + for(auto &[name, cell] : $gui.cells()) { + auto region = $gui.entity(name); + $name_ents.insert_or_assign(name, region); + world.set(region, cell); + } + $gui.init(textures); + } + + void OverlayUI::draw(sf::RenderWindow& window) { + $gui.render(window); + } + +} diff --git a/overlay_ui.hpp b/overlay_ui.hpp new file mode 100644 index 0000000..b847761 --- /dev/null +++ b/overlay_ui.hpp @@ -0,0 +1,27 @@ +#pragma once +#include "levelmanager.hpp" +#include +#include +#include "guecs.hpp" + +namespace gui { + class OverlayUI { + public: + guecs::UI $gui; + GameLevel $level; + std::unordered_map $name_ents; + + OverlayUI(GameLevel level); + + void render(TexturePack& texture); + void draw(sf::RenderWindow& window); + void click(int x, int y); + + template + // this should be in the GUECS really + void set(std::string name, Comp val) { + auto ent = $name_ents.at(name); + $level.world->set(ent, val); + } + }; +}