Mercurial > LightClone
comparison LightClone/Source/ScreenManager.cpp @ 71:bc8afcf7e1ec
Refactor world into game screen
author | koryspansel <koryspansel@bendbroadband.com> |
---|---|
date | Tue, 11 Oct 2011 13:20:43 -0700 |
parents | ffaeccdc105e |
children | 0574e2cf8bac |
comparison
equal
deleted
inserted
replaced
70:ffaeccdc105e | 71:bc8afcf7e1ec |
---|---|
5 #include "ScreenManager.h" | 5 #include "ScreenManager.h" |
6 | 6 |
7 /* | 7 /* |
8 * ScreenManager | 8 * ScreenManager |
9 */ | 9 */ |
10 ScreenManager::ScreenManager() | 10 ScreenManager::ScreenManager() : bDirty(false) |
11 { | 11 { |
12 } | 12 } |
13 | 13 |
14 /* | 14 /* |
15 * Register | 15 * Register |
18 { | 18 { |
19 ErrorCode eCode = Error_Fail; | 19 ErrorCode eCode = Error_Fail; |
20 | 20 |
21 if(pInstance) | 21 if(pInstance) |
22 { | 22 { |
23 FixedString<> kName(pName); | 23 Screen** pScreen = kScreens.Find(pName); |
24 | 24 |
25 Screen** pScreen = kScreens.Find(kName); | |
26 if(!pScreen) | 25 if(!pScreen) |
27 pScreen = kScreens.Add(kName); | 26 { |
27 pScreen = kScreens.Add(pName); | |
28 } | |
28 | 29 |
29 if(pScreen) | 30 if(pScreen) |
30 { | 31 { |
31 (*pScreen) = pInstance; | 32 (*pScreen) = pInstance; |
32 (*pScreen)->SetScreenManager(this); | 33 (*pScreen)->pScreenManager = this; |
34 | |
35 eCode = Error_Success; | |
33 } | 36 } |
34 | |
35 eCode = Error_Success; | |
36 } | 37 } |
37 | 38 |
38 return eCode; | 39 return eCode; |
39 } | 40 } |
40 | 41 |
41 /* | 42 /* |
42 * Initialize | 43 * Initialize |
43 */ | 44 */ |
44 ErrorCode ScreenManager::Initialize(ServiceProvider* pServiceProvider) | 45 ErrorCode ScreenManager::Initialize(ServiceProvider* pServiceProvider) |
45 { | 46 { |
46 return Error_Success; | 47 ErrorCode eCode = Error_Success; |
48 | |
49 ScreenMap::Iterator kScreen = kScreens.Begin(); | |
50 ScreenMap::Iterator kScreenEnd = kScreens.End(); | |
51 | |
52 for(; kScreen != kScreenEnd && eCode == Error_Success; ++kScreen) | |
53 { | |
54 eCode = (*kScreen)->Initialize(pServiceProvider); | |
55 } | |
56 | |
57 return eCode; | |
47 } | 58 } |
48 | 59 |
49 /* | 60 /* |
50 * Terminate | 61 * Terminate |
51 */ | 62 */ |
52 void ScreenManager::Terminate() | 63 void ScreenManager::Terminate() |
53 { | 64 { |
65 ScreenMap::Iterator kScreen = kScreens.Begin(); | |
66 ScreenMap::Iterator kScreenEnd = kScreens.End(); | |
67 | |
68 for(; kScreen != kScreenEnd; ++kScreen) | |
69 { | |
70 (*kScreen)->Terminate(); | |
71 } | |
54 } | 72 } |
55 | 73 |
56 /* | 74 /* |
57 * Update | 75 * Update |
58 */ | 76 */ |
59 void ScreenManager::Update(float fElapsed) | 77 void ScreenManager::Update(float fElapsed) |
60 { | 78 { |
79 bDirty = false; | |
80 | |
81 for(int32 i = kStack.Size() - 1; i >= 0 && !bDirty; --i) | |
82 { | |
83 kStack[i]->Update(fElapsed); | |
84 } | |
61 } | 85 } |
62 | 86 |
63 /* | 87 /* |
64 * Render | 88 * Render |
65 */ | 89 */ |
66 void ScreenManager::Render(RenderContext& kContext) | 90 void ScreenManager::Render(RenderContext& kContext) |
67 { | 91 { |
92 const int32 nSize = kStack.Size(); | |
93 | |
94 for(int32 i = 0; i < nSize; ++i) | |
95 { | |
96 kStack[i]->Render(kContext); | |
97 } | |
68 } | 98 } |
99 | |
100 /* | |
101 * Set | |
102 */ | |
103 void ScreenManager::Set(const char* pName) | |
104 { | |
105 while(kStack.Size() > 1) | |
106 { | |
107 Screen* pScreen = kStack.Pop(); | |
108 ASSERT(pScreen != NULL); | |
109 | |
110 pScreen->OnExit(); | |
111 | |
112 Screen* pTop = kStack.Peek(); | |
113 ASSERT(pTop != NULL); | |
114 | |
115 pTop->OnResume(); | |
116 } | |
117 | |
118 if(kStack.Size() > 0) | |
119 { | |
120 ASSERT(kStack.Size() == 1); | |
121 | |
122 Screen* pScreen = kStack.Pop(); | |
123 ASSERT(pScreen != NULL); | |
124 | |
125 pScreen->OnExit(); | |
126 } | |
127 | |
128 Screen** pInstance = kScreens.Find(pName); | |
129 if(pInstance) | |
130 { | |
131 ASSERT(*pInstance != NULL); | |
132 (*pInstance)->OnEnter(); | |
133 | |
134 kStack.Push(*pInstance); | |
135 } | |
136 | |
137 bDirty = true; | |
138 } | |
139 | |
140 /* | |
141 * Push | |
142 */ | |
143 void ScreenManager::Push(const char* pName) | |
144 { | |
145 Screen** pInstance = kScreens.Find(pName); | |
146 ASSERT(pInstance != NULL); | |
147 | |
148 if(kStack.Size() > 0) | |
149 { | |
150 Screen* pTop = kStack.Peek(); | |
151 ASSERT(pTop != NULL); | |
152 | |
153 pTop->OnPause(); | |
154 } | |
155 | |
156 ASSERT(*pInstance != NULL); | |
157 (*pInstance)->OnEnter(); | |
158 | |
159 kStack.Push(*pInstance); | |
160 | |
161 bDirty = true; | |
162 } | |
163 | |
164 /* | |
165 * Pop | |
166 */ | |
167 void ScreenManager::Pop() | |
168 { | |
169 ASSERT(kStack.Size() > 0); | |
170 | |
171 Screen* pScreen = kStack.Pop(); | |
172 ASSERT(pScreen != NULL); | |
173 | |
174 pScreen->OnExit(); | |
175 | |
176 if(kStack.Size() > 0) | |
177 { | |
178 Screen* pTop = kStack.Peek(); | |
179 ASSERT(pTop != NULL); | |
180 | |
181 pTop->OnResume(); | |
182 } | |
183 | |
184 bDirty = true; | |
185 } | |
186 | |
187 /* | |
188 * IsActive | |
189 */ | |
190 bool ScreenManager::IsActive() const | |
191 { | |
192 return kStack.Size() > 0; | |
193 } |