]> git.tdb.fi Git - libs/game.git/blob - source/game/director.cpp
Add reflection infrastructure
[libs/game.git] / source / game / director.cpp
1 #include "director.h"
2 #include <stdexcept>
3 #include <msp/time/utils.h>
4 #include "component.h"
5 #include "entity.h"
6 #include "stage.h"
7
8 using namespace std;
9
10 namespace Msp::Game {
11
12 Director::Director(DataFile::Collection &r):
13         resources(r),
14         event_source(event_bus)
15 {
16 #if DEBUG
17         access_guard.emplace();
18 #endif
19
20         reflector.get_or_create_class<Entity>().set_polymorphic_base<Entity>();
21         reflector.get_or_create_class<Component>().set_polymorphic_base<Component>();
22 }
23
24 // Hide ~unique_ptr<Stage> from the header
25 Director::~Director()
26 { }
27
28 Stage &Director::create_stage()
29 {
30         stages.emplace_back(std::make_unique<Stage>(std::ref(reflector), std::ref(resources)));
31         event_source.emit<Events::StageCreated>(std::ref(*stages.back()));
32         return *stages.back();
33 }
34
35 void Director::activate_stage(Stage &s)
36 {
37         if(active_stage)
38                 event_source.emit<Events::StageDeactivated>(std::ref(s));
39         active_stage = &s;
40         event_source.emit<Events::StageActivated>(std::ref(s));
41 }
42
43 void Director::tick()
44 {
45         Time::TimeStamp now = Time::now();
46         Time::TimeDelta dt = (last_tick ? now-last_tick : Time::zero);
47         last_tick = now;
48
49         backlog = min(backlog+dt, stepsize*max_backlog_steps);
50         for(unsigned i=0; (i<max_steps_per_frame && backlog>=stepsize); ++i, backlog-=stepsize)
51                 for(const auto &s: stages)
52                         s->tick(stepsize);
53 }
54
55 } // namespace Msp::Game