]> code.bitgloo.com Git - clyne/gamedev.git/commitdiff
locked EM.each, arenas
authorClyne Sullivan <tullivan99@gmail.com>
Sun, 12 Feb 2017 22:07:55 +0000 (17:07 -0500)
committerClyne Sullivan <tullivan99@gmail.com>
Sun, 12 Feb 2017 22:07:55 +0000 (17:07 -0500)
entityx/Entity.cc
entityx/Entity.h
include/engine.hpp
src/components.cpp
src/engine.cpp
src/world.cpp

index ddb8df7f35ec1bcb590f1c5d19188f197c4fb92b..adac3de6c5a7596e076f0942fc76e73183f889af 100644 (file)
@@ -31,7 +31,8 @@ std::bitset<entityx::MAX_COMPONENTS> Entity::component_mask() const {
   return manager_->component_mask(id_);
 }
 
-EntityManager::EntityManager(EventManager &event_manager) : event_manager_(event_manager) {
+EntityManager::EntityManager(EventManager &event_manager)
+       : event_manager_(event_manager) {
 }
 
 EntityManager::~EntityManager() {
@@ -46,6 +47,7 @@ void EntityManager::reset() {
   for (BaseComponentHelper *helper : component_helpers_) {
     if (helper) delete helper;
   }
+
   component_pools_.clear();
   component_helpers_.clear();
   entity_component_mask_.clear();
index 3217ae5129ad9909eb9f0afc92291ce275b9bf3a..a423f8ffc36b6b00ad3d6f86bda3b2af0aae2b9e 100644 (file)
@@ -16,6 +16,7 @@
 #include <new>
 #include <cstdlib>
 #include <algorithm>
+#include <mutex>
 #include <bitset>
 #include <cassert>
 #include <iostream>
@@ -462,8 +463,11 @@ class EntityManager : entityx::help::NonCopyable {
     template <typename T> struct identity { typedef T type; };
 
     void each(typename identity<std::function<void(Entity entity, Components&...)>>::type f) {
+      static std::mutex locked;
+      locked.lock();
       for (auto it : *this)
         f(it, *(it.template component<Components>().get())...);
+      locked.unlock();
     }
 
   private:
index 112fd3c82805e16d4c4c1003beee73ad6cd46601..582495025d8918b19b06f58ccdf310fd56f43ad8 100644 (file)
@@ -65,36 +65,6 @@ public:
        }
 };
 
-class LockableEntityManager : public entityx::EntityManager {
-private:
-       std::atomic_bool locked;
-       
-public:
-       LockableEntityManager(entityx::EventManager& ev)
-               : EntityManager(ev) {
-               locked.store(false);
-       }
-       
-       void lock(void) {
-               while (locked.load())
-                       std::this_thread::sleep_for(std::chrono::milliseconds(10));
-               
-               locked.store(true);
-       }
-       
-       void unlock(void) {
-               locked.store(false);
-       }
-       
-       bool try_lock(void) {
-               if (locked.load())
-                       return false;
-               
-               locked.store(true);
-               return true;
-       }
-};
-
 namespace game {
        /**
         * Handles all game events.
@@ -104,7 +74,7 @@ namespace game {
        /**
         * Handles entity data.
         */
-    extern LockableEntityManager entities;
+    extern entityx::EntityManager entities;
        
        /**
         * An instance of the main game engine.
index dfce75c85fa44953d18ca5cb207bbf3740239785..3b38a53427f71b77798078872f2e5ff8a8bb5ee9 100644 (file)
@@ -22,8 +22,10 @@ static std::vector<std::string> randomDialog (readFileA("assets/dialog_en-us"));
 
 void MovementSystem::update(entityx::EntityManager &en, entityx::EventManager &ev, entityx::TimeDelta dt)
 {
+       std::string arena;
+
        (void)ev;
-       en.each<Position, Direction>([dt](entityx::Entity entity, Position &position, Direction &direction) {
+       en.each<Position, Direction>([&arena, dt](entityx::Entity entity, Position &position, Direction &direction) {
                position.x += direction.x * dt;
                position.y += direction.y * dt;
 
@@ -49,15 +51,10 @@ void MovementSystem::update(entityx::EntityManager &en, entityx::EventManager &e
                        // TODO initialX and range?
                        if (entity.has_component<Aggro>()) {
                                auto ppos = game::engine.getSystem<PlayerSystem>()->getPosition();
-                               if (ppos.x > position.x && ppos.x < position.x + entity.component<Solid>()->width) {
-                                       ui::toggleWhiteFast();
-                                       ui::waitForCover(); // TODO thread safe call to load world?
-                                       //game::engine.getSystem<WorldSystem>()->load(entity.component<Aggro>()->arena);
-                                       ui::toggleWhiteFast();
-                                       entity.destroy();
-                               } else {
+                               if (ppos.x > position.x && ppos.x < position.x + entity.component<Solid>()->width)
+                                       arena = entity.component<Aggro>()->arena;
+                               else
                                        direction.x = (ppos.x > position.x) ? .05 : -.05;
-                               }
                        } else if (entity.has_component<Wander>()) {
                                auto& countdown = entity.component<Wander>()->countdown;
 
@@ -70,6 +67,13 @@ void MovementSystem::update(entityx::EntityManager &en, entityx::EventManager &e
                        }
                }
        });
+
+       if (!arena.empty()) {
+               ui::toggleWhiteFast();
+               ui::waitForCover();
+               game::engine.getSystem<WorldSystem>()->load(arena);
+               ui::toggleWhiteFast();
+       }
 }
 
 void PhysicsSystem::update(entityx::EntityManager &en, entityx::EventManager &ev, entityx::TimeDelta dt)
@@ -106,7 +110,6 @@ void RenderSystem::render(void)
        if (!loadTexResult.isEmpty())
                return;
 
-       game::entities.lock();
        game::entities.each<Visible, Sprite, Position>([](entityx::Entity entity, Visible &visible, Sprite &sprite, Position &pos) {
                // Verticies and shit
                float its = 0;
@@ -180,7 +183,6 @@ void RenderSystem::render(void)
                ui::setFontZ(-5.0);
                ui::putStringCentered(pos.x + dim.width / 2, pos.y - ui::fontSize - HLINES(0.5), name.name);
        });
-       game::entities.unlock();
 }
 
 void DialogSystem::configure(entityx::EventManager &ev)
@@ -190,7 +192,6 @@ void DialogSystem::configure(entityx::EventManager &ev)
 
 void DialogSystem::receive(const MouseClickEvent &mce)
 {
-       game::entities.lock();
        game::entities.each<Position, Solid, Dialog, Name>(
                [&](entityx::Entity e, Position &pos, Solid &dim, Dialog &d, Name &name) {
                        static std::atomic_bool dialogRun;
@@ -308,7 +309,6 @@ void DialogSystem::receive(const MouseClickEvent &mce)
                        }
                }
        });
-       game::entities.unlock();
 }
 
 void DialogSystem::update(entityx::EntityManager &en, entityx::EventManager &ev, entityx::TimeDelta dt)
index ebf595377218db5bdadf78dcaf2e1cf4f0e78d4a..ee35d0610cfba6c8119e73bd9641f40499aa384d 100644 (file)
@@ -59,7 +59,7 @@ void Engine::update(entityx::TimeDelta dt)
 
 namespace game {
        entityx::EventManager events;
-       LockableEntityManager entities (events);
+       entityx::EntityManager entities (events);
        //SpriteLoader sprite_l;
 
     Engine engine;
index f46339b84d56a23f152f2851d0701578680b5369..09d277fb778cae6be632420ffc52a45135054f57 100644 (file)
@@ -137,7 +137,6 @@ bool WorldSystem::save(void)
        // signature?
        save << "831998 ";
 
-       game::entities.lock();
        game::entities.each<Position>([&](entityx::Entity entity, Position& pos) {
                // save position
                save << "p " << pos.x << ' ' << pos.y << ' ';
@@ -146,7 +145,6 @@ bool WorldSystem::save(void)
                if (entity.has_component<Dialog>())
                        save << "d " << entity.component<Dialog>()->index << ' ';
        });
-       game::entities.unlock();
 
        save.close();
        return true;
@@ -204,11 +202,14 @@ void WorldSystem::load(const std::string& file)
                UserAssert(wxml != nullptr, "XML Error: Cannot find a <World> or <IndoorWorld> tag in " + xmlPath);
                wxml = wxml->FirstChildElement();
                world.indoor = true;
+               if (world.outdoor.empty()) {
+                       world.outdoor = currentXMLFile;
+                       world.outdoorCoords = vec2(0, 100);
+               }
        }
 
        world.toLeft = world.toRight = "";
        currentXMLFile = file;
-       game::entities.lock();
        game::entities.reset();
        game::engine.getSystem<PlayerSystem>()->create();
 
@@ -449,7 +450,6 @@ void WorldSystem::load(const std::string& file)
        }
 
        game::events.emit<BGMToggleEvent>();
-       game::entities.unlock();
 }
 
 /*
@@ -1115,7 +1115,6 @@ void WorldSystem::update(entityx::EntityManager &en, entityx::EventManager &ev,
 
 void WorldSystem::detect(entityx::TimeDelta dt)
 {
-       game::entities.lock();
        game::entities.each<Grounded, Position, Solid>(
                [&](entityx::Entity e, Grounded &g, Position &loc, Solid &dim) {
                (void)e;
@@ -1180,7 +1179,6 @@ void WorldSystem::detect(entityx::TimeDelta dt)
                        loc.x = -(static_cast<int>(world.startX)) - dim.width - game::HLINE;
                }
        });
-       game::entities.unlock();
 }
 
 void WorldSystem::goWorldRight(Position& p, Solid &d)
@@ -1218,7 +1216,6 @@ void WorldSystem::goWorldPortal(Position& p)
                p.x = world.outdoorCoords.x; // ineffective, player is regen'd
                p.y = world.outdoorCoords.y;
        } else {
-               game::entities.lock();
                game::entities.each<Position, Solid, Portal>(
                        [&](entityx::Entity entity, Position& loc, Solid &dim, Portal &portal) {
                        (void)entity;
@@ -1229,7 +1226,6 @@ void WorldSystem::goWorldPortal(Position& p)
                                return;
                        }
                });
-               game::entities.unlock();
        }
 
        if (!file.empty()) {