Separate out the major UIs to get ready for their development, and enable debug button.

master
Zed A. Shaw 10 months ago
parent 7eec67ffc8
commit 9b3b81683a
  1. 16
      color.hpp
  2. 35
      combat_ui.cpp
  3. 18
      combat_ui.hpp
  4. 1
      components.hpp
  5. 10
      constants.hpp
  6. 71
      gui.cpp
  7. 36
      gui.hpp
  8. 2
      meson.build
  9. 19
      raycaster.cpp
  10. 48
      status_ui.cpp
  11. 14
      status_ui.hpp

@ -1,14 +1,14 @@
#pragma once #pragma once
namespace ColorValue { namespace ColorValue {
const sf::Color BLACK{1, 4, 2}; const sf::Color BLACK{0, 0, 0};
const sf::Color DARK_DARK{9, 29, 16}; const sf::Color DARK_DARK{10, 10, 10};
const sf::Color DARK_MID{14, 50, 26}; const sf::Color DARK_MID{30, 30, 30};
const sf::Color DARK_LIGHT{0, 109, 44}; const sf::Color DARK_LIGHT{60, 60, 60};
const sf::Color MID{63, 171, 92}; const sf::Color MID{100, 100, 100};
const sf::Color LIGHT_DARK{161, 217, 155}; const sf::Color LIGHT_DARK{150, 150, 150};
const sf::Color LIGHT_MID{199, 233, 192}; const sf::Color LIGHT_MID{200, 200, 200};
const sf::Color LIGHT_LIGHT{229, 245, 224}; const sf::Color LIGHT_LIGHT{230, 230, 230};
const sf::Color WHITE{255, 255, 255}; const sf::Color WHITE{255, 255, 255};
const sf::Color TRANSPARENT = sf::Color::Transparent; const sf::Color TRANSPARENT = sf::Color::Transparent;
} }

@ -0,0 +1,35 @@
#include "combat_ui.hpp"
#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>
#include "constants.hpp"
#include "color.hpp"
namespace gui {
using namespace ftxui;
CombatUI::CombatUI(GameLevel level) :
Panel(COMBAT_UI_X, COMBAT_UI_Y, COMBAT_UI_WIDTH, COMBAT_UI_HEIGHT, false),
$level(level)
{
default_bg = {0,0,0};
}
void CombatUI::create_render() {
$attack1_button = Button("ATTACK1", []{ fmt::println("ATTACK1 clicked"); });
$attack2_button = Button("ATTACK2", []{ fmt::println("ATTACK2 clicked"); });
auto combat_rend = Renderer([&]{
return hbox({
$attack1_button->Render(),
$attack2_button->Render()
});
});
set_renderer(combat_rend);
add($attack1_button);
add($attack2_button);
}
}

@ -0,0 +1,18 @@
#pragma once
#include "panel.hpp"
#include "levelmanager.hpp"
#include <ftxui/component/component.hpp>
namespace gui {
class CombatUI : public Panel {
public:
GameLevel $level;
Component $attack1_button;
Component $attack2_button;
CombatUI(GameLevel level);
void create_render();
void update_level(GameLevel &level) { $level = level; }
};
}

