#include "dinkyecs.hpp" #include #include using namespace fmt; using DinkyECS::Entity; struct Player { std::string name; Entity eid; }; struct Position { double x, y; }; struct Velocity { double x, y; }; struct Gravity { double level; }; /* * Using a function catches instances where I'm not copying * the data into the world. */ void configure(DinkyECS::World &world, Entity &test) { println("---Configuring the base system."); Entity test2 = world.entity(); world.assign(test, {10,20}); world.assign(test, {1,2}); world.assign(test2, {1,1}); world.assign(test2, {10,20}); println("---- Setting up the player as a fact in the system."); auto player_eid = world.entity(); Player player_info{"Zed", player_eid}; // just set some player info as a fact with the entity id world.set(player_info); world.assign(player_eid, {0,0}); world.assign(player_eid, {0,0}); auto enemy = world.entity(); world.assign(enemy, {0,0}); world.assign(enemy, {0,0}); println("--- Creating facts (singletons)"); world.set({0.9}); } int main() { DinkyECS::World world; Entity test = world.entity(); configure(world, test); Position &pos = world.component(test); println("GOT POS x={}, y={}", pos.x, pos.y); Velocity &vel = world.component(test); println("GOT VELOCITY x={}, y={}", vel.x, vel.y); println("--- Position only system:"); world.system([](const auto &ent, auto &pos) { println("entity={}, pos.x={}, pos.y={}", ent, pos.x, pos.y); }); println("--- Velocity only system:"); world.system([](const auto &, auto &vel) { println("vel.x={}, vel.y={}", vel.x, vel.y); }); println("--- Manually get the velocity in position system:"); world.system([&](const auto &ent, auto &pos) { Velocity &vel = world.component(ent); println("entity={}, vel.x, vel.y, pos.x={}, pos.y={}", ent, vel.x, vel.y, pos.x, pos.y); }); println("--- Query only entities with Position and Velocity:"); world.system([&](const auto &ent, auto &pos, auto &vel) { Gravity &grav = world.get(); println("grav={}, entity={}, vel.x, vel.y, pos.x={}, pos.y={}", grav.level, ent, vel.x, vel.y, pos.x, pos.y); }); // now remove Velocity world.remove(test); println("--- After remove test, should only result in test2:"); world.system([&](const auto &ent, auto &pos, auto &vel) { println("entity={}, vel.x, vel.y, pos.x={}, pos.y={}", ent, vel.x, vel.y, pos.x, pos.y); }); println("--- Create a stored system you can save for later."); auto movementSystem = world.runner([&](const auto &ent, auto &pos, auto &vel) { println("entity={}, vel.x, vel.y, pos.x={}, pos.y={}", ent, vel.x, vel.y, pos.x, pos.y); }); movementSystem(); // how to create an identified entity like the player // to avoid repeatedly getting the player just make a closure with it // QUESTION: could I just capture it and not have the double function wrapping? auto playerVsEnemies = [&]() { auto& player = world.get(); // grabbed it world.system([&](const auto &ent, auto &pos) { if(player.eid != ent) { println("{} is enemy attacking player {}", ent, player.name); } else { println("{} is player", player.name); } }); }; playerVsEnemies(); return 0; }