More boss fight UI done and a bit of ambient sound working.

master
Zed A. Shaw 1 week ago
parent 64807174c0
commit a0c0308461
  1. BIN
      assets/ambient_1.ogg
  2. 3
      assets/config.json
  3. 42
      boss_fight_ui.cpp
  4. 6
      boss_fight_ui.hpp
  5. 40
      guecs.cpp
  6. 12
      guecs.hpp
  7. 6
      gui_fsm.cpp
  8. 4
      main.cpp
  9. 8
      main_ui.cpp
  10. 43
      overlay_ui.cpp
  11. 3
      sound.cpp
  12. 2
      sound.hpp

Binary file not shown.

@ -5,7 +5,8 @@
"monster_1": "assets/monster-1.ogg",
"walk": "assets/blank.ogg",
"blank": "assets/blank.ogg",
"pickup": "assets/pickup.ogg"
"pickup": "assets/pickup.ogg",
"ambient_1": "assets/ambient_1.ogg"
},
"sprites": {
"armored_knight": "assets/armored_knight_1-256.png",

@ -2,20 +2,22 @@
#include "easings.hpp"
namespace gui {
BossFightUI::BossFightUI() {
BossFightUI::BossFightUI(GameLevel level)
: $level(level)
{
$status.position(0, 0, 300, SCREEN_HEIGHT);
$status.layout(
"[(150)status_1|(150)status_2]"
"[main_status]"
"[(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]");
$overlay.layout("[overlay_1|overlay_2|overlay_4]"
"[overlay_5|overlay_6|overlay_8]"
"[overlay_9|overlay_10|overlay_12]"
"[overlay_13|overlay_14|overlay_16]");
$boss_image = textures::get("boss_fight");
auto bounds = $boss_image.sprite->getLocalBounds();
@ -32,7 +34,11 @@ namespace gui {
$status.set<Clickable>(button, {
[this, name](auto, auto){ fmt::println("STATUS: {}", name); }
});
$status.set<Label>(button, {name});
if(name == "main_status") {
$status.set<Textual>(button, {fmt::format("HP: {}", $boss_hp)});
} else {
$status.set<Label>(button, {"Attack"});
}
}
$status.init();
@ -43,15 +49,13 @@ namespace gui {
});
}
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);
float tick = ease::out_bounce(ease::sine(time.asSeconds()));
float scale = std::lerp(1.0, 1.15, tick);
$boss_image.sprite->setScale({scale, scale});
window.draw(*$boss_image.sprite);
}
@ -63,6 +67,11 @@ namespace gui {
window.draw(*$boss_image.sprite);
}
if($boss_hp == 0) {
$overlay.show_label("overlay_1", "YOU WON!");
$overlay.show_label("overlay_4", "CLICK TO CONTINUE...");
}
$status.render(window);
$overlay.render(window);
}
@ -73,10 +82,19 @@ namespace gui {
}
if($overlay.mouse(x, y)) {
fmt::println("OVERLAY");
$boss_hit = !$boss_hit;
$boss_hp--;
}
return false;
}
void BossFightUI::update_level(GameLevel &level) {
$level = level;
$boss_hp = 10 * $level.index + 1; // make him stronger
$boss_hit = false;
$overlay.close<Label>("overlay_1");
$overlay.close<Label>("overlay_4");
init();
}
}

@ -19,16 +19,20 @@ namespace gui {
class BossFightUI {
public:
sf::Clock $clock;
int $boss_hp = 10;
bool $boss_hit = false;
GameLevel $level;
guecs::UI $status;
guecs::UI $overlay;
textures::SpriteTexture $boss_image;
BossFightUI();
BossFightUI(GameLevel level);
void init();
void render(sf::RenderWindow& window);
bool mouse(float x, float y);
void bounce_boss(sf::RenderWindow& window);
bool boss_dead() { return $boss_hp < 0; }
void update_level(GameLevel& level);
};
}

@ -118,10 +118,50 @@ namespace guecs {
return action_count > 0;
}
void UI::show_sprite(string region, string sprite_name) {
auto ent = entity(region);
if(!has<Sprite>(ent)) {
Sprite to_show{sprite_name};
auto& cell = cell_for(ent);
to_show.init(cell);
set<guecs::Sprite>(ent, to_show);
}
}
void UI::show_text(string region, string content) {
auto ent = entity(region);
if(auto text = get_if<Textual>(ent)) {
text->text->setString(content);
} else {
auto &cell = cell_for(ent);
Textual to_set{content, 20};
to_set.init(cell, $font);
to_set.text->setFillColor(ColorValue::LIGHT_MID);
set<Textual>(ent, to_set);
}
}
void UI::show_label(string region, string content) {
auto ent = entity(region);
if(auto text = get_if<Label>(ent)) {
text->text->setString(content);
} else {
auto &cell = cell_for(ent);
Label to_set{content, 20};
to_set.init(cell, $font);
to_set.text->setFillColor(ColorValue::LIGHT_MID);
set<Label>(ent, to_set);
}
}
Clickable make_action(DinkyECS::World& target, Events::GUI event) {
return {[&, event](auto ent, auto data){
// remember that ent is passed in from the UI::mouse handler
target.send<Events::GUI>(event, ent, data);
}};
}
}

