-
Notifications
You must be signed in to change notification settings - Fork 0
/
Events.cpp
98 lines (86 loc) · 2.36 KB
/
Events.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
#include "Events.h"
Events::Events()
: events(), id(0)
{
}
int Events::AddPeriodicEvent(TypedCallback<EventType> callback, float repeatTimeInSec, bool startImmediately)
{
++id;
events.push_front(InternalEvent(id, InternalEventType::PERIODIC, callback, repeatTimeInSec, 0));
if (startImmediately)
{
callback.CallCallback();
}
return id;
}
int Events::AddSingleEvent(TypedCallback<EventType> callback, float startAfterTimeInSec)
{
++id;
if (startAfterTimeInSec <= 0)
{
callback.CallCallback();
}
else
{
events.push_front(InternalEvent(id, InternalEventType::SINGLE_OFFSET_TIME, callback, startAfterTimeInSec, 0));
}
return id;
}
int Events::AddGameTimeEvent(TypedCallback<EventType> callback, float gameTimeInSec)
{
++id;
events.push_front(InternalEvent(id, InternalEventType::SINGLE_GAME_TIME, callback, gameTimeInSec, 0));
return id;
}
void Events::UpdateEvents(float gameTime, float elapsedTime)
{
for (std::list<InternalEvent>::iterator iter = events.begin(); iter != events.end();)
{
bool erased = false;
switch (iter->internalType)
{
case InternalEventType::PERIODIC:
iter->elapsedTime += elapsedTime;
if (iter->elapsedTime > iter->triggerTime)
{
iter->callback.CallCallback();
iter->elapsedTime -= iter->triggerTime;
}
break;
case InternalEventType::SINGLE_GAME_TIME:
if (gameTime > iter->triggerTime)
{
iter->callback.CallCallback();
iter = events.erase(iter);
erased = true;
}
break;
case InternalEventType::SINGLE_OFFSET_TIME:
iter->elapsedTime += elapsedTime;
if (iter->elapsedTime > iter->triggerTime)
{
iter->callback.CallCallback();
iter = events.erase(iter);
erased = true;
}
break;
default:
break;
}
if (!erased)
{
iter++;
}
}
}
void Events::Cancel(int id)
{
for (std::list<InternalEvent>::iterator iter = events.begin(); iter != events.end(); iter++)
{
if (iter->id == id)
{
events.erase(iter);
return;
}
}
}