diff --git a/base_position_uisprite_test.png b/base_position_uisprite_test.png new file mode 100644 index 0000000..2126533 Binary files /dev/null and b/base_position_uisprite_test.png differ diff --git a/src/UISprite.cpp b/src/UISprite.cpp index 33cc4f2..734764a 100644 --- a/src/UISprite.cpp +++ b/src/UISprite.cpp @@ -17,14 +17,16 @@ UISprite::UISprite() : sprite_index(0), ptex(nullptr) { // Initialize sprite to safe defaults - sprite.setPosition(0.0f, 0.0f); + position = sf::Vector2f(0.0f, 0.0f); // Set base class position + sprite.setPosition(position); // Sync sprite position sprite.setScale(1.0f, 1.0f); } UISprite::UISprite(std::shared_ptr _ptex, int _sprite_index, sf::Vector2f _pos, float _scale) : ptex(_ptex), sprite_index(_sprite_index) { - sprite = ptex->sprite(sprite_index, _pos, sf::Vector2f(_scale, _scale)); + position = _pos; // Set base class position + sprite = ptex->sprite(sprite_index, position, sf::Vector2f(_scale, _scale)); } /* @@ -57,7 +59,8 @@ void UISprite::render(sf::Vector2f offset, sf::RenderTarget& target) void UISprite::setPosition(sf::Vector2f pos) { - sprite.setPosition(pos); + position = pos; // Update base class position + sprite.setPosition(position); // Sync sprite position } void UISprite::setScale(sf::Vector2f s) @@ -70,13 +73,13 @@ void UISprite::setTexture(std::shared_ptr _ptex, int _sprite_index) ptex = _ptex; if (_sprite_index != -1) // if you are changing textures, there's a good chance you need a new index too sprite_index = _sprite_index; - sprite = ptex->sprite(sprite_index, sprite.getPosition(), sprite.getScale()); + sprite = ptex->sprite(sprite_index, position, sprite.getScale()); // Use base class position } void UISprite::setSpriteIndex(int _sprite_index) { sprite_index = _sprite_index; - sprite = ptex->sprite(sprite_index, sprite.getPosition(), sprite.getScale()); + sprite = ptex->sprite(sprite_index, position, sprite.getScale()); // Use base class position } sf::Vector2f UISprite::getScale() const @@ -86,7 +89,7 @@ sf::Vector2f UISprite::getScale() const sf::Vector2f UISprite::getPosition() { - return sprite.getPosition(); + return position; // Return base class position } std::shared_ptr UISprite::getTexture() @@ -112,7 +115,9 @@ sf::FloatRect UISprite::get_bounds() const void UISprite::move(float dx, float dy) { - sprite.move(dx, dy); + position.x += dx; + position.y += dy; + sprite.setPosition(position); // Keep sprite in sync } void UISprite::resize(float w, float h) @@ -126,6 +131,12 @@ void UISprite::resize(float w, float h) } } +void UISprite::onPositionChanged() +{ + // Sync sprite position with base class position + sprite.setPosition(position); +} + PyObject* UISprite::get_float_member(PyUISpriteObject* self, void* closure) { auto member_ptr = reinterpret_cast(closure); @@ -278,8 +289,8 @@ PyMethodDef UISprite_methods[] = { }; PyGetSetDef UISprite::getsetters[] = { - {"x", (getter)UISprite::get_float_member, (setter)UISprite::set_float_member, "X coordinate of top-left corner", (void*)0}, - {"y", (getter)UISprite::get_float_member, (setter)UISprite::set_float_member, "Y coordinate of top-left corner", (void*)1}, + {"x", (getter)UIDrawable::get_float_member, (setter)UIDrawable::set_float_member, "X coordinate of top-left corner", (void*)((intptr_t)PyObjectsEnum::UISPRITE << 8 | 0)}, + {"y", (getter)UIDrawable::get_float_member, (setter)UIDrawable::set_float_member, "Y coordinate of top-left corner", (void*)((intptr_t)PyObjectsEnum::UISPRITE << 8 | 1)}, {"scale", (getter)UISprite::get_float_member, (setter)UISprite::set_float_member, "Uniform size factor", (void*)2}, {"scale_x", (getter)UISprite::get_float_member, (setter)UISprite::set_float_member, "Horizontal scale factor", (void*)3}, {"scale_y", (getter)UISprite::get_float_member, (setter)UISprite::set_float_member, "Vertical scale factor", (void*)4}, @@ -289,7 +300,7 @@ PyGetSetDef UISprite::getsetters[] = { {"click", (getter)UIDrawable::get_click, (setter)UIDrawable::set_click, "Object called with (x, y, button) when clicked", (void*)PyObjectsEnum::UISPRITE}, {"z_index", (getter)UIDrawable::get_int, (setter)UIDrawable::set_int, "Z-order for rendering (lower values rendered first)", (void*)PyObjectsEnum::UISPRITE}, {"name", (getter)UIDrawable::get_name, (setter)UIDrawable::set_name, "Name for finding elements", (void*)PyObjectsEnum::UISPRITE}, - {"pos", (getter)UISprite::get_pos, (setter)UISprite::set_pos, "Position as a Vector", NULL}, + {"pos", (getter)UIDrawable::get_pos, (setter)UIDrawable::set_pos, "Position as a Vector", (void*)PyObjectsEnum::UISPRITE}, UIDRAWABLE_GETSETTERS, {NULL} }; @@ -377,7 +388,6 @@ int UISprite::init(PyUISpriteObject* self, PyObject* args, PyObject* kwds) } self->data = std::make_shared(texture_ptr, sprite_index, sf::Vector2f(x, y), scale); - self->data->setPosition(sf::Vector2f(x, y)); // Process click handler if provided if (click_handler && click_handler != Py_None) { @@ -394,11 +404,13 @@ int UISprite::init(PyUISpriteObject* self, PyObject* args, PyObject* kwds) // Property system implementation for animations bool UISprite::setProperty(const std::string& name, float value) { if (name == "x") { - sprite.setPosition(sf::Vector2f(value, sprite.getPosition().y)); + position.x = value; + sprite.setPosition(position); // Keep sprite in sync return true; } else if (name == "y") { - sprite.setPosition(sf::Vector2f(sprite.getPosition().x, value)); + position.y = value; + sprite.setPosition(position); // Keep sprite in sync return true; } else if (name == "scale") { @@ -434,11 +446,11 @@ bool UISprite::setProperty(const std::string& name, int value) { bool UISprite::getProperty(const std::string& name, float& value) const { if (name == "x") { - value = sprite.getPosition().x; + value = position.x; return true; } else if (name == "y") { - value = sprite.getPosition().y; + value = position.y; return true; } else if (name == "scale") { diff --git a/src/UISprite.h b/src/UISprite.h index 8043282..5c16ab1 100644 --- a/src/UISprite.h +++ b/src/UISprite.h @@ -46,6 +46,7 @@ public: sf::FloatRect get_bounds() const override; void move(float dx, float dy) override; void resize(float w, float h) override; + void onPositionChanged() override; // Property system for animations bool setProperty(const std::string& name, float value) override;