|
|
|
@ -3,6 +3,7 @@ |
|
|
|
|
#include "guecs/ui.hpp" |
|
|
|
|
#include <fmt/xchar.h> |
|
|
|
|
#include <deque> |
|
|
|
|
#include <iostream> |
|
|
|
|
|
|
|
|
|
constexpr const int WINDOW_WIDTH=1280; |
|
|
|
|
constexpr const int WINDOW_HEIGHT=720; |
|
|
|
@ -15,9 +16,59 @@ enum class Event { |
|
|
|
|
CLICKER, A_BUTTON |
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
struct Shake { |
|
|
|
|
float scale_factor = 0.05f; |
|
|
|
|
int frames = 10; |
|
|
|
|
float ease_rate = 0.1f; |
|
|
|
|
bool playing = false; |
|
|
|
|
int current = 0; |
|
|
|
|
float x=0.0; |
|
|
|
|
float y=0.0; |
|
|
|
|
float w=0.0; |
|
|
|
|
float h=0.0; |
|
|
|
|
sf::Vector2f initial_scale; |
|
|
|
|
|
|
|
|
|
float ease() { |
|
|
|
|
float tick = float(frames) / float(current) * ease_rate; |
|
|
|
|
return (std::sin(tick) + 1.0) / 2.0; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void init(lel::Cell& cell) { |
|
|
|
|
x = cell.x; |
|
|
|
|
y = cell.y; |
|
|
|
|
w = cell.w; |
|
|
|
|
h = cell.h; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void play(guecs::Sprite& sprite) { |
|
|
|
|
if(!playing) { |
|
|
|
|
playing = true; |
|
|
|
|
current = 0; |
|
|
|
|
initial_scale = sprite.sprite->getScale(); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void render(guecs::Sprite& sprite) { |
|
|
|
|
current++; |
|
|
|
|
|
|
|
|
|
if(playing && current < frames) { |
|
|
|
|
float tick = ease(); |
|
|
|
|
sf::Vector2f scale{ |
|
|
|
|
std::lerp(initial_scale.x, initial_scale.x + scale_factor, tick), |
|
|
|
|
std::lerp(initial_scale.y, initial_scale.y + scale_factor, tick)}; |
|
|
|
|
|
|
|
|
|
sprite.sprite->setScale(scale); |
|
|
|
|
} else { |
|
|
|
|
playing = false; |
|
|
|
|
current = 0; |
|
|
|
|
sprite.sprite->setScale(initial_scale); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
struct ClickerUI { |
|
|
|
|
guecs::UI $gui; |
|
|
|
|
guecs::Entity $clicker; |
|
|
|
|
|
|
|
|
|
ClickerUI() { |
|
|
|
|
$gui.position(0, 0, WINDOW_WIDTH, WINDOW_HEIGHT); |
|
|
|
@ -30,7 +81,7 @@ struct ClickerUI { |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void init() { |
|
|
|
|
$gui.set<guecs::Background>($gui.MAIN, {}); |
|
|
|
|
$gui.set<guecs::Background>($gui.MAIN, {$gui.$parser, {0, 0, 0, 255}}); |
|
|
|
|
|
|
|
|
|
for(auto& [name, cell] : $gui.cells()) { |
|
|
|
|
auto id = $gui.entity(name); |
|
|
|
@ -42,21 +93,32 @@ struct ClickerUI { |
|
|
|
|
$gui.set<guecs::Clickable>(id, { |
|
|
|
|
[&](auto, auto) { handle_button(Event::A_BUTTON); } |
|
|
|
|
}); |
|
|
|
|
} else { |
|
|
|
|
$gui.set<guecs::Sprite>(id, {"clicker_the_dog"}); |
|
|
|
|
$gui.set<guecs::Sound>(id, {"clicker_bark"}); |
|
|
|
|
$gui.set<guecs::Effect>(id, {0.1f, "ui_shader"}); |
|
|
|
|
$gui.set<guecs::Clickable>(id, { |
|
|
|
|
[&](auto, auto) { handle_button(Event::CLICKER); } |
|
|
|
|
}); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
$clicker = $gui.entity("clicker"); |
|
|
|
|
$gui.set<guecs::Sprite>($clicker, {"clicker_the_dog"}); |
|
|
|
|
$gui.set<guecs::Sound>($clicker, {"clicker_bark"}); |
|
|
|
|
$gui.set<guecs::Clickable>($clicker, { |
|
|
|
|
[&](auto, auto) { handle_button(Event::CLICKER); } |
|
|
|
|
}); |
|
|
|
|
|
|
|
|
|
// custom components need to be initialized manually
|
|
|
|
|
$gui.set_init<Shake>($clicker, {}); |
|
|
|
|
|
|
|
|
|
$gui.init(); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void render(sf::RenderWindow& window) { |
|
|
|
|
auto& shaker = $gui.get<Shake>($clicker); |
|
|
|
|
if(shaker.playing) { |
|
|
|
|
auto& sprite = $gui.get<guecs::Sprite>($clicker); |
|
|
|
|
shaker.render(sprite); |
|
|
|
|
window.clear(); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
$gui.render(window); |
|
|
|
|
|
|
|
|
|
// $gui.debug_layout(window);
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
@ -67,10 +129,12 @@ struct ClickerUI { |
|
|
|
|
void handle_button(Event ev) { |
|
|
|
|
using enum Event; |
|
|
|
|
switch(ev) { |
|
|
|
|
case CLICKER: |
|
|
|
|
case CLICKER: { |
|
|
|
|
auto& shaker = $gui.get<Shake>($clicker); |
|
|
|
|
auto& sprite = $gui.get<guecs::Sprite>($clicker); |
|
|
|
|
shaker.play(sprite); |
|
|
|
|
fmt::println("CLICKER LOVES YOU!"); |
|
|
|
|
break; |
|
|
|
|
|
|
|
|
|
} break; |
|
|
|
|
case A_BUTTON: |
|
|
|
|
fmt::println("a button clicked"); |
|
|
|
|
break; |
|
|
|
|