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

@ -1,4 +1,4 @@
#include "gui.hpp" #include "gui_fsm.hpp"
int main() { int main() {
gui::FSM 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', 'dbc.cpp',
'devices.cpp', 'devices.cpp',
'guecs.cpp', 'guecs.cpp',
'gui.cpp', 'gui_fsm.cpp',
'inventory.cpp', 'inventory.cpp',
'lel.cpp', 'lel.cpp',
'levelmanager.cpp', 'levelmanager.cpp',
'lights.cpp', 'lights.cpp',
'main_ui.cpp',
'map.cpp', 'map.cpp',
'map_view.cpp', 'map_view.cpp',
'matrix.cpp', 'matrix.cpp',