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