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

master
Zed A. Shaw 3 weeks 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
namespace ColorValue {
const sf::Color BLACK{1, 4, 2};
const sf::Color DARK_DARK{9, 29, 16};
const sf::Color DARK_MID{14, 50, 26};
const sf::Color DARK_LIGHT{0, 109, 44};
const sf::Color MID{63, 171, 92};
const sf::Color LIGHT_DARK{161, 217, 155};
const sf::Color LIGHT_MID{199, 233, 192};
const sf::Color LIGHT_LIGHT{229, 245, 224};
const sf::Color BLACK{0, 0, 0};
const sf::Color DARK_DARK{10, 10, 10};
const sf::Color DARK_MID{30, 30, 30};
const sf::Color DARK_LIGHT{60, 60, 60};
const sf::Color MID{100, 100, 100};
const sf::Color LIGHT_DARK{150, 150, 150};
const sf::Color LIGHT_MID{200, 200, 200};
const sf::Color LIGHT_LIGHT{230, 230, 230};
const sf::Color WHITE{255, 255, 255};
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 {
bool PATHS=false;
bool LIGHT=false;
bool FPS=false;
};
struct Weapon {

@ -37,9 +37,15 @@ constexpr int BASE_MAP_FONT_SIZE=90;
constexpr int GAME_MAP_PIXEL_POS = 600;
constexpr int MAX_FONT_SIZE = 140;
constexpr int MIN_FONT_SIZE = 20;
constexpr int STATUS_UI_WIDTH = 40;
constexpr int STATUS_UI_HEIGHT = 30;
constexpr int STATUS_UI_WIDTH = 29;
constexpr int STATUS_UI_HEIGHT = 25;
constexpr int STATUS_UI_X = 43;
constexpr int STATUS_UI_Y = 200;
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

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

@ -7,41 +7,10 @@
#include "fsm.hpp"
#include "render.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 {
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 {
START,
MOVING,
@ -72,6 +41,7 @@ namespace gui {
// 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;
sf::RenderWindow $window;

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

@ -22,22 +22,13 @@ union ColorConv {
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) {
float factor = level * PERCENT;
ColorConv conv{.as_int=pixel};
conv.as_color.r *= level * PERCENT;
conv.as_color.g *= level * PERCENT;
conv.as_color.b *= level * PERCENT;
conv.as_color.r *= factor;
conv.as_color.g *= factor;
conv.as_color.b *= factor;
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; }
};
}
Loading…
Cancel
Save