Initial idea for the boss fight UI but it's just a temporary holder for now.

master
Zed A. Shaw 1 week ago
parent a72d2879fd
commit 64807174c0
  1. 3
      assets/config.json
  2. BIN
      assets/rat-king-boss-fight-test-small.jpg
  3. 9
      assets/tiles.json
  4. 82
      boss_fight_ui.cpp
  5. 34
      boss_fight_ui.hpp
  6. 6
      combat_ui.cpp
  7. 4
      combat_ui.hpp
  8. 34
      gui_fsm.cpp
  9. 2
      gui_fsm.hpp
  10. 6
      main_ui.cpp
  11. 2
      main_ui.hpp
  12. 1
      meson.build
  13. 4
      overlay_ui.cpp
  14. 4
      overlay_ui.hpp
  15. 6
      status_ui.cpp
  16. 4
      status_ui.hpp

@ -32,7 +32,8 @@
"trash_button": "assets/trash_button.png", "trash_button": "assets/trash_button.png",
"axe_ranger": "assets/axe_ranger-256.png", "axe_ranger": "assets/axe_ranger-256.png",
"hairy_spider": "assets/hairy_spider-256.png", "hairy_spider": "assets/hairy_spider-256.png",
"down_the_well": "assets/down_the_well.jpg" "down_the_well": "assets/down_the_well.jpg",
"boss_fight": "assets/rat-king-boss-fight-test-small.jpg"
}, },
"enemy": { "enemy": {
"HEARING_DISTANCE": 5 "HEARING_DISTANCE": 5

Binary file not shown.

After

Width:  |  Height:  |  Size: 211 KiB

@ -7,7 +7,7 @@
"display":"\u289e" "display":"\u289e"
}, },
"WALL_PLAIN": { "WALL_PLAIN": {
"texture": "assets/wall_simple-256.png", "texture": "assets/wall_texture_test-256.png",
"foreground": [230, 20, 30], "foreground": [230, 20, 30],
"background": [230, 20, 120], "background": [230, 20, 120],
"collision": true, "collision": true,
@ -19,12 +19,5 @@
"background": [230, 20, 120], "background": [230, 20, 120],
"collision": false, "collision": false,
"display":"\u0799" "display":"\u0799"
},
"WALL_PILLAR": {
"texture": "assets/wall_with_pillars-256.png",
"foreground": [230, 20, 30],
"background": [230, 20, 120],
"collision": false,
"display":"\u2274"
} }
} }

@ -0,0 +1,82 @@
#include "boss_fight_ui.hpp"
#include "easings.hpp"
namespace gui {
BossFightUI::BossFightUI() {
$status.position(0, 0, 300, SCREEN_HEIGHT);
$status.layout(
"[(150)status_1|(150)status_2]"
"[(150)status_3|(150)status_4]"
"[(150)status_5|(150)status_6]"
"[(150)status_7|(150)status_8]"
);
$overlay.position(300, 0, SCREEN_WIDTH - 300, SCREEN_HEIGHT);
$overlay.layout("[overlay_1|overlay_2|overlay_3|overlay_4]"
"[overlay_5|overlay_6|overlay_7|overlay_8]"
"[overlay_9|overlay_10|overlay_11|overlay_12]"
"[overlay_13|overlay_14|overlay_15|overlay_16]");
$boss_image = textures::get("boss_fight");
auto bounds = $boss_image.sprite->getLocalBounds();
$boss_image.sprite->setPosition({300 + bounds.size.x / 2, bounds.size.y / 2});
$boss_image.sprite->setOrigin({bounds.size.x / 2, bounds.size.y / 2});
}
void BossFightUI::init() {
$status.world().set_the<Background>({$status.$parser});
for(auto& [name, cell] : $status.cells()) {
auto button = $status.entity(name);
$status.set<Rectangle>(button, {});
$status.set<Clickable>(button, {
[this, name](auto, auto){ fmt::println("STATUS: {}", name); }
});
$status.set<Label>(button, {name});
}
$status.init();
for(auto& [name, cell] : $overlay.cells()) {
auto region = $overlay.entity(name);
$overlay.set<Clickable>(region, {
[this, name](auto, auto){ fmt::println("OVERLAY: {}", name); }
});
}
auto region = $overlay.entity("overlay_2");
$overlay.set<Label>(region, {"THE RAT KING!"});
$overlay.init();
}
void BossFightUI::bounce_boss(sf::RenderWindow& window) {
auto time = $clock.getElapsedTime();
float tick = ease::in_out_back(ease::sine(time.asSeconds()));
float scale = std::lerp(1.1, 1.3, tick);
$boss_image.sprite->setScale({scale, scale});
window.draw(*$boss_image.sprite);
}
void BossFightUI::render(sf::RenderWindow& window) {
if($boss_hit) {
bounce_boss(window);
} else {
window.draw(*$boss_image.sprite);
}
$status.render(window);
$overlay.render(window);
}
bool BossFightUI::mouse(float x, float y) {
if($status.mouse(x, y)) {
fmt::println("STATUS");
}
if($overlay.mouse(x, y)) {
fmt::println("OVERLAY");
$boss_hit = !$boss_hit;
}
return false;
}
}

