forked from chenzhi/CameraGame
/
stateMachine.cpp
146 lines (104 loc) · 2.35 KB
/
stateMachine.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
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
#include "pch.h"
#include "stateMachine.h"
StateMachine::StateMachine()
:m_pcurrentState(NULL)
{
}
StateMachine::~StateMachine()
{
destroyAllState();
}
void StateMachine::update(float time)
{
if(m_pcurrentState==NULL)
return ;
static bool firstFrame=true;
StateType nextType = m_pcurrentState->update(firstFrame?0.01f:time);
///如果下一帧的状态和当前帧不同需要更换状态
if(nextType!=m_pcurrentState->getType())
{
m_pcurrentState->end();
State* ptemState = findState(nextType);
assert(ptemState);
m_pcurrentState=ptemState;
ptemState->begin();
firstFrame=true;
}
firstFrame=false;
}
void StateMachine::destroyAllState()
{
////如果当前有活动状态,首先结束状态
if(m_pcurrentState!=NULL)
{
m_pcurrentState->end();
}
StateCollect::iterator it = m_stateCollect.begin();
while(it!=m_stateCollect.end())
{
delete *it;
*it=NULL;
++it;
}
m_stateCollect.clear();
m_pcurrentState=NULL;
return ;
}
State* StateMachine::findState(StateType type)
{
StateCollect::iterator it = m_stateCollect.begin();
while(it!=m_stateCollect.end())
{
if((*it)->getType()==type)
{
return *it;
}
++it;
}
return NULL;
}
bool StateMachine::registerState(State* pState)
{
if(pState==NULL)
return false;
if(findState(pState->getType())!=NULL)
{
return false;
}
m_stateCollect.push_back(pState);
return true;
}
bool StateMachine::unregisterState(StateType type)
{
StateCollect::iterator it =m_stateCollect.begin();
while(it!=m_stateCollect.end())
{
if((*it)->getType()==type)
{
delete (*it);
m_stateCollect.erase(it);
return true;
}
++it;
}
return false;
}
State* StateMachine::getState(unsigned int index) const
{
if(index>=m_stateCollect.size())
return NULL;
return m_stateCollect[index];
}
///设置游戏开始的状态
void StateMachine::setBeginState(StateType GS)
{
State* pGameState=findState(GS);
if(pGameState==NULL)
{
throw("can't find begin state StateMachine::setBeginState");
//OGRE_EXCEPT(0,"can't find begin state ","Application::setBeginState");
return ;
}
m_pcurrentState=pGameState;
m_pcurrentState->begin();
}