]> git.tdb.fi Git - libs/game.git/blobdiff - source/game/director.cpp
Add reflection infrastructure
[libs/game.git] / source / game / director.cpp
index 741965bc290988a7f73210bf453d5cb081533f98..53b2e7f9a3a0c8668580a139355133eebe7b3f61 100644 (file)
@@ -1,18 +1,45 @@
 #include "director.h"
 #include <stdexcept>
 #include <msp/time/utils.h>
+#include "component.h"
+#include "entity.h"
 #include "stage.h"
 
 using namespace std;
 
 namespace Msp::Game {
 
+Director::Director(DataFile::Collection &r):
+       resources(r),
+       event_source(event_bus)
+{
+#if DEBUG
+       access_guard.emplace();
+#endif
+
+       reflector.get_or_create_class<Entity>().set_polymorphic_base<Entity>();
+       reflector.get_or_create_class<Component>().set_polymorphic_base<Component>();
+}
+
+// Hide ~unique_ptr<Stage> from the header
+Director::~Director()
+{ }
+
 Stage &Director::create_stage()
 {
-       stages.emplace_back(std::make_unique<Stage>());
+       stages.emplace_back(std::make_unique<Stage>(std::ref(reflector), std::ref(resources)));
+       event_source.emit<Events::StageCreated>(std::ref(*stages.back()));
        return *stages.back();
 }
 
+void Director::activate_stage(Stage &s)
+{
+       if(active_stage)
+               event_source.emit<Events::StageDeactivated>(std::ref(s));
+       active_stage = &s;
+       event_source.emit<Events::StageActivated>(std::ref(s));
+}
+
 void Director::tick()
 {
        Time::TimeStamp now = Time::now();