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

Loading…
Cancel
Save