@ -194,6 +194,18 @@ namespace guecs {
void remove(DinkyECS::Entity ent) {
$world.remove<Comp>(ent);
}
template <typename Comp>
void close(string region) {
auto ent = entity(region);
remove<Comp>(ent);
}
void show_sprite(string region, string sprite_name);
void show_text(string region, string content);
void update_text(string region, string content);
void update_label(string region, string content);
void show_label(string region, string content);
};
Clickable make_action(DinkyECS::World& target, Events::GUI event);

@ -20,6 +20,7 @@ namespace gui {
$map_ui($level),
$combat_ui($level),
$status_ui($level),
$boss_fight_ui($level),
$font{FONT_FILE_NAME}
{
}
@ -246,6 +247,10 @@ namespace gui {
sf::Vector2f pos = $window.mapPixelToCoords(mouse->position);
if(in_state(State::NEXT_LEVEL)) {
$boss_fight_ui.mouse(pos.x, pos.y);
if($boss_fight_ui.boss_dead()) {
event(Event::STAIRS_DOWN);
}
} else {
$combat_ui.$gui.mouse(pos.x, pos.y);
$status_ui.$gui.mouse(pos.x, pos.y);
@ -415,6 +420,7 @@ namespace gui {
$combat_ui.update_level($level);
$map_ui.update_level($level);
$main_ui.update_level($level);
$boss_fight_ui.update_level($level);
run_systems();
}

@ -6,11 +6,13 @@
int main(int argc, char* argv[]) {
textures::init();
sound::init();
sound::mute(true);
sound::mute(false);
gui::FSM main;
main.event(gui::Event::STARTED);
Autowalker walker(main);
sound::play("ambient_1", true);
if(argc > 1 && argv[1][0] == 't') {
walker.start_autowalk();
}

@ -55,7 +55,7 @@ namespace gui {
$rayview.$dir_x, $rayview.$dir_y,
VSYNC, FRAME_LIMIT, DEBUG_BUILD);
$overlay_ui.update_text("top_left", stats);
$overlay_ui.show_text("top_left", stats);
}
void MainUI::draw_blood() {
@ -115,7 +115,7 @@ namespace gui {
auto debug = $level.world->get_the<Debug>();
if(debug.FPS) draw_stats();
draw_blood();
// draw_blood();
}
bool MainUI::play_rotate() {
@ -140,7 +140,7 @@ namespace gui {
void MainUI::plan_rotate(int dir) {
// -1 is left, 1 is right
$compass_dir = ($compass_dir + dir) % $compass.size();
$overlay_ui.update_label("top", $compass[$compass_dir]);
$overlay_ui.show_label("top", $compass[$compass_dir]);
$camera.plan_rotate($rayview, dir);
}
@ -166,7 +166,7 @@ namespace gui {
$rayview.position_camera(player.x + 0.5, player.y + 0.5);
$compass_dir = 0;
$overlay_ui.update_label("top", $compass[$compass_dir]);
$overlay_ui.show_label("top", $compass[$compass_dir]);
dirty();
}

@ -28,57 +28,26 @@ namespace gui {
}
void OverlayUI::show_sprite(string region, string sprite_name) {
auto ent = $gui.entity(region);
Sprite blood{sprite_name};
auto& cell = $gui.cell_for(ent);
blood.init(cell);
$gui.set<guecs::Sprite>(ent, blood);
$gui.show_sprite(region, sprite_name);
}
void OverlayUI::close_sprite(string region) {
auto ent = $gui.entity(region);
$gui.remove<guecs::Sprite>(ent);
$gui.close<Sprite>(region);
}
void OverlayUI::show_text(string region, string content) {
auto ent = $gui.entity(region);
auto &cell = $gui.cell_for(ent);
Textual text{content, 20};
text.init(cell, $gui.$font);
text.text->setFillColor(ColorValue::LIGHT_MID);
$gui.set<Textual>(ent, text);
}
void OverlayUI::update_text(string region, string content) {
auto ent = $gui.entity(region);
if(auto text = $gui.get_if<Textual>(ent)) {
text->text->setString(content);
}
}
void OverlayUI::update_label(string region, string content) {
auto ent = $gui.entity(region);
if(auto text = $gui.get_if<Label>(ent)) {
text->text->setString(content);
}
$gui.show_text(region, content);
}
void OverlayUI::close_text(string region) {
auto ent = $gui.entity(region);
$gui.remove<Textual>(ent);
$gui.close<Textual>(region);
}
void OverlayUI::show_label(string region, string content) {
auto ent = $gui.entity(region);
auto &cell = $gui.cell_for(ent);
Label text{content, 20};
text.init(cell, $gui.$font);
text.text->setFillColor(ColorValue::LIGHT_MID);
$gui.set<Label>(ent, text);
$gui.show_label(region, content);
}
void OverlayUI::close_label(string region) {
auto ent = $gui.entity(region);
$gui.remove<Label>(ent);
$gui.close<Label>(region);
}
}

@ -37,13 +37,14 @@ namespace sound {
SMGR.sounds.try_emplace(name, buffer, sound);
}
void play(const std::string name) {
void play(const std::string name, bool loop) {
dbc::check(initialized, "You need to call sound::init() first");
if(muted) return;
if(SMGR.sounds.contains(name)) {
// get the sound from the sound map
auto pair = SMGR.sounds.at(name);
pair.sound->setLooping(loop);
// play it
pair.sound->play();
} else {

@ -17,7 +17,7 @@ namespace sound {
void init();
void load(const std::string name, const std::string path);
void play(const std::string name);
void play(const std::string name, bool loop=false);
void play_at(const std::string name, float x, float y, float z);
void mute(bool setting);
}

Loading…
Cancel
Save