Initial start of the refactoring of gui.cpp into two classes, the gui::FSM will be used to controll all of the other UIs in the game, and evetnually will be pretty dumb.

master
Zed A. Shaw 10 months ago
parent 4a1a8a7d65
commit a7a60ad35c
  1. 98
      gui_fsm.cpp
  2. 12
      gui_fsm.hpp
  3. 2
      main.cpp
  4. 1
      main_ui.cpp
  5. 20
      main_ui.hpp
  6. 3
      meson.build

@ -1,4 +1,4 @@
#include "gui.hpp"
#include "gui_fsm.hpp"
#include <iostream>
#include <chrono>
#include <numeric>
@ -12,18 +12,16 @@ namespace gui {
using namespace components;
FSM::FSM() :
$window(sf::VideoMode({SCREEN_WIDTH, SCREEN_HEIGHT}), "Zed's Raycaster Thing"),
$renderer($window),
$main_ui($levels.current()),
$renderer($main_ui.$window),
$level($levels.current()),
$map_view($level),
$combat_view($level),
$status_view($level),
$overlay_view($level, $textures),
$map_ui($level),
$combat_ui($level),
$status_ui($level),
$overlay_ui($level, $textures),
$font{FONT_FILE_NAME},
$rayview($textures, RAY_VIEW_WIDTH, RAY_VIEW_HEIGHT)
{
$window.setVerticalSyncEnabled(VSYNC);
$window.setFramerateLimit(FRAME_LIMIT);
$textures.load_tiles();
$textures.load_sprites();
}
@ -49,15 +47,15 @@ namespace gui {
$rayview.set_position(RAY_VIEW_X, RAY_VIEW_Y);
$rayview.position_camera($player.x + 0.5, $player.y + 0.5);
$combat_view.render($textures);
$overlay_view.render();
$status_view.render($textures);
$status_view.log("Welcome to the game!");
$combat_ui.render($textures);
$overlay_ui.render();
$status_ui.render($textures);
$status_ui.log("Welcome to the game!");
$renderer.init_terminal();
$map_view.create_render();
$map_view.resize_canvas();
$renderer.resize_grid(MAX_FONT_SIZE, $map_view);
$map_ui.create_render();
$map_ui.resize_canvas();
$renderer.resize_grid(MAX_FONT_SIZE, $map_ui);
run_systems();
state(State::IDLE);
@ -125,7 +123,7 @@ namespace gui {
switch(ev) {
case QUIT:
$window.close();
$main_ui.$window.close();
state(State::END);
return; // done
case MOVE_FORWARD:
@ -149,15 +147,15 @@ namespace gui {
state(State::ROTATING);
break;
case MAP_OPEN:
$renderer.resize_grid(MAX_FONT_SIZE, $map_view);
$map_view.resize_canvas();
$renderer.resize_grid(MAX_FONT_SIZE, $map_ui);
$map_ui.resize_canvas();
state(State::MAPPING);
break;
case ATTACK:
state(State::ATTACKING);
break;
case START_COMBAT:
$overlay_view.show_sprite("top_right", "cinqueda");
$overlay_ui.show_sprite("top_right", "cinqueda");
state(State::IN_COMBAT);
break;
case CLOSE:
@ -177,7 +175,7 @@ namespace gui {
switch(ev) {
case ATTACK:
$status_view.log("You attack!");
$status_ui.log("You attack!");
state(State::ATTACKING);
break;
case ROTATE_LEFT:
@ -189,11 +187,11 @@ namespace gui {
state(State::COMBAT_ROTATE);
break;
case STOP_COMBAT:
$overlay_view.close_sprite("top_right");
$overlay_ui.close_sprite("top_right");
state(State::IDLE);
break;
case QUIT:
$window.close();
$main_ui.$window.close();
state(State::END);
return;
default:
@ -219,7 +217,7 @@ namespace gui {
}
void FSM::keyboard() {
while(const auto keyev = $window.pollEvent()) {
while(const auto keyev = $main_ui.$window.pollEvent()) {
if(keyev->is<sf::Event::Closed>()) {
event(Event::QUIT);
}
@ -274,11 +272,11 @@ namespace gui {
auto player = $level.world->get_the<Player>();
auto& player_combat = $level.world->get<Combat>(player.entity);
player_combat.hp = player_combat.max_hp;
$combat_view.set_damage(float(player_combat.hp) / float(player_combat.max_hp));
$overlay_view.show_text("top_left", "STATS");
$combat_ui.set_damage(float(player_combat.hp) / float(player_combat.max_hp));
$overlay_ui.show_text("top_left", "STATS");
} else {
// it's off now, close it
$overlay_view.close_text("top_left");
$overlay_ui.close_text("top_left");
}
}
@ -299,23 +297,23 @@ namespace gui {
$stats.max, $stats.n, VSYNC,
FRAME_LIMIT, DEBUG_BUILD);
$overlay_view.update_text("top_left", stats);
$overlay_ui.update_text("top_left", stats);
}
void FSM::draw_blood() {
auto player = $level.world->get_the<Player>();
auto player_combat = $level.world->get<Combat>(player.entity);
if(float(player_combat.hp) / float(player_combat.max_hp) < 0.5) {
$overlay_view.show_sprite("middle", "blood_splatter");
$overlay_ui.show_sprite("middle", "blood_splatter");
} else {
$overlay_view.close_sprite("middle");
$overlay_ui.close_sprite("middle");
}
}
void FSM::draw_gui() {
$status_view.draw($window);
$combat_view.draw($window);
$overlay_view.draw($window);
$status_ui.draw($main_ui.$window);
$combat_ui.draw($main_ui.$window);
$overlay_ui.draw($main_ui.$window);
auto debug = $level.world->get_the<Debug>();
if(debug.FPS) draw_stats();
@ -323,12 +321,12 @@ namespace gui {
void FSM::render() {
if(in_state(State::MAPPING)) {
$window.clear();
$map_view.render();
$renderer.draw($map_view);
$main_ui.$window.clear();
$map_ui.render();
$renderer.draw($map_ui);
} else {
auto start = std::chrono::high_resolution_clock::now();
$rayview.draw($window);
$rayview.draw($main_ui.$window);
auto end = std::chrono::high_resolution_clock::now();
auto elapsed = std::chrono::duration<double>(end - start);
$stats.sample(1/elapsed.count());
@ -337,14 +335,14 @@ namespace gui {
draw_blood();
}
$window.display();
$main_ui.$window.display();
}
void FSM::mouse() {
if(sf::Mouse::isButtonPressed(sf::Mouse::Button::Left)) {
sf::Vector2f pos = $window.mapPixelToCoords(sf::Mouse::getPosition($window));
$combat_view.$gui.mouse(pos.x, pos.y);
$status_view.$gui.mouse(pos.x, pos.y);
sf::Vector2f pos = $main_ui.$window.mapPixelToCoords(sf::Mouse::getPosition($main_ui.$window));
$combat_ui.$gui.mouse(pos.x, pos.y);
$status_ui.$gui.mouse(pos.x, pos.y);
}
}
@ -381,17 +379,17 @@ namespace gui {
auto &damage = std::any_cast<Events::Combat&>(data);
if(damage.enemy_did > 0) {
$status_view.log(fmt::format("Enemy HIT YOU for {} damage!", damage.enemy_did));
$status_ui.log(fmt::format("Enemy HIT YOU for {} damage!", damage.enemy_did));
auto player_combat = world.get<Combat>(player.entity);
$combat_view.set_damage(float(player_combat.hp) / float(player_combat.max_hp));
$combat_ui.set_damage(float(player_combat.hp) / float(player_combat.max_hp));
} else {
$status_view.log("Enemy MISSED YOU.");
$status_ui.log("Enemy MISSED YOU.");
}
if(damage.player_did > 0) {
$status_view.log(fmt::format("You HIT enemy for {} damage!", damage.player_did));
$status_ui.log(fmt::format("You HIT enemy for {} damage!", damage.player_did));
} else {
$status_view.log("You MISSED the enemy.");
$status_ui.log("You MISSED the enemy.");
}
}
break;
@ -403,9 +401,9 @@ namespace gui {
break;
case eGUI::LOOT: {
// auto &item = std::any_cast<InventoryItem&>(data);
// $status_view.log(fmt::format("You picked up a {}.",
// $status_ui.log(fmt::format("You picked up a {}.",
// std::string(item.data["name"])));
$status_view.log("You picked up an item.");
$status_ui.log("You picked up an item.");
}
break;
case eGUI::ATTACK:
@ -418,10 +416,10 @@ namespace gui {
}
} break;
case eGUI::NOOP:
$status_view.log(fmt::format("NOOP EVENT! {},{}", evt, entity));
$status_ui.log(fmt::format("NOOP EVENT! {},{}", evt, entity));
break;
default:
$status_view.log(fmt::format("INVALID EVENT! {},{}", evt, entity));
$status_ui.log(fmt::format("INVALID EVENT! {},{}", evt, entity));
}
}
}

@ -7,6 +7,7 @@
#include "fsm.hpp"
#include "render.hpp"
#include "map_view.hpp"
#include "main_ui.hpp"
#include "combat_ui.hpp"
#include "status_ui.hpp"
#include "overlay_ui.hpp"
@ -43,17 +44,16 @@ namespace gui {
class FSM : public DeadSimpleFSM<State, Event> {
public:
// ZED: these two will go away soon
bool $draw_stats = false;
Point $player{0,0};
LevelManager $levels;
sf::RenderWindow $window;
MainUI $main_ui;
SFMLRender $renderer;
GameLevel $level;
MapViewUI $map_view;
CombatUI $combat_view;
StatusUI $status_view;
OverlayUI $overlay_view;
MapViewUI $map_ui;
CombatUI $combat_ui;
StatusUI $status_ui;
OverlayUI $overlay_ui;
CameraLOL $camera;
sf::Font $font;
Stats $stats;

@ -1,4 +1,4 @@
#include "gui.hpp"
#include "gui_fsm.hpp"
int main() {
gui::FSM main;

@ -0,0 +1 @@
#include "main_ui.hpp"

@ -0,0 +1,20 @@
#pragma once
#include "levelmanager.hpp"
#include <SFML/Graphics/RenderWindow.hpp>
namespace gui {
class MainUI {
public:
GameLevel $level;
sf::RenderWindow $window;
MainUI(GameLevel level) :
$level(level),
$window(sf::VideoMode({SCREEN_WIDTH, SCREEN_HEIGHT}), "Zed's Raycaster Thing")
{
$window.setVerticalSyncEnabled(VSYNC);
$window.setFramerateLimit(FRAME_LIMIT);
}
};
}

@ -62,11 +62,12 @@ sources = [
'dbc.cpp',
'devices.cpp',
'guecs.cpp',
'gui.cpp',
'gui_fsm.cpp',
'inventory.cpp',
'lel.cpp',
'levelmanager.cpp',
'lights.cpp',
'main_ui.cpp',
'map.cpp',
'map_view.cpp',
'matrix.cpp',