Two main GUI elements are placed for the left side status and the bottom combat UIs.

This commit is contained in:
Zed A. Shaw 2025-02-12 17:55:21 -05:00
parent 1790eec697
commit be4d0d51de
4 changed files with 123 additions and 27 deletions

101
gui.cpp
View file

@ -7,15 +7,71 @@
#include <numbers>
#include "systems.hpp"
#include "map_view.hpp"
#include <ftxui/dom/elements.hpp> // for hflow, paragraph, separator, hbox, vbox, filler, operator|, border, Element
#include <ftxui/dom/node.hpp> // for Render
#include <ftxui/screen/box.hpp> // for ftxui
#include <ftxui/component/loop.hpp>
#include <ftxui/screen/color.hpp>
#include <ftxui/dom/table.hpp>
using namespace components;
using namespace ftxui;
namespace gui {
void StatusUI::create_render() {
auto player = $level.world->get_the<Player>();
auto status_rend = Renderer([&, player]{
const auto& player_combat = $level.world->get<Combat>(player.entity);
const auto& combat = $level.world->get<Combat>(player.entity);
std::vector<Element> log_list;
log_list.push_back(text("Log messages here."));
auto log_box = vbox(log_list) | yflex_grow;
return hbox({
hflow(
vbox(
text(fmt::format("HP: {: >3} DMG: {: >3}",
player_combat.hp,
combat.damage)),
separator(),
log_box
) | flex_grow
)
});
});
set_renderer(status_rend);
}
void CombatUI::create_render() {
auto player = $level.world->get_the<Player>();
auto combat_rend = Renderer([&, player]{
const auto& player_combat = $level.world->get<Combat>(player.entity);
const auto& combat = $level.world->get<Combat>(player.entity);
return hbox({
text(fmt::format("HP: {: >3} DMG: {: >3}",
player_combat.hp,
combat.damage)) | flex_grow
});
});
set_renderer(combat_rend);
}
FSM::FSM() :
$window(sf::VideoMode({SCREEN_WIDTH, SCREEN_HEIGHT}), "Zed's Raycaster Thing"),
$renderer($window),
$level($levels.current()),
$map_view($level),
$combat_view($level),
$status_view($level),
$font{FONT_FILE_NAME},
$text{$font},
$rayview($textures, RAY_VIEW_WIDTH, RAY_VIEW_HEIGHT)
@ -47,10 +103,14 @@ namespace gui {
$rayview.set_position(RAY_VIEW_X, RAY_VIEW_Y);
$rayview.position_camera($player.x + 0.5, $player.y + 0.5);
$status_view.create_render();
$combat_view.create_render();
$renderer.init_terminal();
$map_view.create_render();
$map_view.resize_canvas();
$renderer.resize_grid(MAX_FONT_SIZE, $map_view);
run_systems();
state(State::IDLE);
}
@ -87,7 +147,6 @@ namespace gui {
// just do 10 ticks
if($rotation_count % 10 == 0) {
run_systems();
$rayview.$anim.play(false);
$rotation = -10.0f;
state(State::IDLE);
}
@ -219,21 +278,7 @@ namespace gui {
$window.draw(*weapon);
}
void FSM::draw_gui() {
sf::RectangleShape rect({SCREEN_WIDTH - RAY_VIEW_WIDTH, SCREEN_HEIGHT});
rect.setPosition({0,0});
rect.setFillColor({30, 30, 30});
$window.draw(rect);
auto left_gui = $textures.sprite_textures.at("left_gui").sprite;
left_gui->setPosition({0,0});
$window.draw(*left_gui);
sf::RectangleShape lower({RAY_VIEW_WIDTH, SCREEN_HEIGHT - RAY_VIEW_HEIGHT});
lower.setPosition({RAY_VIEW_X,RAY_VIEW_HEIGHT});
lower.setFillColor({40, 40, 40});
$window.draw(lower);
void FSM::draw_stats() {
auto player = $level.world->get_the<Player>();
auto player_combat = $level.world->get<Combat>(player.entity);
@ -255,7 +300,29 @@ namespace gui {
FRAME_LIMIT, DEBUG_BUILD, $rayview.$dir_x,
$rayview.$dir_y, $rayview.$pos_x, $rayview.$pos_y));
// $window.draw($text);
$window.draw($text);
}
void FSM::draw_gui() {
sf::RectangleShape rect({SCREEN_WIDTH - RAY_VIEW_WIDTH, SCREEN_HEIGHT});
rect.setPosition({0,0});
rect.setFillColor({30, 30, 30});
$window.draw(rect);
auto left_gui = $textures.sprite_textures.at("left_gui").sprite;
left_gui->setPosition({0,0});
$window.draw(*left_gui);
sf::RectangleShape lower({RAY_VIEW_WIDTH, SCREEN_HEIGHT - RAY_VIEW_HEIGHT});
lower.setPosition({RAY_VIEW_X,RAY_VIEW_HEIGHT});
lower.setFillColor({30, 30, 30});
$window.draw(lower);
$status_view.render();
$renderer.draw($status_view);
$combat_view.render();
$renderer.draw($combat_view);
}
void FSM::render() {