Simple event system for entities in the world.

This commit is contained in:
Zed A. Shaw 2024-10-29 17:27:12 -04:00
parent ea6cf1362b
commit 3f87d19911
3 changed files with 94 additions and 36 deletions

View file

@ -5,6 +5,9 @@
#include <typeinfo>
#include <unordered_map>
#include <any>
#include <tuple>
#include <queue>
namespace DinkyECS {
@ -12,10 +15,18 @@ namespace DinkyECS {
typedef std::unordered_map<Entity, std::any> EntityMap;
struct Event {
int event = 0;
Entity entity = 0;
};
typedef std::queue<Event> EventQueue;
struct World {
unsigned long entity_count = 0;
std::unordered_map<std::type_index, EntityMap> $components;
std::unordered_map<std::type_index, std::any> $facts;
std::unordered_map<std::type_index, EventQueue> $events;
Entity entity() {
return ++entity_count;
@ -26,6 +37,11 @@ namespace DinkyECS {
return $components[std::type_index(typeid(Comp))];
}
template <typename Comp>
EventQueue& queue_map_for() {
return $events[std::type_index(typeid(Comp))];
}
template <typename Comp>
void remove(Entity ent) {
EntityMap &map = entity_map_for<Comp>();
@ -81,16 +97,24 @@ namespace DinkyECS {
}
}
/*
template<typename Comp>
void send(int event, std::any data) {
void send(int event, Entity entity) {
EventQueue &queue = queue_map_for<Comp>();
queue.push({event, entity});
}
template<typename Comp>
std::tuple<int, std::any data> recv() {
Event recv() {
EventQueue &queue = queue_map_for<Comp>();
Event evt = queue.front();
queue.pop();
return evt;
}
template<typename Comp>
bool has_event() {
EventQueue &queue = queue_map_for<Comp>();
return !queue.empty();
}
*/
};
}