source: GTP/trunk/App/Games/Jungle_Rumble/src/GameManager.cpp @ 1390

Revision 1390, 12.1 KB checked in by giegl, 18 years ago (diff)

GTPD - Jungle Rumble - F1 freezes gameplay

Line 
1#include "dxstdafx.h"
2#include ".\GameManager.h"
3#include "fmod.h"
4#include "RaytraceRenderer.h"
5#include "Object3d.h"
6#include "SoundNode.h"
7#include "Goodie.h"
8#include "Box.h"
9#include "HUD.h"
10#include "ParticleGroup.h"
11#include "ParticleEmitter.h"
12#include "Sprite.h"
13
14
15bool GLOBAL_display_help_screenQ = false;
16
17
18GameManager::GameManager(void)
19{
20        this->consoleStarted = false;
21        this->activeScene=0;
22
23        // Create the physics SDK
24        this->pOutputStream.manager = this;
25        this->pAllocator = new UserAllocator();
26        this->pPhysicsSDK = NxCreatePhysicsSDK(NX_PHYSICS_SDK_VERSION, this->pAllocator, &this->pOutputStream);
27        if (!this->pPhysicsSDK){
28                this->pPhysicsSDK = NULL;
29                this->printToConsole("PhysicsSDK building failed!");
30                MessageBox(NULL, L"Could not create PhysX instance! Maybe the drivers are not installed properly!", L"Error with PhysX Engine!", MB_ICONERROR);
31                exit(0);
32        }
33
34        //create ResourceManager
35        this->resManager.setGameManager(this);
36        this->firstFrame = true;
37        this->fadeEffect = NULL;
38        this->gs.setSceneAlpha(0);
39
40        for(int i=0;i<this->NB_EFFECTS;i++) {
41                this->effectList[i] = NULL;
42                this->effectReleaseCount[i] = 0;
43        }
44}
45
46GameManager::~GameManager(void)
47{
48        this->pPhysicsSDK->release();
49        this->pPhysicsSDK=NULL;
50        if(this->pAllocator)
51                delete this->pAllocator;
52        this->pAllocator = NULL;
53        SAFE_RELEASE(this->finalRenderTarget);
54
55        for(int i=0;i<this->NB_EFFECTS;i++) {
56                if(this->effectList[i]) {
57                        SAFE_RELEASE(this->effectList [i]);
58                }
59        }
60}
61
62void GameManager::setScreenDimension(int width, int height)
63{
64        this->screenWidth = width;
65        this->screenHeight = height;
66}
67
68
69std::wstring GameManager::HelpScreenString_Get()
70{
71        std::wstring s;
72        s += L"HELP:\n drive: w-a-s-d\n shoot: left mouse\n F2: show FPS\n F3: PhysX Debugger\n F4: Music On/Off";
73       
74        s += L"\n F9: Depth Imposters On/Off ";
75        if(this->gs.useDepthImposter) { s+= L"[ON]"; } else { s+= L"[OFF]"; }
76       
77        s += L"\n F10: Raytracer On/Off ";
78        if(this->gs.useRaytracer) { s+= L"[ON]"; } else { s+= L"[OFF]"; }
79       
80        s += L"\n F11 Opponent Fire On/Off\n Pause: Pause Game\n 1 Standard weapon\n 2 Bombs - explode late, but do cause lots of damage!\n 3 Alien weapon - just shoot!\n 4 Firethrower - Toast your opponent\n 5 Icethrower - Slow down your opponent";
81        return s;
82}
83
84
85void GameManager::keyPressed(UINT nChar, bool bKeyDown, bool bAltDown, void* pUserContext)
86{
87        if( bKeyDown )
88    {
89                //if(nChar == VK_PAUSE || nChar == VK_F9 || nChar == VK_F10 || !this->gs.preparepaused) {
90                        switch( nChar )
91                        {
92                                case VK_ESCAPE:
93                                        break;
94                                case VK_F1:
95                                        if(activeScene == &this->gs) {
96                                                #if(0)
97                                                        this->gs.getHUD()->message("HELP:\n drive: w-a-s-d\n shoot: left mouse\n F2: show FPS\n F3: PhysX Debugger\n F4: Music On/Off\n F9: Depth Imposters On/Off\n F10: Raytracer On/Off\n F11 Opponent Fire On/Off\n Pause: Pause Game\n 1 Standard weapon\n 2 Bombs - explode late, but do cause lots of damage!\n 3 Alien weapon - just shoot!\n 4 Firethrower - Toast your opponent\n 5 Icethrower - Slow down your opponent", 2, 0.01f, true);
98                                                #elif(0) // MG
99                                                        std::string s("");
100                                                        s += "HELP:\n drive: w-a-s-d\n shoot: left mouse\n F2: show FPS\n F3: PhysX Debugger\n F4: Music On/Off";
101                                                       
102                                                        s += "\n F9: Depth Imposters On/Off ";
103                                                        if(this->gs.useDepthImposter) { s+= "[ON]"; } else { s+= "[OFF]"; }
104                                                       
105                                                        s += "\n F10: Raytracer On/Off ";
106                                                        if(this->gs.useRaytracer) { s+= "[ON]"; } else { s+= "[OFF]"; }
107                                                       
108                                                        s += "\n F11 Opponent Fire On/Off\n Pause: Pause Game\n 1 Standard weapon\n 2 Bombs - explode late, but do cause lots of damage!\n 3 Alien weapon - just shoot!\n 4 Firethrower - Toast your opponent\n 5 Icethrower - Slow down your opponent";
109                                                        this->gs.getHUD()->message(s, 2, 0.01f, true);
110                                                #elif(1) // MG
111                                                        // Toggle help with F1
112                                                        GLOBAL_display_help_screenQ = !GLOBAL_display_help_screenQ;
113                                                        if(GLOBAL_display_help_screenQ) {
114                                                                this->gs.preparepaused = true;
115                                                        }
116                                                        else {
117                                                                this->gs.preparepaused= false;
118                                                                this->gs.currentlypaused = false;
119                                                                this->gs.getHUD()->message("", 1, 0.01f);
120                                                        }
121                                                #endif
122                                        }
123                                        break;
124                                case VK_F2:
125                                        this->gs.showFPS = !this->gs.showFPS;
126                                        break;
127                                case VK_F3:
128                                        if(!this->activeScene->usePhysXDebugger)
129                                                this->activeScene->usePhysXDebugger = true;
130                                        else
131                                                this->activeScene->usePhysXDebugger = false;
132                                        break;
133                                case VK_F4:
134                                        this->gs.setBackgroundSoundMute(!this->gs.getBackgroundSoundMute());
135                                        this->ms.setBackgroundSoundMute(!this->ms.getBackgroundSoundMute());
136                                        break;
137                                case VK_F5:
138                                        //this->gs.getHUD()->displayToasted(3, 0.01f);
139                                        break;
140                                case VK_F6:
141                                        //this->gs.getHUD()->message("hallo martin", 3, 0.01f);
142                                        break;
143                                case VK_F7:
144                                        //this->gs.getHUD()->displayLose(3, 0.01f);
145                                        break;
146                                case VK_F8:
147                                        this->gs.drawBBoxes = !this->gs.drawBBoxes;
148                                        break;
149                                case VK_F9:
150                                        this->gs.useDepthImposter = !this->gs.useDepthImposter;
151                                        break;
152                                case VK_F10:
153                                        this->gs.useRaytracer = !this->gs.useRaytracer;
154                                        break;
155                                case VK_F11:
156                                        this->gs.aiPlayerFireEnable = !this->gs.aiPlayerFireEnable;
157                                        break;
158                                case VK_PAUSE:
159                                        if(activeScene == &this->gs) {
160                                                if(!this->gs.preparepaused) {
161                                                        this->gs.getHUD()->message("Game paused. Press Pause to Continue...", 1, 0.01f);
162                                                } else {
163                                                        this->gs.currentlypaused = false;
164                                                        this->gs.getHUD()->message("", 1, 0.01f);
165                                                }
166                                                this->gs.preparepaused= !this->gs.preparepaused;
167                                        }
168                                        break;
169                        }
170                //}
171
172        }
173        this->activeScene->setKeyPressed(nChar, bKeyDown);
174}
175
176void GameManager::setMouseStatus(bool bLeftButtonDown,  bool bRightButtonDown,bool bMiddleButtonDown,
177                                                          bool bSideButton1Down, bool bSideButton2Down, int nMouseWheelDelta,
178                                                          int xPos, int yPos)
179{
180        this->activeScene->setMouseStatus(bLeftButtonDown, bRightButtonDown, bMiddleButtonDown, bSideButton1Down, bSideButton2Down, nMouseWheelDelta, xPos, yPos);
181}
182
183void GameManager::addScene(Scene &newScene)
184{
185        if(this->activeScene==0) {
186                this->activeScene = &newScene;
187        }
188        this->sceneVector.push_back(&newScene);
189}
190
191void GameManager::removeScene(Scene &oldScene)
192{
193        std::vector<Scene*>::iterator it;
194       
195        bool found = false;
196        int index = 0;
197        for(it=this->sceneVector.begin();it!=this->sceneVector.end();it++) {
198                if(&oldScene == *it) {
199                        found = true;
200                        break;
201                }
202                index++;
203        }
204}
205
206void GameManager::setActiveScene(Scene &aScene)
207{
208        this->activeScene = &aScene;
209}
210
211void GameManager::printToConsole(std::string output)
212{
213        #if defined(DEBUG) | defined(_DEBUG)
214        if (!consoleStarted) {
215        AllocConsole();
216                outputHandle = GetStdHandle(STD_OUTPUT_HANDLE);
217                consoleStarted = true;
218        }
219        output += "\n";
220        DWORD dwCharsWritten;
221        WriteConsoleA(outputHandle, output.c_str(), output.length(), &dwCharsWritten, NULL);
222        #endif
223}
224
225void GameManager::initGame() {
226        ms.initScene(*this);
227        //add menue scene to scene vector:
228        ms.setVisible(true);
229        ms.setSceneAlpha(0);
230        this->addScene(ms);
231        gs.setVisible(false);
232        this->addScene(gs);
233        this->setActiveScene(ms);
234}
235
236void GameManager::updateGame(float fElapsedTime)
237{
238        FSOUND_Update();
239       
240        if(this->firstFrame) {
241                this->firstFrame = false;
242                this->ms.setSceneAlpha(0);
243                this->ms.fadeIn(1);
244        }
245        this->device->SetRenderState(D3DRS_ALPHABLENDENABLE, FALSE);
246        this->device->Clear(0, NULL, D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER, D3DCOLOR_ARGB(0, 0, 0, 0), 1.0f, 0);
247       
248        UINT numberOfScenes = (UINT)this->sceneVector.size();
249        for(UINT i = 0; i < numberOfScenes; i++) {
250                this->sceneVector.at(i)->renderScene(fElapsedTime);
251        }
252
253        this->device->SetRenderTarget(0, this->finalRenderTarget);
254        this->device->SetRenderState(D3DRS_ALPHABLENDENABLE, TRUE);
255        this->device->SetRenderState(D3DRS_ZENABLE, D3DZB_FALSE);
256        this->device->SetRenderState(D3DRS_ZWRITEENABLE, FALSE);
257        this->device->SetRenderState(D3DRS_DESTBLEND, D3DBLEND_DESTALPHA);
258        this->device->SetRenderState(D3DRS_SRCBLEND, D3DBLEND_SRCALPHA);
259
260        for(UINT i = 0; i < numberOfScenes; i++) {
261                if(this->sceneVector.at(i)->isVisible()) {
262                        this->sceneVector.at(i)->renderFinalImage(this->fadeEffect);
263                }
264        }
265
266        this->device->SetRenderState(D3DRS_ZWRITEENABLE, TRUE);
267        this->device->SetRenderState(D3DRS_ZENABLE, D3DZB_TRUE);
268        this->device->SetRenderState(D3DRS_ALPHABLENDENABLE, FALSE);
269}
270
271
272void GameManager::OnLostDevice( void* pUserContext )
273{
274        SAFE_RELEASE(this->finalRenderTarget);
275        this->resManager.OnLostDevice();
276        std::vector<Scene *>::iterator it;
277        for(it=this->sceneVector.begin();it!=this->sceneVector.end();it++) {
278                (*it)->OnLostDevice(pUserContext);
279        }
280}
281
282void GameManager::OnDestroyDevice( void* pUserContext )
283{
284        this->resManager.OnDestroyDevice();
285        this->releaseEffect(this->fadeEffect);
286        this->fadeEffect = NULL;
287        std::vector<Scene *>::iterator it;
288        for(it=this->sceneVector.begin();it!=this->sceneVector.end();it++) {
289                (*it)->OnDestroyDevice(pUserContext);
290        }
291
292        for(int i=0;i<this->NB_EFFECTS;i++) {
293                if(this->effectList[i] != NULL) {
294                        this->printToConsole("WARNING! Not all Effects released!!");
295                }
296        }
297}
298
299HRESULT GameManager::OnCreateDevice( IDirect3DDevice9* pd3dDevice, const D3DSURFACE_DESC* pBackBufferSurfaceDesc, void* pUserContext )
300{
301        this->device = pd3dDevice;
302        return S_OK;
303}
304
305
306HRESULT GameManager::OnResetDevice( IDirect3DDevice9* pd3dDevice, const D3DSURFACE_DESC* pBackBufferSurfaceDesc, void* pUserContext )
307{
308        this->screenWidth = pBackBufferSurfaceDesc->Width;
309        this->screenHeight = pBackBufferSurfaceDesc->Height;
310
311        this->device = pd3dDevice;
312        this->device->GetRenderTarget(0, &this->finalRenderTarget);
313        this->fadeEffect = this->loadEffect(GameManager::EFFECT_FADE, L"shaders/sceneFader.obj");
314
315        std::vector<Scene *>::iterator it;
316        for(it=this->sceneVector.begin();it!=this->sceneVector.end();it++) {
317                (*it)->OnResetDevice(pd3dDevice, pBackBufferSurfaceDesc, pUserContext );
318        }
319       
320        return S_OK;
321}
322
323ID3DXEffect* GameManager::getEffect(UINT id)
324{
325        if(id<0 || id>=this->NB_EFFECTS)
326                return NULL;
327        ID3DXEffect* effect = this->effectList[id];
328        if(effect) {
329                this->effectReleaseCount[id]++;
330        }
331        return effect;
332}
333
334void GameManager::releaseEffect(ID3DXEffect* effect)
335{
336}
337
338ID3DXEffect* GameManager::loadEffect(UINT id, LPCWSTR filename) {
339        ID3DXEffect* effect;
340
341        if(!this->effectList[id]) {
342                DWORD dwShaderFlags = D3DXSHADER_PREFER_FLOW_CONTROL | D3DXSHADER_SKIPOPTIMIZATION;
343                #ifdef DEBUG_VS
344                        dwShaderFlags |= D3DXSHADER_FORCE_VS_SOFTWARE_NOOPT;
345                #endif
346                #ifdef DEBUG_PS
347                        dwShaderFlags |= D3DXSHADER_FORCE_PS_SOFTWARE_NOOPT;
348                #endif
349
350                // Read the D3DX effect file
351                ID3DXBuffer* errBuff = NULL;
352                if (FAILED(D3DXCreateEffectFromFile( DXUTGetD3DDevice(),filename, NULL, NULL, dwShaderFlags,
353                        NULL, &effect, &errBuff )))
354                {
355                        int BufSize = errBuff->GetBufferSize();
356
357                        // displaying error message of arbitrary length
358                        wchar_t* wbuf = new wchar_t[BufSize];
359                        mbstowcs( wbuf, (const char*)errBuff->GetBufferPointer(), BufSize );
360                        MessageBox(NULL, wbuf, L".fx Compilation Error", MB_ICONERROR);         // show error message
361
362                        delete wbuf;
363                        exit(-1);
364                } else {
365                        this->effectList[id] = effect;
366                        this->effectReleaseCount[id]++;
367                }
368                return effect;
369        } else {
370                this->effectReleaseCount[id]++;
371                return this->effectList[id];
372        }
373}
374
375
376void GameManager::switchToMenueScene() {
377        ms.activateStandardBackground();
378        ms.getGUI()->SetVisible(true);
379        gs.fadeOut(1);
380        ms.fadeIn(1);
381        setActiveScene(this->ms);
382        //show mouse cursor:
383        ShowCursor(true);
384        this->gs.currentlypaused = false;
385        this->gs.preparepaused = false;
386}
387
388void GameManager::switchToGameScene() {
389        if (gs.alreadyUsed) {
390
391                //make menue scene invisible:
392                ms.fadeOut(1);
393                gs.setSceneAlpha(0);
394                gs.fadeIn(1);
395               
396                //make the gamescene active:
397                setActiveScene(this->gs);
398
399                //hide mouse cursor:
400                ShowCursor(false);
401
402                this->gs.currentlypaused = false;
403                this->gs.preparepaused = false;
404        }
405}
406
407void GameManager::OnGUIEvent( UINT nEvent, int nControlID, CDXUTControl* pControl, void* pUserContext )
408{
409        this->activeScene->OnGUIEvent(nEvent, nControlID, pControl, pUserContext);
410}
Note: See TracBrowser for help on using the repository browser.