Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- struct PositionComponent : public Ndk::Component<PositionComponent>
- {
- NzVector3f position;
- static Ndk::ComponentIndex ComponentIndex;
- };
- Ndk::ComponentIndex PositionComponent::ComponentIndex = Ndk::BaseComponent::Register<PositionComponent>("NdkPos");
- struct VelocityComponent : public Ndk::Component<VelocityComponent>
- {
- NzVector3f velocity;
- static Ndk::ComponentIndex ComponentIndex;
- };
- Ndk::ComponentIndex VelocityComponent::ComponentIndex = Ndk::BaseComponent::Register<VelocityComponent>("NdkVel");
- struct TestComponent : public Ndk::Component<TestComponent>
- {
- NzString name = "Hello world";
- static Ndk::ComponentIndex ComponentIndex;
- };
- Ndk::ComponentIndex TestComponent::ComponentIndex = Ndk::BaseComponent::Register<TestComponent>("NdkTest");
- class VelocitySystem : public Ndk::System<VelocitySystem>
- {
- public:
- VelocitySystem()
- {
- Requires<PositionComponent, VelocityComponent>();
- Excludes<TestComponent>();
- }
- void Update(float elapsedTime)
- {
- for (const Ndk::EntityHandle& entity : GetEntities())
- {
- PositionComponent& posComponent = entity->GetComponent<PositionComponent>();
- VelocityComponent& velComponent = entity->GetComponent<VelocityComponent>();
- posComponent.position += velComponent.velocity * elapsedTime;
- }
- }
- static Ndk::SystemIndex SystemIndex;
- };
- Ndk::SystemIndex VelocitySystem::SystemIndex = Ndk::BaseSystem::GetNextIndex();
- int main()
- {
- Ndk::World world;
- // Ajout du système auprès du monde
- VelocitySystem& system = world.AddSystem<VelocitySystem>();
- // Création de trois entités et récupération des handles
- std::vector<Ndk::EntityHandle> entities = world.CreateEntities(3);
- // Ajout d'un premier composant via template (#0)
- TestComponent& t1 = entities[0]->AddComponent<TestComponent>();
- t1.name = "Hello le monde !";
- // Récupération du composant via template
- TestComponent& t2 = entities[0]->GetComponent<TestComponent>();
- std::cout << t2.name << std::endl; // "Hello le monde !"
- // Ajout d'une copie du composant à une autre entité (#1)
- TestComponent& t3 = *static_cast<TestComponent*>(entities[1]->AddComponent(std::unique_ptr<Ndk::BaseComponent>(t2.Clone())));
- std::cout << t3.name << std::endl; // "Hello le monde !"
- entities[1]->AddComponent<PositionComponent>();
- entities[1]->AddComponent<VelocityComponent>();
- // Ajout d'une position/vitesse (#2)
- entities[2]->AddComponent<PositionComponent>().position = NzVector3f(0.f); // Initialisation
- entities[2]->AddComponent<VelocityComponent>().velocity = NzVector3f::Up();
- // On tue l'entité #0
- entities[0]->Kill();
- // Mise à jour du monde
- world.Update(1.f); // mise à jour d'une seconde
- // À ce stade, notre système est associé avec une seule entité (#2) car elle est la seule à correspondre aux filtres (#1 contient un TestComponent qui est exclu du système)
- std::cout << entities[2]->GetComponent<PositionComponent>().position << std::endl; // affichera une valeur très proche de NzVector3f::Up()
- // Juste pour le fun
- std::cout << entities[2] << std::endl; // EntityHandle(Entity(2))
- std::cout << entities[0] << std::endl; // EntityHandle(Null entity)
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement