Last active
February 20, 2020 08:15
-
-
Save native-m/8a6f070d2dec7fb676db830db074ccb4 to your computer and use it in GitHub Desktop.
Hexagon engine ECS concept
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#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