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 }