@ -0,0 +1,34 @@
#pragma once
#include "levelmanager.hpp"
#include <SFML/Graphics/RenderWindow.hpp>
#include <SFML/Graphics/Font.hpp>
#include "guecs.hpp"
#include "textures.hpp"
#include <SFML/System/Clock.hpp>
// aspect ratio of art is 3/2 so 1.5
// possible sizes: 900/600; 1620/1080; 1800/1200
// To calculate it do short side * 1.5 so 1080 * 1.5 == 1620
//
// Side panel = 300/1080
namespace gui {
using namespace guecs;
using std::string;
class BossFightUI {
public:
sf::Clock $clock;
bool $boss_hit = false;
guecs::UI $status;
guecs::UI $overlay;
textures::SpriteTexture $boss_image;
BossFightUI();
void init();
void render(sf::RenderWindow& window);
bool mouse(float x, float y);
void bounce_boss(sf::RenderWindow& window);
};
}

@ -15,7 +15,7 @@ namespace gui {
"[ >.%(100,50)label_hp | *%.(198,50)bar_hp | _ ]"); "[ >.%(100,50)label_hp | *%.(198,50)bar_hp | _ ]");
} }
void CombatUI::render() { void CombatUI::init() {
auto& world = $gui.world(); auto& world = $gui.world();
world.set_the<Background>({$gui.$parser}); world.set_the<Background>({$gui.$parser});
@ -40,7 +40,7 @@ namespace gui {
$gui.init(); $gui.init();
} }
void CombatUI::draw(sf::RenderWindow& window) { void CombatUI::render(sf::RenderWindow& window) {
auto& player_combat = $level.world->get<components::Combat>($level.player); auto& player_combat = $level.world->get<components::Combat>($level.player);
set_damage(float(player_combat.hp) / float(player_combat.max_hp)); set_damage(float(player_combat.hp) / float(player_combat.max_hp));
$gui.render(window); $gui.render(window);
@ -53,6 +53,6 @@ namespace gui {
void CombatUI::update_level(GameLevel &level) { void CombatUI::update_level(GameLevel &level) {
$level = level; $level = level;
render(); init();
} }
} }

@ -13,8 +13,8 @@ namespace gui {
CombatUI(GameLevel level); CombatUI(GameLevel level);
void render(); void init();
void draw(sf::RenderWindow& window); void render(sf::RenderWindow& window);
void update_level(GameLevel &level); void update_level(GameLevel &level);
void set_damage(float percent); void set_damage(float percent);
}; };

@ -45,10 +45,11 @@ namespace gui {
$main_ui.init(); $main_ui.init();
$combat_ui.render(); $combat_ui.init();
$status_ui.render(); $status_ui.init();
$status_ui.log("Welcome to the game!"); $status_ui.log("Welcome to the game!");
$status_ui.update(); $status_ui.update();
$boss_fight_ui.init();
$renderer.init_terminal(); $renderer.init_terminal();
$map_ui.create_render(); $map_ui.create_render();
@ -162,7 +163,7 @@ namespace gui {
dbc::log("Nothing to close."); dbc::log("Nothing to close.");
break; break;
case STAIRS_DOWN: case STAIRS_DOWN:
$main_ui.show_level(); // $main_ui.show_level();
state(State::NEXT_LEVEL); state(State::NEXT_LEVEL);
break; break;
case STOP_COMBAT: case STOP_COMBAT:
@ -243,9 +244,13 @@ namespace gui {
if(const auto* mouse = ev->getIf<sf::Event::MouseButtonPressed>()) { if(const auto* mouse = ev->getIf<sf::Event::MouseButtonPressed>()) {
if(mouse->button == sf::Mouse::Button::Left) { if(mouse->button == sf::Mouse::Button::Left) {
sf::Vector2f pos = $window.mapPixelToCoords(mouse->position); sf::Vector2f pos = $window.mapPixelToCoords(mouse->position);
$combat_ui.$gui.mouse(pos.x, pos.y); if(in_state(State::NEXT_LEVEL)) {
$status_ui.$gui.mouse(pos.x, pos.y); $boss_fight_ui.mouse(pos.x, pos.y);
$main_ui.mouse(pos.x, pos.y); } else {
$combat_ui.$gui.mouse(pos.x, pos.y);
$status_ui.$gui.mouse(pos.x, pos.y);
$main_ui.mouse(pos.x, pos.y);
}
} }
} }
@ -290,6 +295,9 @@ namespace gui {
case KEY::O: case KEY::O:
autowalking = true; autowalking = true;
break; break;
case KEY::L:
event(Event::STAIRS_DOWN);
break;
default: default:
break; // ignored break; // ignored
} }
@ -298,9 +306,13 @@ namespace gui {
} }
void FSM::draw_gui() { void FSM::draw_gui() {
$main_ui.draw(); if(in_state(State::NEXT_LEVEL)) {
$status_ui.draw($window); $boss_fight_ui.render($window);
$combat_ui.draw($window); } else {
$main_ui.render();
$status_ui.render($window);
$combat_ui.render($window);
}
} }
void FSM::render() { void FSM::render() {
@ -308,6 +320,10 @@ namespace gui {
$window.clear(); $window.clear();
$map_ui.render(); $map_ui.render();
$renderer.draw($map_ui); $renderer.draw($map_ui);
} else if(in_state(State::NEXT_LEVEL)) {
$window.clear();
$boss_fight_ui.init();
$boss_fight_ui.render($window);
} else { } else {
draw_gui(); draw_gui();
} }

@ -9,6 +9,7 @@
#include "combat_ui.hpp" #include "combat_ui.hpp"
#include "status_ui.hpp" #include "status_ui.hpp"
#include "overlay_ui.hpp" #include "overlay_ui.hpp"
#include "boss_fight_ui.hpp"
namespace gui { namespace gui {
enum class State { enum class State {
@ -54,6 +55,7 @@ namespace gui {
MapViewUI $map_ui; MapViewUI $map_ui;
CombatUI $combat_ui; CombatUI $combat_ui;
StatusUI $status_ui; StatusUI $status_ui;
BossFightUI $boss_fight_ui;
sf::Font $font; sf::Font $font;
FSM(); FSM();

@ -84,14 +84,14 @@ namespace gui {
RAY_VIEW_Y + bounds.size.y / 2}); RAY_VIEW_Y + bounds.size.y / 2});
st.sprite->setOrigin({bounds.size.x / 2, bounds.size.y / 2}); st.sprite->setOrigin({bounds.size.x / 2, bounds.size.y / 2});
$overlay_ui.render(); $overlay_ui.init();
} }
void MainUI::show_level() { void MainUI::show_level() {
$show_level = true; $show_level = true;
} }
void MainUI::draw() { void MainUI::render() {
auto start = $stats.time_start(); auto start = $stats.time_start();
if($show_level) { if($show_level) {
@ -110,7 +110,7 @@ namespace gui {
$stats.sample_time(start); $stats.sample_time(start);
$overlay_ui.draw($window); $overlay_ui.render($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();

@ -41,7 +41,7 @@ namespace gui {
void update_level(GameLevel level); void update_level(GameLevel level);
void init(); void init();
void draw(); void render();
void dirty(); void dirty();
void show_level(); void show_level();

@ -54,6 +54,7 @@ endif
sources = [ sources = [
'ansi_parser.cpp', 'ansi_parser.cpp',
'autowalker.cpp', 'autowalker.cpp',
'boss_fight_ui.cpp',
'camera.cpp', 'camera.cpp',
'combat.cpp', 'combat.cpp',
'combat_ui.cpp', 'combat_ui.cpp',

@ -19,11 +19,11 @@ namespace gui {
); );
} }
void OverlayUI::render() { void OverlayUI::init() {
$gui.init(); $gui.init();
} }
void OverlayUI::draw(sf::RenderWindow& window) { void OverlayUI::render(sf::RenderWindow& window) {
$gui.render(window); $gui.render(window);
} }

@ -11,8 +11,8 @@ namespace gui {
OverlayUI(); OverlayUI();
void render(); void init();
void draw(sf::RenderWindow& window); void render(sf::RenderWindow& window);
void click(int x, int y); void click(int x, int y);
void show_sprite(string region, string sprite_name); void show_sprite(string region, string sprite_name);
void close_sprite(string region); void close_sprite(string region);

@ -29,7 +29,7 @@ namespace gui {
} }
} }
void StatusUI::render() { void StatusUI::init() {
$gui.world().set_the<Background>({$gui.$parser}); $gui.world().set_the<Background>({$gui.$parser});
for(auto& [name, cell] : $gui.cells()) { for(auto& [name, cell] : $gui.cells()) {
@ -112,7 +112,7 @@ namespace gui {
} }
} }
void StatusUI::draw(sf::RenderWindow &window) { void StatusUI::render(sf::RenderWindow &window) {
$gui.render(window); $gui.render(window);
} }
@ -125,6 +125,6 @@ namespace gui {
void StatusUI::update_level(GameLevel &level) { void StatusUI::update_level(GameLevel &level) {
$level = level; $level = level;
render(); init();
} }
} }

@ -18,8 +18,8 @@ namespace gui {
void select_slot(DinkyECS::Entity ent, std::any data); void select_slot(DinkyECS::Entity ent, std::any data);
void update_level(GameLevel &level); void update_level(GameLevel &level);
void log(std::string msg); void log(std::string msg);
void render(); void init();
void draw(sf::RenderWindow &window); void render(sf::RenderWindow &window);
void update(); void update();
}; };
} }

Loading…
Cancel
Save