#pragma once #include #include #include struct Entity; class Component; class Component { public: Entity *entity = nullptr; virtual void Setup() = 0; virtual void Update(float dt) = 0; virtual void Cleanup() = 0; virtual ~Component() = default; }; struct Entity { std::vector> components; template T> T &AddComponent() { auto &ptr = components.emplace_back(std::make_shared()); ptr->entity = this; ptr->Setup(); return static_cast(*ptr); } template T> std::optional> GetComponent() const { for (auto &c : components) { T *cast = dynamic_cast(c.get()); if (cast) { return *cast; } } return {}; } void Update(float dt) { for (auto &c : components) { c->Update(dt); } } };