diff --git a/gui_fsm.cpp b/gui_fsm.cpp index 439d98c..c3bcdbf 100644 --- a/gui_fsm.cpp +++ b/gui_fsm.cpp @@ -12,13 +12,13 @@ namespace gui { using namespace components; FSM::FSM() : - $main_ui($levels.current()), - $renderer($main_ui.$window), + $window(sf::VideoMode({SCREEN_WIDTH, SCREEN_HEIGHT}), "Zed's Raycaster Thing"), + $main_ui($window, $levels.current(), $textures), + $renderer($window), $level($levels.current()), $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) { @@ -47,8 +47,8 @@ namespace gui { $rayview.set_position(RAY_VIEW_X, RAY_VIEW_Y); $rayview.position_camera($player.x + 0.5, $player.y + 0.5); + $main_ui.render(); $combat_ui.render($textures); - $overlay_ui.render(); $status_ui.render($textures); $status_ui.log("Welcome to the game!"); @@ -123,7 +123,7 @@ namespace gui { switch(ev) { case QUIT: - $main_ui.$window.close(); + $window.close(); state(State::END); return; // done case MOVE_FORWARD: @@ -155,7 +155,7 @@ namespace gui { state(State::ATTACKING); break; case START_COMBAT: - $overlay_ui.show_sprite("top_right", "cinqueda"); + $main_ui.$overlay_ui.show_sprite("top_right", "cinqueda"); state(State::IN_COMBAT); break; case CLOSE: @@ -187,11 +187,11 @@ namespace gui { state(State::COMBAT_ROTATE); break; case STOP_COMBAT: - $overlay_ui.close_sprite("top_right"); + $main_ui.$overlay_ui.close_sprite("top_right"); state(State::IDLE); break; case QUIT: - $main_ui.$window.close(); + $window.close(); state(State::END); return; default: @@ -217,7 +217,7 @@ namespace gui { } void FSM::keyboard() { - while(const auto keyev = $main_ui.$window.pollEvent()) { + while(const auto keyev = $window.pollEvent()) { if(keyev->is()) { event(Event::QUIT); } @@ -244,7 +244,7 @@ namespace gui { event(Event::MOVE_LEFT); break; case KEY::R: - $stats.reset(); + $main_ui.$stats.reset(); break; case KEY::M: event(Event::MAP_OPEN); @@ -253,7 +253,7 @@ namespace gui { event(Event::CLOSE); break; case KEY::P: - debug(); + $main_ui.debug(); break; default: break; // ignored @@ -262,85 +262,35 @@ namespace gui { } } - void FSM::debug() { - auto& dbg = $level.world->get_the(); - dbg.FPS = !dbg.FPS; - dbg.PATHS = !dbg.PATHS; - - if(dbg.FPS) { - // it's on now, enable things - auto player = $level.world->get_the(); - auto& player_combat = $level.world->get(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(); - auto player_combat = $level.world->get(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(); - auto player_combat = $level.world->get(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() { - $status_ui.draw($main_ui.$window); - $combat_ui.draw($main_ui.$window); - $overlay_ui.draw($main_ui.$window); - - auto debug = $level.world->get_the(); - if(debug.FPS) draw_stats(); + $status_ui.draw($window); + $combat_ui.draw($window); + $main_ui.draw(); } void FSM::render() { if(in_state(State::MAPPING)) { - $main_ui.$window.clear(); + $window.clear(); $map_ui.render(); $renderer.draw($map_ui); } else { 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 elapsed = std::chrono::duration(end - start); - $stats.sample(1/elapsed.count()); + $main_ui.$stats.sample(1/elapsed.count()); draw_gui(); - draw_blood(); + $main_ui.draw_blood(); } - $main_ui.$window.display(); + $window.display(); } void FSM::mouse() { 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); $status_ui.$gui.mouse(pos.x, pos.y); } diff --git a/gui_fsm.hpp b/gui_fsm.hpp index 011d6f1..2f92394 100644 --- a/gui_fsm.hpp +++ b/gui_fsm.hpp @@ -44,6 +44,7 @@ namespace gui { class FSM : public DeadSimpleFSM { public: + sf::RenderWindow $window; bool $draw_stats = false; Point $player{0,0}; LevelManager $levels; @@ -53,10 +54,8 @@ namespace gui { MapViewUI $map_ui; CombatUI $combat_ui; StatusUI $status_ui; - OverlayUI $overlay_ui; CameraLOL $camera; sf::Font $font; - Stats $stats; TexturePack $textures; Raycaster $rayview; @@ -76,10 +75,8 @@ namespace gui { void try_move(int dir, bool strafe); void keyboard(); - void draw_stats(); void draw_gui(); void draw_blood(); - void debug(); void render(); void mouse(); void generate_map(); diff --git a/main_ui.cpp b/main_ui.cpp index b42b273..5a8ceef 100644 --- a/main_ui.cpp +++ b/main_ui.cpp @@ -1 +1,74 @@ #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(); + dbg.FPS = !dbg.FPS; + dbg.PATHS = !dbg.PATHS; + + if(dbg.FPS) { + // it's on now, enable things + auto player = $level.world->get_the(); + auto& player_combat = $level.world->get(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(); + auto player_combat = $level.world->get(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(); + auto player_combat = $level.world->get(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(); + if(debug.FPS) draw_stats(); + } +} diff --git a/main_ui.hpp b/main_ui.hpp index 92adaf0..970973d 100644 --- a/main_ui.hpp +++ b/main_ui.hpp @@ -1,20 +1,24 @@ #pragma once #include "levelmanager.hpp" #include +#include "stats.hpp" +#include "overlay_ui.hpp" namespace gui { class MainUI { public: + Stats $stats; + sf::RenderWindow& $window; GameLevel $level; - sf::RenderWindow $window; + TexturePack& $textures; + OverlayUI $overlay_ui; - MainUI(GameLevel level) : - $level(level), - $window(sf::VideoMode({SCREEN_WIDTH, SCREEN_HEIGHT}), "Zed's Raycaster Thing") - { - $window.setVerticalSyncEnabled(VSYNC); - $window.setFramerateLimit(FRAME_LIMIT); - } + MainUI(sf::RenderWindow& window, GameLevel level, TexturePack &textures); + void debug(); + void draw_stats(); + void draw_blood(); + void render(); + void draw(); }; }