parent
a72d2879fd
commit
64807174c0
After Width: | Height: | Size: 211 KiB |
@ -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); |
||||
}; |
||||
} |
Loading…
Reference in new issue