#ifndef GameObject___h__ #define GameObject___h__ #include "ForwardDeclarations.h" #include #include #include #include "ObjectsFactory.h" #include "OutputArchive.h" #include "Transform.h" LOBJECT(GameObject, Object) public: TransformPtr transform; void tick(float deltaTime); virtual void serialize(Archive& archive) override { Object::serialize(archive); if (archive.is_loading()) { components.clear(); transform = nullptr; } Archive::size_type cnt = components.size(); archive << cnt; if (archive.is_loading()) { for (Archive::size_type i = 0; i < cnt; ++i) { std::shared_ptr obj; archive << obj; components.push_back(std::static_pointer_cast(obj)); auto tp = std::dynamic_pointer_cast(obj); if (tp != nullptr) { transform = tp; } } } else { for (auto component : components) { archive << std::static_pointer_cast(component); } } } std::shared_ptr as_game_object() { return std::static_pointer_cast(shared_from_this()); } template std::shared_ptr AddComponent() { auto component = T::create(); component->gameObject = as_game_object(); components.push_back(component); return component; } template std::shared_ptr GetComponent() { for (auto c : components) { auto tmp = std::dynamic_pointer_cast(c); if (tmp != nullptr) { return tmp; } } return nullptr; } template std::vector> GetComponents() { std::vector> result; for (auto c : components) { auto tmp = std::dynamic_pointer_cast(c); if (tmp != nullptr) { result.push_back(tmp); } } return result; } void construct() override { construct2(); } void construct2(); private: GameObject() {} std::vector components; }; #endif // GameObject___h__