@ -45,6 +45,7 @@ namespace components {
struct Debug { struct Debug {
bool PATHS=false; bool PATHS=false;
bool LIGHT=false; bool LIGHT=false;
bool FPS=false;
}; };
struct Weapon { struct Weapon {

@ -37,9 +37,15 @@ constexpr int BASE_MAP_FONT_SIZE=90;
constexpr int GAME_MAP_PIXEL_POS = 600; constexpr int GAME_MAP_PIXEL_POS = 600;
constexpr int MAX_FONT_SIZE = 140; constexpr int MAX_FONT_SIZE = 140;
constexpr int MIN_FONT_SIZE = 20; constexpr int MIN_FONT_SIZE = 20;
constexpr int STATUS_UI_WIDTH = 40; constexpr int STATUS_UI_WIDTH = 29;
constexpr int STATUS_UI_HEIGHT = 30; constexpr int STATUS_UI_HEIGHT = 25;
constexpr int STATUS_UI_X = 43;
constexpr int STATUS_UI_Y = 200;
constexpr float PERCENT = 0.01f; constexpr float PERCENT = 0.01f;
constexpr int COMBAT_UI_WIDTH = 89;
constexpr int COMBAT_UI_HEIGHT = 6;
constexpr int COMBAT_UI_X = RAY_VIEW_X;
constexpr int COMBAT_UI_Y = RAY_VIEW_HEIGHT;
// for the panels/renderer // for the panels/renderer

@ -6,62 +6,10 @@
#include "components.hpp" #include "components.hpp"
#include <numbers> #include <numbers>
#include "systems.hpp" #include "systems.hpp"
#include "map_view.hpp"
#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 { namespace gui {
using namespace components;
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() {
$attack1_button = Button("ATTACK1", []{ fmt::println("ATTACK1 clicked"); });
$attack2_button = Button("ATTACK2", []{ fmt::println("ATTACK2 clicked"); });
auto combat_rend = Renderer([&]{
return hbox({
$attack1_button->Render(),
$attack2_button->Render()
});
});
set_renderer(combat_rend);
add($attack1_button);
add($attack2_button);
}
FSM::FSM() : FSM::FSM() :
$window(sf::VideoMode({SCREEN_WIDTH, SCREEN_HEIGHT}), "Zed's Raycaster Thing"), $window(sf::VideoMode({SCREEN_WIDTH, SCREEN_HEIGHT}), "Zed's Raycaster Thing"),
@ -76,7 +24,7 @@ namespace gui {
{ {
$window.setVerticalSyncEnabled(VSYNC); $window.setVerticalSyncEnabled(VSYNC);
$window.setFramerateLimit(FRAME_LIMIT); $window.setFramerateLimit(FRAME_LIMIT);
$text.setPosition({10,10}); $text.setPosition({43,300});
$text.setFillColor({255,255,255}); $text.setFillColor({255,255,255});
$textures.load_tiles(); $textures.load_tiles();
$textures.load_sprites(); $textures.load_sprites();
@ -261,6 +209,11 @@ namespace gui {
case KEY::Escape: case KEY::Escape:
event(Event::CLOSE); event(Event::CLOSE);
break; break;
case KEY::P: {
auto& debug = $level.world->get_the<Debug>();
debug.FPS = !debug.FPS;
debug.PATHS = !debug.PATHS;
} break;
default: default:
break; // ignored break; // ignored
} }
@ -290,13 +243,10 @@ namespace gui {
"count:{:<10}\n\n" "count:{:<10}\n\n"
"VSync? {}\n" "VSync? {}\n"
"FR Limit: {}\n" "FR Limit: {}\n"
"Debug? {}\n\n" "Debug? {}\n\n",
"dir: {:>2.02},{:>2.02}\n"
"pos: {:>2.02},{:>2.02}\n\n",
player_combat.hp, $stats.mean(), $stats.stddev(), $stats.min, player_combat.hp, $stats.mean(), $stats.stddev(), $stats.min,
$stats.max, $stats.n, VSYNC, $stats.max, $stats.n, VSYNC,
FRAME_LIMIT, DEBUG_BUILD, $rayview.$dir_x, FRAME_LIMIT, DEBUG_BUILD));
$rayview.$dir_y, $rayview.$pos_x, $rayview.$pos_y));
$window.draw($text); $window.draw($text);
} }
@ -321,6 +271,9 @@ namespace gui {
$combat_view.render(); $combat_view.render();
$renderer.draw($combat_view); $renderer.draw($combat_view);
auto debug = $level.world->get_the<Debug>();
if(debug.FPS) draw_stats();
} }
void FSM::render() { void FSM::render() {

@ -7,41 +7,10 @@
#include "fsm.hpp" #include "fsm.hpp"
#include "render.hpp" #include "render.hpp"
#include "map_view.hpp" #include "map_view.hpp"
#include <ftxui/dom/elements.hpp> // for hflow, paragraph, separator, hbox, vbox, filler, operator|, border, Element #include "combat_ui.hpp"
#include "status_ui.hpp"
namespace gui { namespace gui {
class StatusUI : public Panel {
public:
GameLevel $level;
StatusUI(GameLevel level) :
Panel(43, 200, 29, 25, false),
$level(level)
{
default_bg = sf::Color{30,30,30};
}
void create_render();
void update_level(GameLevel &level) { $level = level; }
};
class CombatUI : public Panel {
public:
GameLevel $level;
Component $attack1_button;
Component $attack2_button;
CombatUI(GameLevel level) :
Panel(RAY_VIEW_X, RAY_VIEW_HEIGHT, 89, 6, false),
$level(level)
{
default_bg = sf::Color{30,30,30};
}
void create_render();
void update_level(GameLevel &level) { $level = level; }
};
enum class State { enum class State {
START, START,
MOVING, MOVING,
@ -72,6 +41,7 @@ namespace gui {
// ZED: these two will go away soon // ZED: these two will go away soon
int $rotation_count = 0; int $rotation_count = 0;
float $rotation = -10.0f; float $rotation = -10.0f;
bool $draw_stats = false;
Point $player{0,0}; Point $player{0,0};
LevelManager $levels; LevelManager $levels;
sf::RenderWindow $window; sf::RenderWindow $window;

@ -47,6 +47,7 @@ sources = [
'ansi_parser.cpp', 'ansi_parser.cpp',
'camera.cpp', 'camera.cpp',
'combat.cpp', 'combat.cpp',
'combat_ui.cpp',
'components.cpp', 'components.cpp',
'config.cpp', 'config.cpp',
'dbc.cpp', 'dbc.cpp',
@ -68,6 +69,7 @@ sources = [
'shiterator.hpp', 'shiterator.hpp',
'spatialmap.cpp', 'spatialmap.cpp',
'stats.cpp', 'stats.cpp',
'status_ui.cpp',
'systems.cpp', 'systems.cpp',
'texture.cpp', 'texture.cpp',
'tilemap.cpp', 'tilemap.cpp',

@ -22,22 +22,13 @@ union ColorConv {
uint32_t as_int; uint32_t as_int;
}; };
inline uint32_t dumb_lighting(uint32_t pixel, double distance) {
if(distance < 1.0) return pixel;
ColorConv conv{.as_int=pixel};
conv.as_color.r /= distance;
conv.as_color.g /= distance;
conv.as_color.b /= distance;
return conv.as_int;
}
inline uint32_t new_lighting(uint32_t pixel, int level) { inline uint32_t new_lighting(uint32_t pixel, int level) {
float factor = level * PERCENT;
ColorConv conv{.as_int=pixel}; ColorConv conv{.as_int=pixel};
conv.as_color.r *= level * PERCENT; conv.as_color.r *= factor;
conv.as_color.g *= level * PERCENT; conv.as_color.g *= factor;
conv.as_color.b *= level * PERCENT; conv.as_color.b *= factor;
return conv.as_int; return conv.as_int;
} }

@ -0,0 +1,48 @@
#include "status_ui.hpp"
#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>
#include "components.hpp"
#include "color.hpp"
namespace gui {
using namespace components;
using namespace ftxui;
StatusUI::StatusUI(GameLevel level) :
Panel(STATUS_UI_X, STATUS_UI_Y, STATUS_UI_WIDTH, STATUS_UI_HEIGHT, false),
$level(level)
{
default_bg = ColorValue::DARK_MID;
}
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);
}
}

@ -0,0 +1,14 @@
#pragma once
#include "panel.hpp"
#include "levelmanager.hpp"
#include "constants.hpp"
namespace gui {
class StatusUI : public Panel {
public:
GameLevel $level;
StatusUI(GameLevel level);
void create_render();
void update_level(GameLevel &level) { $level = level; }
};
}