Skip to content

Instantly share code, notes, and snippets.

@native-m
Last active February 20, 2020 08:15
Show Gist options
  • Save native-m/8a6f070d2dec7fb676db830db074ccb4 to your computer and use it in GitHub Desktop.
Save native-m/8a6f070d2dec7fb676db830db074ccb4 to your computer and use it in GitHub Desktop.
Hexagon engine ECS concept
#include <iostream>
using Hx::ECS::ECSContext;
using Hx::ECS::EntityManager;
using Hx::ECS::Entity;
using Hx::ECS::World;
using Hx::ECS::System;
using Hx::Components::Position2D;
using Hx::Components::Direction2D;
using Hx::Components::Sprite2D;
using Hx::Systems::Sprite2DSystem;
using Hx::Events::KeyboardEvent;
using Hx::Events::EventHandler;
using Hx::Resource::Receiver;
using Hx::Input::Keyboard;
struct Playable
{
Playable() {}
};
struct PlayableSystem : public System<PlayableSystem>, public Observer<PlayableSystem>
{
void Initialize(const EventManager& eventMgr) override
{
eventMgr.RegisterObserver<KeyboardEvent>(this->GetSystemInstance());
}
void Update(EntityManager& entities, EventManager& events, double dt) override
{
}
void Notify(EntityManager& entities, EventManager& events, const KeyboardEvent& e)
{
for(Entity entity : entities.WithComponents<Playable>())
{
switch(kb.key) // switch key
{
case Keyboard::W:
// move entities forward
case Keyboard::S:
// move entities backward
case Keyboard::A:
// move entities left
case Keyboard::D:
// move entities right
}
}
}
};
class MyWorld : public World
{
public:
MyWorld(ECSContext& ctx) :
World(ctx)
{
EntityManager& Entities = GetEntityManager();
// entity 1 (this entity is playable)
Entity e = this->Entities.Create();
e.Assign<Position2D>(50, 50);
e.Assign<Direction2D>(0, 0);
e.Assign<Sprite2D>(ResourceManager::LoadImage("ent0.png"));
e.Assign<Playable>(true);
// entity 2
e = this->Entities.Create();
e.Assign<Position2D>(100, 50);
e.Assign<Direction2D>(0, 0);
e.Assign<Sprite2D>(ResourceManager::LoadImage("ent1.png"));
}
void Update(double dt) override
{
}
void Render(double dt) override
{
GetContext().Update<Sprite2DSystem>();
}
};
// .. game initialization
ECSContext ctx;
ctx.RegisterSystem<Sprite2DSystem>();
ctx.RegisterSystem<PlayableSystem>();
MyWorld world(ctx);
// .. update function
ctx.GetEventManager().BroadcastEvents(this->GetEvents()); // Broadcast default events (keyboard events, mouse events, etc), this will notify all observers
// .. render function
world.Render(dt);
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment