Two main GUI elements are placed for the left side status and the bottom combat UIs.
This commit is contained in:
parent
1790eec697
commit
be4d0d51de
4 changed files with 123 additions and 27 deletions
|
@ -32,7 +32,7 @@ constexpr int WALL_LIGHT_LEVEL = 3;
|
||||||
constexpr int WORLDBUILD_DIVISION = 4;
|
constexpr int WORLDBUILD_DIVISION = 4;
|
||||||
constexpr int WORLDBUILD_SHRINK = 2;
|
constexpr int WORLDBUILD_SHRINK = 2;
|
||||||
constexpr int WORLDBUILD_MAX_PATH = 200;
|
constexpr int WORLDBUILD_MAX_PATH = 200;
|
||||||
constexpr int UI_FONT_SIZE=30;
|
constexpr int UI_FONT_SIZE=20;
|
||||||
constexpr int BASE_MAP_FONT_SIZE=90;
|
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;
|
||||||
|
|
101
gui.cpp
101
gui.cpp
|
@ -7,15 +7,71 @@
|
||||||
#include <numbers>
|
#include <numbers>
|
||||||
#include "systems.hpp"
|
#include "systems.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 <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 components;
|
||||||
|
using namespace ftxui;
|
||||||
|
|
||||||
namespace gui {
|
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() :
|
FSM::FSM() :
|
||||||
$window(sf::VideoMode({SCREEN_WIDTH, SCREEN_HEIGHT}), "Zed's Raycaster Thing"),
|
$window(sf::VideoMode({SCREEN_WIDTH, SCREEN_HEIGHT}), "Zed's Raycaster Thing"),
|
||||||
$renderer($window),
|
$renderer($window),
|
||||||
$level($levels.current()),
|
$level($levels.current()),
|
||||||
$map_view($level),
|
$map_view($level),
|
||||||
|
$combat_view($level),
|
||||||
|
$status_view($level),
|
||||||
$font{FONT_FILE_NAME},
|
$font{FONT_FILE_NAME},
|
||||||
$text{$font},
|
$text{$font},
|
||||||
$rayview($textures, RAY_VIEW_WIDTH, RAY_VIEW_HEIGHT)
|
$rayview($textures, RAY_VIEW_WIDTH, RAY_VIEW_HEIGHT)
|
||||||
|
@ -47,10 +103,14 @@ namespace gui {
|
||||||
$rayview.set_position(RAY_VIEW_X, RAY_VIEW_Y);
|
$rayview.set_position(RAY_VIEW_X, RAY_VIEW_Y);
|
||||||
$rayview.position_camera($player.x + 0.5, $player.y + 0.5);
|
$rayview.position_camera($player.x + 0.5, $player.y + 0.5);
|
||||||
|
|
||||||
|
$status_view.create_render();
|
||||||
|
$combat_view.create_render();
|
||||||
|
|
||||||
$renderer.init_terminal();
|
$renderer.init_terminal();
|
||||||
$map_view.create_render();
|
$map_view.create_render();
|
||||||
$map_view.resize_canvas();
|
$map_view.resize_canvas();
|
||||||
$renderer.resize_grid(MAX_FONT_SIZE, $map_view);
|
$renderer.resize_grid(MAX_FONT_SIZE, $map_view);
|
||||||
|
|
||||||
run_systems();
|
run_systems();
|
||||||
state(State::IDLE);
|
state(State::IDLE);
|
||||||
}
|
}
|
||||||
|
@ -87,7 +147,6 @@ namespace gui {
|
||||||
// just do 10 ticks
|
// just do 10 ticks
|
||||||
if($rotation_count % 10 == 0) {
|
if($rotation_count % 10 == 0) {
|
||||||
run_systems();
|
run_systems();
|
||||||
$rayview.$anim.play(false);
|
|
||||||
$rotation = -10.0f;
|
$rotation = -10.0f;
|
||||||
state(State::IDLE);
|
state(State::IDLE);
|
||||||
}
|
}
|
||||||
|
@ -219,21 +278,7 @@ namespace gui {
|
||||||
$window.draw(*weapon);
|
$window.draw(*weapon);
|
||||||
}
|
}
|
||||||
|
|
||||||
void FSM::draw_gui() {
|
void FSM::draw_stats() {
|
||||||
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);
|
|
||||||
|
|
||||||
auto player = $level.world->get_the<Player>();
|
auto player = $level.world->get_the<Player>();
|
||||||
auto player_combat = $level.world->get<Combat>(player.entity);
|
auto player_combat = $level.world->get<Combat>(player.entity);
|
||||||
|
|
||||||
|
@ -255,7 +300,29 @@ namespace gui {
|
||||||
FRAME_LIMIT, DEBUG_BUILD, $rayview.$dir_x,
|
FRAME_LIMIT, DEBUG_BUILD, $rayview.$dir_x,
|
||||||
$rayview.$dir_y, $rayview.$pos_x, $rayview.$pos_y));
|
$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() {
|
void FSM::render() {
|
||||||
|
|
33
gui.hpp
33
gui.hpp
|
@ -9,6 +9,36 @@
|
||||||
#include "map_view.hpp"
|
#include "map_view.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;
|
||||||
|
|
||||||
|
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,
|
||||||
|
@ -45,6 +75,8 @@ namespace gui {
|
||||||
SFMLRender $renderer;
|
SFMLRender $renderer;
|
||||||
GameLevel $level;
|
GameLevel $level;
|
||||||
MapViewUI $map_view;
|
MapViewUI $map_view;
|
||||||
|
CombatUI $combat_view;
|
||||||
|
StatusUI $status_view;
|
||||||
CameraLOL $camera;
|
CameraLOL $camera;
|
||||||
sf::Font $font;
|
sf::Font $font;
|
||||||
sf::Text $text;
|
sf::Text $text;
|
||||||
|
@ -67,6 +99,7 @@ namespace gui {
|
||||||
void try_move(int dir, bool strafe);
|
void try_move(int dir, bool strafe);
|
||||||
void keyboard();
|
void keyboard();
|
||||||
void draw_weapon();
|
void draw_weapon();
|
||||||
|
void draw_stats();
|
||||||
void draw_gui();
|
void draw_gui();
|
||||||
void render();
|
void render();
|
||||||
void mouse();
|
void mouse();
|
||||||
|
|
|
@ -336,21 +336,17 @@ inline void straight_path(Map &map, PointList &holes, Point src, Point target) {
|
||||||
}
|
}
|
||||||
|
|
||||||
void WorldBuilder::tunnel_doors(PointList &holes, Room &src, Room &target) {
|
void WorldBuilder::tunnel_doors(PointList &holes, Room &src, Room &target) {
|
||||||
int path_type = Random::uniform<int>(0, 3);
|
int path_type = Random::uniform<int>(0, 10);
|
||||||
|
|
||||||
switch(path_type) {
|
switch(path_type) {
|
||||||
case 0:
|
case 0:
|
||||||
// for now do 25% as simple straight paths
|
|
||||||
straight_path($map, holes, src.exit, target.entry);
|
|
||||||
break;
|
|
||||||
case 1:
|
|
||||||
// for now do 25% as simple straight paths
|
|
||||||
straight_path($map, holes, src.exit, target.entry);
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
// then do the rest as random with fallback
|
// then do the rest as random with fallback
|
||||||
if(!random_path($map, holes, src.exit, target.entry)) {
|
if(!random_path($map, holes, src.exit, target.entry)) {
|
||||||
straight_path($map, holes, src.exit, target.entry);
|
straight_path($map, holes, src.exit, target.entry);
|
||||||
}
|
}
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
// for now do 25% as simple straight paths
|
||||||
|
straight_path($map, holes, src.exit, target.entry);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue