Basic Ritual crafting UI is prototyped, so next step is to create some items and refine the UI with a possible FSM to keep it organized.

master
Zed A. Shaw 2 weeks ago
parent 1aa6674e42
commit 8b3573b01d
  1. 12
      animation.cpp
  2. 3
      animation.hpp
  3. 59
      ritual_ui.cpp
  4. 4
      ritual_ui.hpp

@ -84,6 +84,17 @@ namespace animation {
return anim.playing; return anim.playing;
} }
void rotate(sf::Sprite& target, float degrees) {
target.rotate(sf::degrees(degrees));
}
void center(sf::Sprite& target, sf::Vector2f pos) {
auto bounds = target.getLocalBounds();
target.setPosition({pos.x + bounds.size.x / 2,
pos.y + bounds.size.y / 2});
target.setOrigin({bounds.size.x / 2, bounds.size.y / 2});
}
void init() { void init() {
if(!initialized) { if(!initialized) {
Config config("assets/animations.json"); Config config("assets/animations.json");
@ -98,6 +109,7 @@ namespace animation {
} }
Animation load(std::string name) { Animation load(std::string name) {
dbc::check(initialized, "You forgot to initialize animation.");
return MGR.animations.at(name); return MGR.animations.at(name);
} }
} }

@ -9,6 +9,9 @@ namespace animation {
}; };
bool apply(components::Animation& anim, textures::SpriteTexture& target); bool apply(components::Animation& anim, textures::SpriteTexture& target);
void rotate(sf::Sprite& target, float degrees);
void center(sf::Sprite& target, sf::Vector2f pos);
void init(); void init();
components::Animation load(std::string name); components::Animation load(std::string name);
} }

@ -3,6 +3,7 @@
#include "guecs.hpp" #include "guecs.hpp"
#include "rand.hpp" #include "rand.hpp"
#include "animation.hpp" #include "animation.hpp"
#include "rand.hpp"
namespace gui { namespace gui {
using namespace guecs; using namespace guecs;
@ -32,20 +33,26 @@ namespace gui {
auto button = $gui.entity(name); auto button = $gui.entity(name);
if(name == "circle_area") { if(name == "circle_area") {
// $gui.set<Rectangle>(button, {});
$gui.set<Sprite>(button, {"the_ritual_circle"}); $gui.set<Sprite>(button, {"the_ritual_circle"});
$gui.set<Clickable>(button, { $gui.set<Clickable>(button, {
[this](auto, auto){ dbc::log("circle clicked"); } [&](auto ent, auto){ ritual_circle_clicked(ent); }
}); });
} else if(name.starts_with("inv_slot")) { } else if(name.starts_with("inv_slot")) {
$gui.set<Sprite>(button, {"the_ritual_circle"});
// $gui.set<Rectangle>(button, {}); if(button % 5 == 0) {
$gui.set<Sprite>(button, {"cinqueda"});
} else if(button % 9 == 0) {
$gui.set<Sprite>(button, {"healing_potion_small"});
} else if(button % 3 == 0) {
$gui.set<Sprite>(button, {"torch_horizontal_floor"});
}
$gui.set<Clickable>(button, { $gui.set<Clickable>(button, {
[this, name](auto, auto){ dbc::log(fmt::format("inv_slot {}", name)); } [&](auto ent, auto){ inv_slot_clicked(ent); }
}); });
} else if(name == "ritual_ui") { } else if(name == "ritual_ui") {
$gui.set<Clickable>(button, { $gui.set<Clickable>(button, {
[this](auto, auto){ toggle(); } [&](auto, auto){ toggle(); }
}); });
} }
} }
@ -57,12 +64,51 @@ namespace gui {
$ritual_anim = animation::load("ritual_blanket"); $ritual_anim = animation::load("ritual_blanket");
$gui.init(); $gui.init();
} }
bool RitualUI::is_open() { bool RitualUI::is_open() {
return $ritual_state != RitualUIState::CLOSED; return $ritual_state != RitualUIState::CLOSED;
} }
void RitualUI::inv_slot_clicked(DinkyECS::Entity ent) {
if($gui.has<Sprite>(ent)) {
auto& bs = $gui.get<Sprite>(ent);
auto ritual_circle = $gui.entity("circle_area");
auto& ritual_cell = $gui.cell_for(ritual_circle);
dbc::log(fmt::format("inv_slot clicked {}", bs.name));
int inner_x = ritual_cell.x + ritual_cell.x / 2;
int inner_y = ritual_cell.y + ritual_cell.y / 2;
float x = Random::uniform(inner_x, inner_x + ritual_cell.w / 2);
float y = Random::uniform(inner_y, inner_y + ritual_cell.h / 2);
bs.sprite->setPosition({float(x), float(y)});
}
}
void RitualUI::reset_inv_positions() {
auto ritual_circle = $gui.entity("circle_area");
$gui.world().query<lel::Cell, Sprite>(
[&](const auto ent, auto &cell, auto &bs) {
if(ent == ritual_circle) {
bs.sprite->setColor({255,255,255,255});
bs.sprite->setRotation(sf::degrees(0.0));
} else {
bs.sprite->setPosition({(float)cell.x, (float)cell.y});
}
});
}
void RitualUI::ritual_circle_clicked(DinkyECS::Entity ent) {
auto cell = $gui.cell_for(ent);
auto& bs = $gui.get<Sprite>(ent);
bs.sprite->setColor({200, 0, 0});
animation::center(*bs.sprite, {(float)cell.x, (float)cell.y});
animation::rotate(*bs.sprite, 20.0);
}
bool RitualUI::mouse(float x, float y) { bool RitualUI::mouse(float x, float y) {
return $gui.mouse(x, y); return $gui.mouse(x, y);
} }
@ -91,6 +137,7 @@ namespace gui {
$ritual_state = OPEN; $ritual_state = OPEN;
} }
} else if($ritual_state == CLOSING) { } else if($ritual_state == CLOSING) {
reset_inv_positions();
$ritual_ui.sprite->setTextureRect($ritual_closed_rect); $ritual_ui.sprite->setTextureRect($ritual_closed_rect);
$ritual_state = CLOSED; $ritual_state = CLOSED;
} }

@ -30,5 +30,9 @@ namespace gui {
void init(); void init();
void render(sf::RenderWindow &window); void render(sf::RenderWindow &window);
void update(); void update();
void ritual_circle_clicked(DinkyECS::Entity ent);
void inv_slot_clicked(DinkyECS::Entity ent);
void reset_inv_positions();
}; };
} }

Loading…
Cancel
Save