Skip to content

Instantly share code, notes, and snippets.

@native-m
Last active February 20, 2020 08:15

Revisions

  1. native-m revised this gist Feb 20, 2020. 1 changed file with 26 additions and 24 deletions.
    50 changes: 26 additions & 24 deletions hxecs.cpp
    Original file line number Diff line number Diff line change
    @@ -1,5 +1,4 @@
    #include <iostream>
    #include "Hx.hpp"

    using Hx::ECS::ECSContext;
    using Hx::ECS::EntityManager;
    @@ -11,35 +10,40 @@ using Hx::Components::Direction2D;
    using Hx::Components::Sprite2D;
    using Hx::Systems::Sprite2DSystem;
    using Hx::Events::KeyboardEvent;
    using Hx::Resource::ResourceManager;
    using Hx::Events::EventHandler;
    using Hx::Resource::Receiver;
    using Hx::Input::Keyboard;

    struct Playable
    {
    Playable() {}
    };

    struct PlayableSystem : public System<PlayableSystem>
    {
    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
    {
    for(Entity e : entities.WithComponent<Playable>()) // retrieves entities with Playable components
    }

    void Notify(EntityManager& entities, EventManager& events, const KeyboardEvent& e)
    {
    for(Entity entity : entities.WithComponents<Playable>())
    {
    KeyboardEvent kb;

    if(events.PopEvent<KeyboardEvent>(kb) == KeyboardEvent::EventID) // KeyboardEvent?
    switch(kb.key) // switch key
    {
    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
    }
    case Keyboard::W:
    // move entities forward
    case Keyboard::S:
    // move entities backward
    case Keyboard::A:
    // move entities left
    case Keyboard::D:
    // move entities right
    }
    }
    }
    @@ -48,8 +52,8 @@ struct PlayableSystem : public System<PlayableSystem>
    class MyWorld : public World
    {
    public:
    MyWorld(ECSContext& ctx)
    : World(ctx)
    MyWorld(ECSContext& ctx) :
    World(ctx)
    {
    EntityManager& Entities = GetEntityManager();

    @@ -69,7 +73,6 @@ class MyWorld : public World

    void Update(double dt) override
    {
    GetContext().Update<PlayableSystem>();
    }

    void Render(double dt) override
    @@ -86,8 +89,7 @@ ctx.RegisterSystem<PlayableSystem>();
    MyWorld world(ctx);

    // .. update function
    ctx.BroadcastEvents(this->GetInputEvents()); // send input events to ecs
    world.Update(dt);
    ctx.GetEventManager().BroadcastEvents(this->GetEvents()); // Broadcast default events (keyboard events, mouse events, etc), this will notify all observers

    // .. render function
    world.Render(dt);
  2. native-m revised this gist Feb 20, 2020. 1 changed file with 1 addition and 1 deletion.
    2 changes: 1 addition & 1 deletion hxecs.cpp
    Original file line number Diff line number Diff line change
    @@ -86,7 +86,7 @@ ctx.RegisterSystem<PlayableSystem>();
    MyWorld world(ctx);

    // .. update function
    ctx.BroadcastEvents(this->GetEvents());
    ctx.BroadcastEvents(this->GetInputEvents()); // send input events to ecs
    world.Update(dt);

    // .. render function
  3. native-m revised this gist Feb 20, 2020. No changes.
  4. native-m created this gist Feb 20, 2020.
    93 changes: 93 additions & 0 deletions hxecs.cpp
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,93 @@
    #include <iostream>
    #include "Hx.hpp"

    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::Resource::ResourceManager;
    using Hx::Input::Keyboard;

    struct Playable
    {
    Playable() {}
    };

    struct PlayableSystem : public System<PlayableSystem>
    {
    void Update(EntityManager& entities, EventManager& events, double dt) override
    {
    for(Entity e : entities.WithComponent<Playable>()) // retrieves entities with Playable components
    {
    KeyboardEvent kb;

    if(events.PopEvent<KeyboardEvent>(kb) == KeyboardEvent::EventID) // KeyboardEvent?
    {
    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
    {
    GetContext().Update<PlayableSystem>();
    }

    void Render(double dt) override
    {
    GetContext().Update<Sprite2DSystem>();
    }
    };

    // .. game initialization
    ECSContext ctx;
    ctx.RegisterSystem<Sprite2DSystem>();
    ctx.RegisterSystem<PlayableSystem>();

    MyWorld world(ctx);

    // .. update function
    ctx.BroadcastEvents(this->GetEvents());
    world.Update(dt);

    // .. render function
    world.Render(dt);