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.
This commit is contained in:
parent
4a1a8a7d65
commit
a7a60ad35c
6 changed files with 78 additions and 58 deletions
|
@ -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;
|
2
main.cpp
2
main.cpp
|
@ -1,4 +1,4 @@
|
|||
#include "gui.hpp"
|
||||
#include "gui_fsm.hpp"
|
||||
|
||||
int main() {
|
||||
gui::FSM main;
|
||||
|
|
1
main_ui.cpp
Normal file
1
main_ui.cpp
Normal file
|
@ -0,0 +1 @@
|
|||
#include "main_ui.hpp"
|
20
main_ui.hpp
Normal file
20
main_ui.hpp
Normal file
|
@ -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…
Add table
Add a link
Reference in a new issue