diff --git a/main.cpp b/main.cpp index 334983c..5a916f0 100644 --- a/main.cpp +++ b/main.cpp @@ -2,6 +2,44 @@ using namespace spic; +class TestScript : public spic::BehaviourScript +{ + public: + void OnStart() override + { + } + + void OnUpdate() override + { + auto rotation = 25.0; + auto tickRotation = rotation * Time::DeltaTime() * Time::TimeScale(); + + if (Input::GetKey(spic::Input::KeyCode::E)) + { + GameObject().lock()->Transform().rotation += tickRotation; + } + if (Input::GetKey(spic::Input::KeyCode::Q)) + { + GameObject().lock()->Transform().rotation -= tickRotation; + } + } + + void OnTriggerEnter2D(const Collider& collider) override + { + BehaviourScript::OnTriggerEnter2D(collider); + } + + void OnTriggerExit2D(const Collider& collider) override + { + BehaviourScript::OnTriggerExit2D(collider); + } + + void OnTriggerStay2D(const Collider& collider) override + { + BehaviourScript::OnTriggerStay2D(collider); + } +}; + int main(int argc, char* args[]) { Engine& engine = Engine::Instance(); @@ -9,6 +47,27 @@ int main(int argc, char* args[]) engine.Init(engineConfig); auto scene = std::make_shared(); + + auto parentObj = std::make_shared("parent", "parent", 5); + parentObj->Transform().position.x = 200; + parentObj->Transform().position.y = 200; + auto parentScript = std::make_shared(); + parentScript->GameObject(parentObj); + parentObj->AddComponent(parentScript); + auto parentSprite = std::make_shared("resources/hero.png", false, false, 1, 1); + parentSprite->GameObject(parentObj); + parentObj->AddComponent(parentSprite); + + auto childObj = std::make_shared("child", "child", 5); + childObj->Transform().position.x = 200; + childObj->Parent(parentObj); + parentObj->AddChild(childObj); + auto childSprite = std::make_shared("resources/hero.png", false, false, 1, 1); + childSprite->GameObject(childObj); + childObj->AddComponent(childSprite); + + scene->Contents().push_back(parentObj); + engine.PushScene(scene); engine.Start(); diff --git a/src/Api/GameObject.cpp b/src/Api/GameObject.cpp index 5a28d8d..d1ee0c5 100644 --- a/src/Api/GameObject.cpp +++ b/src/Api/GameObject.cpp @@ -198,21 +198,32 @@ int GameObject::Layer() const spic::Transform GameObject::AbsoluteTransform() const { - const GameObject* object = this; - spic::Transform transform{object->Transform()}; + std::vector transforms{}; + auto parent = Parent(); - while (!object->Parent().expired()) + if (parent.expired()) return Transform(); + + while (!parent.expired()) + { + auto wParent = parent.lock(); + transforms.push_back(wParent->Transform()); + parent = wParent->Parent(); + } + transforms.push_back(Transform()); + + spic::Transform absTransform{{0, 0}, 0, 1}; + + for (const auto& transform: transforms) { - object = object->Parent().lock().get(); - transform.position.x += object->Transform().position.x; - transform.position.y += object->Transform().position.y; -// transform.rotation += object->Transform().rotation; - transform.scale *= object->Transform().scale; + absTransform.position.x += transform.position.x; + absTransform.position.y += transform.position.y; + absTransform.rotation += transform.rotation; + absTransform.scale *= transform.scale; } - transform.rotation = std::fmod(transform.rotation, 360); + absTransform.rotation = fmod(absTransform.rotation, 360); - return transform; + return absTransform; } void GameObject::RemoveComponent(std::shared_ptr component)