Fix up the backend so it has sane names like get_sprite and get_icon, then implemented a guecs::Icon for icons. Those don't scale and typically have other properties different from a Sprite.

main
Zed A. Shaw 1 week ago
parent 31a02505aa
commit 5a7c096b52
  1. 3
      demos/clicker_game.cpp
  2. 5
      include/guecs/sfml/backend.hpp
  3. 16
      include/guecs/sfml/components.hpp
  4. 1
      include/guecs/sfml/textures.hpp
  5. 7
      include/guecs/theme.hpp
  6. 10
      src/guecs/sfml/backend.cpp
  7. 49
      src/guecs/sfml/components.cpp
  8. 5
      src/guecs/sfml/textures.cpp
  9. 9
      src/guecs/ui.cpp

@ -93,8 +93,7 @@ struct ClickerUI {
if(name != "clicker") { if(name != "clicker") {
$gui.set<guecs::Rectangle>(id, {}); $gui.set<guecs::Rectangle>(id, {});
$gui.set<guecs::Effect>(id, {}); $gui.set<guecs::Effect>(id, {});
$gui.set<guecs::Sprite>(id, { "clicker_treat_bone" }); $gui.set<guecs::Icon>(id, { "clicker_treat_bone" });
fmt::println("button dim: {},{}", cell.w, cell.h);
$gui.set<guecs::Clickable>(id, { $gui.set<guecs::Clickable>(id, {
[&](auto, auto) { handle_button(Event::A_BUTTON); } [&](auto, auto) { handle_button(Event::A_BUTTON); }
}); });

@ -9,10 +9,11 @@ namespace sfml {
public: public:
Backend(); Backend();
guecs::SpriteTexture texture_get(const string& name); guecs::SpriteTexture get_sprite(const string& name);
guecs::SpriteTexture get_icon(const string& name);
void sound_play(const string& name); void sound_play(const string& name);
void sound_stop(const string& name); void sound_stop(const string& name);
std::shared_ptr<sf::Shader> shader_get(const std::string& name); std::shared_ptr<sf::Shader> get_shader(const std::string& name);
bool shader_updated(); bool shader_updated();
guecs::Theme theme(); guecs::Theme theme();
}; };

@ -38,12 +38,16 @@ namespace guecs {
}; };
struct Sprite { struct Sprite {
// either you set a filename here, string name;
// or some kind of config, int padding = THEME.PADDING;
// or a callback that does the loading, std::shared_ptr<sf::Sprite> sprite = nullptr;
// or a virtual function and you subclass
// or there's a static config function you call once, void init(lel::Cell &cell);
// that's passed an object with all the necessary gear void update(const string& new_name);
void render(sf::RenderWindow& window, sf::Shader *shader_ptr);
};
struct Icon {
string name; string name;
int padding = THEME.PADDING; int padding = THEME.PADDING;
std::shared_ptr<sf::Sprite> sprite = nullptr; std::shared_ptr<sf::Sprite> sprite = nullptr;

@ -11,6 +11,7 @@ namespace textures {
struct SpriteTexture { struct SpriteTexture {
std::shared_ptr<sf::Sprite> sprite = nullptr; std::shared_ptr<sf::Sprite> sprite = nullptr;
std::shared_ptr<sf::Texture> texture = nullptr; std::shared_ptr<sf::Texture> texture = nullptr;
sf::Vector2i frame_size;
}; };
struct TextureManager { struct TextureManager {

@ -35,17 +35,20 @@ namespace guecs {
struct SpriteTexture { struct SpriteTexture {
std::shared_ptr<sf::Sprite> sprite = nullptr; std::shared_ptr<sf::Sprite> sprite = nullptr;
std::shared_ptr<sf::Texture> texture = nullptr; std::shared_ptr<sf::Texture> texture = nullptr;
sf::Vector2i frame_size;
}; };
class Backend { class Backend {
public: public:
virtual SpriteTexture texture_get(const string& name) = 0; virtual SpriteTexture get_sprite(const string& name) = 0;
virtual SpriteTexture get_icon(const string& name) = 0;
virtual void sound_play(const string& name) = 0; virtual void sound_play(const string& name) = 0;
virtual void sound_stop(const string& name) = 0; virtual void sound_stop(const string& name) = 0;
virtual std::shared_ptr<sf::Shader> shader_get(const std::string& name) = 0; virtual std::shared_ptr<sf::Shader> get_shader(const std::string& name) = 0;
virtual bool shader_updated() = 0; virtual bool shader_updated() = 0;
virtual Theme theme() = 0; virtual Theme theme() = 0;

@ -4,9 +4,13 @@
#include "guecs/sfml/textures.hpp" #include "guecs/sfml/textures.hpp"
namespace sfml { namespace sfml {
guecs::SpriteTexture Backend::texture_get(const string& name) { guecs::SpriteTexture Backend::get_sprite(const string& name) {
auto sp = textures::get(name); auto sp = textures::get(name);
return {sp.sprite, sp.texture}; return {sp.sprite, sp.texture, sp.frame_size};
}
guecs::SpriteTexture Backend::get_icon(const string& name) {
return get_sprite(name);
} }
Backend::Backend() { Backend::Backend() {
@ -23,7 +27,7 @@ namespace sfml {
sound::stop(name); sound::stop(name);
} }
std::shared_ptr<sf::Shader> Backend::shader_get(const std::string& name) { std::shared_ptr<sf::Shader> Backend::get_shader(const std::string& name) {
return shaders::get(name); return shaders::get(name);
} }

@ -2,6 +2,7 @@
#include "guecs/sfml/backend.hpp" #include "guecs/sfml/backend.hpp"
#include <cassert> #include <cassert>
#include <iostream> #include <iostream>
#include <fmt/core.h>
namespace guecs { namespace guecs {
using std::make_shared; using std::make_shared;
@ -36,18 +37,17 @@ namespace guecs {
void Sprite::update(const string& new_name) { void Sprite::update(const string& new_name) {
if(new_name != name) { if(new_name != name) {
name = new_name; name = new_name;
auto sprite_texture = BACKEND->texture_get(name); auto sprite_texture = BACKEND->get_sprite(name);
sprite->setTexture(*sprite_texture.texture); sprite->setTexture(*sprite_texture.texture);
sprite->setTextureRect(sprite_texture.sprite->getTextureRect()); sprite->setTextureRect({{0,0},sprite_texture.frame_size});
} }
} }
void Sprite::init(lel::Cell &cell) { void Sprite::init(lel::Cell &cell) {
auto sprite_texture = BACKEND->texture_get(name); auto sprite_texture = BACKEND->get_sprite(name);
sprite = make_shared<sf::Sprite>( sf::IntRect rect{{0,0},sprite_texture.frame_size};
*sprite_texture.texture, sprite = make_shared<sf::Sprite>(*sprite_texture.texture, rect);
sprite_texture.sprite->getTextureRect());
sprite->setPosition({ sprite->setPosition({
float(cell.x + padding), float(cell.x + padding),
@ -64,6 +64,32 @@ namespace guecs {
window.draw(*sprite, shader_ptr); window.draw(*sprite, shader_ptr);
} }
void Icon::update(const string& new_name) {
if(new_name != name) {
name = new_name;
auto sprite_texture = BACKEND->get_icon(name);
sprite->setTexture(*sprite_texture.texture);
sprite->setTextureRect({{0,0},sprite_texture.frame_size});
}
}
void Icon::init(lel::Cell &cell) {
auto sprite_texture = BACKEND->get_icon(name);
sf::IntRect rect{{0,0},sprite_texture.frame_size};
fmt::println("ICON SIZE: {},{}; {},{}",
rect.position.x, rect.position.y,
rect.size.x, rect.size.y);
sprite = make_shared<sf::Sprite>(*sprite_texture.texture, rect);
sprite->setPosition({ float(cell.x + padding), float(cell.y + padding)});
}
void Icon::render(sf::RenderWindow& window, sf::Shader *shader_ptr) {
window.draw(*sprite, shader_ptr);
}
void Rectangle::init(lel::Cell& cell) { void Rectangle::init(lel::Cell& cell) {
sf::Vector2f size{float(cell.w) - padding * 2, float(cell.h) - padding * 2}; sf::Vector2f size{float(cell.w) - padding * 2, float(cell.h) - padding * 2};
if(shape == nullptr) shape = make_shared<sf::RectangleShape>(size); if(shape == nullptr) shape = make_shared<sf::RectangleShape>(size);
@ -126,11 +152,10 @@ namespace guecs {
} }
void Background::set_sprite(const std::string& name, bool stretch) { void Background::set_sprite(const std::string& name, bool stretch) {
auto sprite_texture = BACKEND->texture_get(name); auto sprite_texture = BACKEND->get_sprite(name);
sprite = make_shared<sf::Sprite>( sf::IntRect rect{{0,0},sprite_texture.frame_size};
*sprite_texture.texture, sprite = make_shared<sf::Sprite>(*sprite_texture.texture, rect);
sprite_texture.sprite->getTextureRect());
sprite->setPosition({float(x), float(y)}); sprite->setPosition({float(x), float(y)});
@ -154,7 +179,7 @@ namespace guecs {
} }
void Effect::init(lel::Cell &cell) { void Effect::init(lel::Cell &cell) {
$shader = BACKEND->shader_get(name); $shader = BACKEND->get_shader(name);
$shader->setUniform("u_resolution", sf::Vector2f({float(cell.w), float(cell.h)})); $shader->setUniform("u_resolution", sf::Vector2f({float(cell.w), float(cell.h)}));
$clock = std::make_shared<sf::Clock>(); $clock = std::make_shared<sf::Clock>();
} }
@ -182,7 +207,7 @@ namespace guecs {
sf::Shader *shader_ptr = nullptr; sf::Shader *shader_ptr = nullptr;
if(BACKEND->shader_updated()) { if(BACKEND->shader_updated()) {
$shader = BACKEND->shader_get(name); $shader = BACKEND->get_shader(name);
} }
if($active) { if($active) {

@ -23,9 +23,10 @@ namespace textures {
int width = settings["frame_width"]; int width = settings["frame_width"];
int height = settings["frame_height"]; int height = settings["frame_height"];
sprite->setTextureRect({{0,0}, {width, height}});
TMGR.sprite_textures.try_emplace(name, sprite, texture); sf::Vector2i frame_size{width, height};
sprite->setTextureRect({{0,0}, frame_size});
TMGR.sprite_textures.try_emplace(name, sprite, texture, frame_size);
} }
} }

@ -93,6 +93,10 @@ namespace guecs {
query<lel::Cell, Sprite>([&](auto, auto &cell, auto &sprite) { query<lel::Cell, Sprite>([&](auto, auto &cell, auto &sprite) {
sprite.init(cell); sprite.init(cell);
}); });
query<lel::Cell, Icon>([&](auto, auto &cell, auto &icon) {
icon.init(cell);
});
} }
void UI::debug_layout(sf::RenderWindow& window) { void UI::debug_layout(sf::RenderWindow& window) {
@ -138,6 +142,11 @@ namespace guecs {
sprite.render(window, shader_ptr); sprite.render(window, shader_ptr);
}); });
query<Icon>([&](auto ent, auto& icon) {
auto shader_ptr = find_shader(ent, false);
icon.render(window, shader_ptr);
});
query<Label>([&](auto ent, auto& text) { query<Label>([&](auto ent, auto& text) {
auto shader_ptr = find_shader(ent, false); auto shader_ptr = find_shader(ent, false);
text.render(window, shader_ptr); text.render(window, shader_ptr);

Loading…
Cancel
Save