More refactoring of the FSM to MainUI. Move the overlay out and some more.

master
Zed A. Shaw 2 weeks ago
parent a7a60ad35c
commit 23ed1594f2
  1. 90
      gui_fsm.cpp
  2. 5
      gui_fsm.hpp
  3. 73
      main_ui.cpp
  4. 20
      main_ui.hpp

@ -12,13 +12,13 @@ namespace gui {
using namespace components; using namespace components;
FSM::FSM() : FSM::FSM() :
$main_ui($levels.current()), $window(sf::VideoMode({SCREEN_WIDTH, SCREEN_HEIGHT}), "Zed's Raycaster Thing"),
$renderer($main_ui.$window), $main_ui($window, $levels.current(), $textures),
$renderer($window),
$level($levels.current()), $level($levels.current()),
$map_ui($level), $map_ui($level),
$combat_ui($level), $combat_ui($level),
$status_ui($level), $status_ui($level),
$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)
{ {
@ -47,8 +47,8 @@ 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);
$main_ui.render();
$combat_ui.render($textures); $combat_ui.render($textures);
$overlay_ui.render();
$status_ui.render($textures); $status_ui.render($textures);
$status_ui.log("Welcome to the game!"); $status_ui.log("Welcome to the game!");
@ -123,7 +123,7 @@ namespace gui {
switch(ev) { switch(ev) {
case QUIT: case QUIT:
$main_ui.$window.close(); $window.close();
state(State::END); state(State::END);
return; // done return; // done
case MOVE_FORWARD: case MOVE_FORWARD:
@ -155,7 +155,7 @@ namespace gui {
state(State::ATTACKING); state(State::ATTACKING);
break; break;
case START_COMBAT: case START_COMBAT:
$overlay_ui.show_sprite("top_right", "cinqueda"); $main_ui.$overlay_ui.show_sprite("top_right", "cinqueda");
state(State::IN_COMBAT); state(State::IN_COMBAT);
break; break;
case CLOSE: case CLOSE:
@ -187,11 +187,11 @@ namespace gui {
state(State::COMBAT_ROTATE); state(State::COMBAT_ROTATE);
break; break;
case STOP_COMBAT: case STOP_COMBAT:
$overlay_ui.close_sprite("top_right"); $main_ui.$overlay_ui.close_sprite("top_right");
state(State::IDLE); state(State::IDLE);
break; break;
case QUIT: case QUIT:
$main_ui.$window.close(); $window.close();
state(State::END); state(State::END);
return; return;
default: default:
@ -217,7 +217,7 @@ namespace gui {
} }
void FSM::keyboard() { void FSM::keyboard() {
while(const auto keyev = $main_ui.$window.pollEvent()) { while(const auto keyev = $window.pollEvent()) {
if(keyev->is<sf::Event::Closed>()) { if(keyev->is<sf::Event::Closed>()) {
event(Event::QUIT); event(Event::QUIT);
} }
@ -244,7 +244,7 @@ namespace gui {
event(Event::MOVE_LEFT); event(Event::MOVE_LEFT);
break; break;
case KEY::R: case KEY::R:
$stats.reset(); $main_ui.$stats.reset();
break; break;
case KEY::M: case KEY::M:
event(Event::MAP_OPEN); event(Event::MAP_OPEN);
@ -253,7 +253,7 @@ namespace gui {
event(Event::CLOSE); event(Event::CLOSE);
break; break;
case KEY::P: case KEY::P:
debug(); $main_ui.debug();
break; break;
default: default:
break; // ignored break; // ignored
@ -262,85 +262,35 @@ namespace gui {
} }
} }
void FSM::debug() {
auto& dbg = $level.world->get_the<Debug>();
dbg.FPS = !dbg.FPS;
dbg.PATHS = !dbg.PATHS;
if(dbg.FPS) {
// it's on now, enable things
auto player = $level.world->get_the<Player>();
auto& player_combat = $level.world->get<Combat>(player.entity);
player_combat.hp = player_combat.max_hp;
$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_ui.close_text("top_left");
}
}
void FSM::draw_stats() {
auto player = $level.world->get_the<Player>();
auto player_combat = $level.world->get<Combat>(player.entity);
std::string stats = fmt::format("STATS\n"
"HP: {}\n"
"mean:{:>8.5}\n"
"sdev: {:>8.5}\n"
"min: {:>8.5}\n"
"max: {:>8.5}\n"
"count:{:<10}\n\n"
"VSync? {}\n"
"FR Limit: {}\n"
"Debug? {}\n\n",
player_combat.hp, $stats.mean(), $stats.stddev(), $stats.min,
$stats.max, $stats.n, VSYNC,
FRAME_LIMIT, DEBUG_BUILD);
$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_ui.show_sprite("middle", "blood_splatter");
} else {
$overlay_ui.close_sprite("middle");
}
}
void FSM::draw_gui() { void FSM::draw_gui() {
$status_ui.draw($main_ui.$window); $status_ui.draw($window);
$combat_ui.draw($main_ui.$window); $combat_ui.draw($window);
$overlay_ui.draw($main_ui.$window); $main_ui.draw();
auto debug = $level.world->get_the<Debug>();
if(debug.FPS) draw_stats();
} }
void FSM::render() { void FSM::render() {
if(in_state(State::MAPPING)) { if(in_state(State::MAPPING)) {
$main_ui.$window.clear(); $window.clear();
$map_ui.render(); $map_ui.render();
$renderer.draw($map_ui); $renderer.draw($map_ui);
} else { } else {
auto start = std::chrono::high_resolution_clock::now(); auto start = std::chrono::high_resolution_clock::now();
$rayview.draw($main_ui.$window); $rayview.draw($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()); $main_ui.$stats.sample(1/elapsed.count());
draw_gui(); draw_gui();
draw_blood(); $main_ui.draw_blood();
} }
$main_ui.$window.display(); $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 = $main_ui.$window.mapPixelToCoords(sf::Mouse::getPosition($main_ui.$window)); sf::Vector2f pos = $window.mapPixelToCoords(sf::Mouse::getPosition($window));
$combat_ui.$gui.mouse(pos.x, pos.y); $combat_ui.$gui.mouse(pos.x, pos.y);
$status_ui.$gui.mouse(pos.x, pos.y); $status_ui.$gui.mouse(pos.x, pos.y);
} }

@ -44,6 +44,7 @@ namespace gui {
class FSM : public DeadSimpleFSM<State, Event> { class FSM : public DeadSimpleFSM<State, Event> {
public: public:
sf::RenderWindow $window;
bool $draw_stats = false; bool $draw_stats = false;
Point $player{0,0}; Point $player{0,0};
LevelManager $levels; LevelManager $levels;
@ -53,10 +54,8 @@ namespace gui {
MapViewUI $map_ui; MapViewUI $map_ui;
CombatUI $combat_ui; CombatUI $combat_ui;
StatusUI $status_ui; StatusUI $status_ui;
OverlayUI $overlay_ui;
CameraLOL $camera; CameraLOL $camera;
sf::Font $font; sf::Font $font;
Stats $stats;
TexturePack $textures; TexturePack $textures;
Raycaster $rayview; Raycaster $rayview;
@ -76,10 +75,8 @@ namespace gui {
void try_move(int dir, bool strafe); void try_move(int dir, bool strafe);
void keyboard(); void keyboard();
void draw_stats();
void draw_gui(); void draw_gui();
void draw_blood(); void draw_blood();
void debug();
void render(); void render();
void mouse(); void mouse();
void generate_map(); void generate_map();

@ -1 +1,74 @@
#include "main_ui.hpp" #include "main_ui.hpp"
#include "components.hpp"
namespace gui {
using namespace components;
MainUI::MainUI(sf::RenderWindow& window, GameLevel level, TexturePack& textures) :
$window(window),
$level(level),
$textures(textures),
$overlay_ui($level, $textures)
{
$window.setVerticalSyncEnabled(VSYNC);
$window.setFramerateLimit(FRAME_LIMIT);
}
void MainUI::debug() {
auto& dbg = $level.world->get_the<Debug>();
dbg.FPS = !dbg.FPS;
dbg.PATHS = !dbg.PATHS;
if(dbg.FPS) {
// it's on now, enable things
auto player = $level.world->get_the<Player>();
auto& player_combat = $level.world->get<Combat>(player.entity);
player_combat.hp = player_combat.max_hp;
$overlay_ui.show_text("top_left", "STATS");
} else {
// it's off now, close it
$overlay_ui.close_text("top_left");
}
}
void MainUI::draw_stats() {
auto player = $level.world->get_the<Player>();
auto player_combat = $level.world->get<Combat>(player.entity);
std::string stats = fmt::format("STATS\n"
"HP: {}\n"
"mean:{:>8.5}\n"
"sdev: {:>8.5}\n"
"min: {:>8.5}\n"
"max: {:>8.5}\n"
"count:{:<10}\n\n"
"VSync? {}\n"
"FR Limit: {}\n"
"Debug? {}\n\n",
player_combat.hp, $stats.mean(), $stats.stddev(), $stats.min,
$stats.max, $stats.n, VSYNC,
FRAME_LIMIT, DEBUG_BUILD);
$overlay_ui.update_text("top_left", stats);
}
void MainUI::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_ui.show_sprite("middle", "blood_splatter");
} else {
$overlay_ui.close_sprite("middle");
}
}
void MainUI::render() {
$overlay_ui.render();
}
void MainUI::draw() {
$overlay_ui.draw($window);
auto debug = $level.world->get_the<Debug>();
if(debug.FPS) draw_stats();
}
}

@ -1,20 +1,24 @@
#pragma once #pragma once
#include "levelmanager.hpp" #include "levelmanager.hpp"
#include <SFML/Graphics/RenderWindow.hpp> #include <SFML/Graphics/RenderWindow.hpp>
#include "stats.hpp"
#include "overlay_ui.hpp"
namespace gui { namespace gui {
class MainUI { class MainUI {
public: public:
Stats $stats;
sf::RenderWindow& $window;
GameLevel $level; GameLevel $level;
sf::RenderWindow $window; TexturePack& $textures;
OverlayUI $overlay_ui;
MainUI(GameLevel level) : MainUI(sf::RenderWindow& window, GameLevel level, TexturePack &textures);
$level(level), void debug();
$window(sf::VideoMode({SCREEN_WIDTH, SCREEN_HEIGHT}), "Zed's Raycaster Thing") void draw_stats();
{ void draw_blood();
$window.setVerticalSyncEnabled(VSYNC); void render();
$window.setFramerateLimit(FRAME_LIMIT); void draw();
}
}; };
} }

Loading…
Cancel
Save