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 2 weeks 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',

Loading…
Cancel
Save