Refactoring the GUECS UI::render and the components so that it's just calling a .render on each one. This will then let me allow registering any components people want.

This commit is contained in:
Zed A. Shaw 2025-05-12 00:09:21 -04:00
parent a9e219ea96
commit 4d71f552aa
7 changed files with 108 additions and 69 deletions

View file

@ -150,7 +150,7 @@ struct CalculatorUI {
}
void init() {
$gui.set<guecs::Background>($gui.MAIN, {});
$gui.set<guecs::Background>($gui.MAIN, {$gui.$parser});
for(auto& [name, cell] : $gui.cells()) {
auto id = $gui.entity(name);

View file

@ -55,7 +55,7 @@ struct Shake {
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)};
std::lerp(initial_scale.y, initial_scale.y + scale_factor, tick)};
sprite.sprite->setScale(scale);
} else {
@ -83,34 +83,35 @@ struct ClickerUI {
void init() {
$gui.set<guecs::Background>($gui.MAIN, {$gui.$parser, {0, 0, 0, 255}});
for(auto& [name, cell] : $gui.cells()) {
auto id = $gui.entity(name);
if(name != "clicker") {
$gui.set<guecs::Rectangle>(id, {});
$gui.set<guecs::Effect>(id, {});
$gui.set<guecs::Sprite>(id, { "clicker_treat_bone" });
fmt::println("button dim: {},{}", cell.w, cell.h);
$gui.set<guecs::Clickable>(id, {
[&](auto, auto) { handle_button(Event::A_BUTTON); }
});
}
}
for(auto& [name, cell] : $gui.cells()) {
auto id = $gui.entity(name);
if(name != "clicker") {
$gui.set<guecs::Rectangle>(id, {});
$gui.set<guecs::Effect>(id, {});
$gui.set<guecs::Sprite>(id, { "clicker_treat_bone" });
fmt::println("button dim: {},{}", cell.w, cell.h);
$gui.set<guecs::Clickable>(id, {
[&](auto, auto) { handle_button(Event::A_BUTTON); }
});
}
}
$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); }
});
$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, {});
// 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);
@ -130,17 +131,17 @@ struct ClickerUI {
using enum Event;
switch(ev) {
case CLICKER: {
auto& shaker = $gui.get<Shake>($clicker);
auto& sprite = $gui.get<guecs::Sprite>($clicker);
shaker.play(sprite);
fmt::println("CLICKER LOVES YOU!");
} break;
auto& shaker = $gui.get<Shake>($clicker);
auto& sprite = $gui.get<guecs::Sprite>($clicker);
shaker.play(sprite);
fmt::println("CLICKER LOVES YOU!");
} break;
case A_BUTTON:
fmt::println("a button clicked");
break;
fmt::println("a button clicked");
break;
default:
assert(false && "invalid event");
assert(false && "invalid event");
}
}
};
@ -149,7 +150,7 @@ int main() {
sfml::Backend backend;
guecs::init(&backend);
sf::RenderWindow window(sf::VideoMode({WINDOW_WIDTH, WINDOW_HEIGHT}), "LEL-GUECS Calculator");
sf::RenderWindow window(sf::VideoMode({WINDOW_WIDTH, WINDOW_HEIGHT}), "Clicker the Dog");
window.setFramerateLimit(FRAME_LIMIT);
window.setVerticalSyncEnabled(VSYNC);