Parent-Child UI System (#122): - Add parent weak_ptr to UIDrawable for hierarchy tracking - Add setParent(), getParent(), removeFromParent() methods - UICollection now tracks owner and sets parent on append/insert - Auto-remove from old parent when adding to new collection Global Position Property (#102): - Add get_global_position() that walks up parent chain - Expose as read-only 'global_position' property on all UI types - Add UIDRAWABLE_PARENT_GETSETTERS macro for consistent bindings Dirty Flag System (#116): - Modify markDirty() to propagate up the parent chain - Add isDirty() and clearDirty() methods for render optimization Scene as Drawable (#118): - Add position, visible, opacity properties to Scene - Add setProperty()/getProperty() for animation support - Apply scene transformations in PyScene::render() - Fix lifecycle callbacks to clear errors when methods don't exist - Add GameEngine::getScene() public accessor 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
96 lines
2.1 KiB
C++
96 lines
2.1 KiB
C++
#include "Scene.h"
|
|
#include "UI.h"
|
|
|
|
//Scene::Scene() { game = 0; std::cout << "WARN: default Scene constructor called. (game = " << game << ")" << std::endl;};
|
|
Scene::Scene(GameEngine* g)
|
|
{
|
|
key_callable = std::make_unique<PyKeyCallable>();
|
|
game = g;
|
|
ui_elements = std::make_shared<std::vector<std::shared_ptr<UIDrawable>>>();
|
|
}
|
|
void Scene::registerAction(int code, std::string name)
|
|
{
|
|
actions[code] = name;
|
|
actionState[name] = false;
|
|
}
|
|
bool Scene::hasAction(std::string name)
|
|
{
|
|
for (auto& item : actions)
|
|
if (item.second == name) return true;
|
|
return false;
|
|
}
|
|
|
|
bool Scene::hasAction(int code)
|
|
{
|
|
return (actions.find(code) != actions.end());
|
|
}
|
|
|
|
std::string Scene::action(int code)
|
|
{
|
|
return actions[code];
|
|
}
|
|
|
|
|
|
void Scene::key_register(PyObject* callable)
|
|
{
|
|
/*
|
|
if (key_callable)
|
|
{
|
|
// decrement reference before overwriting
|
|
Py_DECREF(key_callable);
|
|
}
|
|
key_callable = callable;
|
|
Py_INCREF(key_callable);
|
|
*/
|
|
key_callable = std::make_unique<PyKeyCallable>(callable);
|
|
}
|
|
|
|
void Scene::key_unregister()
|
|
{
|
|
/*
|
|
if (key_callable == NULL) return;
|
|
Py_DECREF(key_callable);
|
|
key_callable = NULL;
|
|
*/
|
|
key_callable.reset();
|
|
}
|
|
|
|
// #118: Scene animation property support
|
|
bool Scene::setProperty(const std::string& name, float value)
|
|
{
|
|
if (name == "x") {
|
|
position.x = value;
|
|
return true;
|
|
}
|
|
if (name == "y") {
|
|
position.y = value;
|
|
return true;
|
|
}
|
|
if (name == "opacity") {
|
|
opacity = std::max(0.0f, std::min(1.0f, value));
|
|
return true;
|
|
}
|
|
if (name == "visible") {
|
|
visible = (value != 0.0f);
|
|
return true;
|
|
}
|
|
return false;
|
|
}
|
|
|
|
bool Scene::setProperty(const std::string& name, const sf::Vector2f& value)
|
|
{
|
|
if (name == "pos" || name == "position") {
|
|
position = value;
|
|
return true;
|
|
}
|
|
return false;
|
|
}
|
|
|
|
float Scene::getProperty(const std::string& name) const
|
|
{
|
|
if (name == "x") return position.x;
|
|
if (name == "y") return position.y;
|
|
if (name == "opacity") return opacity;
|
|
if (name == "visible") return visible ? 1.0f : 0.0f;
|
|
return 0.0f;
|
|
}
|