Go to the documentation of this file.00001 #include "main.h"
00002
00003 #define FREE_CAMERA 0
00004 #define CANNON 1
00005 #define BALL_FLYING 2
00006 #define MENU 3
00007 #define MENU_WAIT 4
00008 #define GAME_OVER 5
00009 #define WIN 6
00010
00011
00012 RenderListener::RenderListener(IPhysic& physic, IRender& render, Camera& camera,
00013 pMouseDevice mouse, pKeyboardDevice keyboard, const KeyboardMap& keyMap, Gui* gui, Player* player,
00014 IWindow& window, IAudio& audio)
00015 : timer(),
00016 physic(physic),
00017 render(render),
00018 camera(camera),
00019 mouse(mouse),
00020 keyboard(keyboard),
00021 gui(gui),
00022 player(player),
00023 window(window),
00024 audio(audio)
00025 {
00026 memcpy(&this->keyMap, &keyMap, sizeof(KeyboardMap));
00027 timer.init();
00028 timer.deltaf();
00029 cameraPositionTimer.init();
00030 shotTimer.init();
00031 shotTime = -1;
00032
00033
00034 gameState = FREE_CAMERA;
00035
00036
00037
00038
00039
00040 winLabelShown = false;
00041 labelShown = false;
00042 downF2 = false;
00043 downF3 = false;
00044 downF4 = false;
00045 downF5 = false;
00046 downF8 = false;
00047 downF9 = false;
00048
00049 wireframe = true;
00050 texture = true;
00051 mipmap = true;
00052 frustum = true;
00053 transparency = true;
00054 statusShown = false;
00055 fps = false;
00056
00057 }
00058
00059 RenderListener::~RenderListener()
00060 {
00061 }
00062
00063 void RenderListener::eventRender(void)
00064 {
00065 int save = -1, load = -1;
00066
00067 mouse->update();
00068 keyboard->update();
00069 float mouseDX = mouse->getDx()/1.f;
00070 float mouseDY = mouse->getDy()/1.f;
00071 int mouseDZ = int(mouse->getDz());
00072 bool mouseLeft = mouse->isDown(LEFT_MOUSE_BUTTON);
00073 bool mouseRight = mouse->isDown(RIGHT_MOUSE_BUTTON);
00074 bool mouseLeftUp = mouse->isUp(LEFT_MOUSE_BUTTON);
00075 bool mouseWheelUp = mouse->isDown(MOUSE_WHEEL_UP);
00076 bool mouseWheelDown = mouse->isDown(MOUSE_WHEEL_DOWN);
00077 bool keyA = keyboard->isDown(keyMap.keyA);
00078 bool keyD = keyboard->isDown(keyMap.keyD);
00079 bool keyS = keyboard->isDown(keyMap.keyS);
00080 bool keyW = keyboard->isDown(keyMap.keyW);
00081
00082
00083 bool keyF2 = keyboard->isDown(keyMap.keyF2);
00084 bool keyF3 = keyboard->isDown(keyMap.keyF3);
00085 bool keyF4 = keyboard->isDown(keyMap.keyF4);
00086 bool keyF5 = keyboard->isDown(keyMap.keyF5);
00087 bool keyF8 = keyboard->isDown(keyMap.keyF8);
00088 bool keyF9 = keyboard->isDown(keyMap.keyF9);
00089
00090
00091 for(int i = 0; i < 9; i++) {
00092 if(keyboard->isDown(i + keyMap.key1) && !keyboard->isDown(16)) save = i;
00093 if(keyboard->isDown(i + keyMap.key1) && keyboard->isDown(16)) load = i;
00094 }
00095
00096 bool keyGDown = keyboard->isDown(keyMap.keyG);
00097 bool keyESCDown = keyboard->isDown(keyMap.keyEsc);
00098 bool keySpace = keyboard->isDown(keyMap.keySpace);
00099 bool keyC = keyboard->isDown(keyMap.keyC);
00100 bool keyR = keyboard->isDown(keyMap.keyR);
00101 bool keyK = keyboard->isDown(keyMap.keyK);
00102
00103 bool proceedWithShot = false;
00104 float labelTime;
00105 float saveTime;
00106
00107 float dt = timer.deltaf();
00108
00109 int fpsvalue = (int)(1 / dt);
00110
00111 if(fps)
00112 gui->setFPSValue(fpsvalue);
00113
00114 float dMove = dt*7.f;
00115 float dRotate = dt*.5f;
00116
00117 float forward = ((keyW ? dMove : 0.0f) + (keyS ? -dMove : 0.0f));
00118 float right = ((keyA ? -dMove : 0.0f) + (keyD ? dMove : 0.0f));
00119
00120
00122
00123
00124
00125
00127
00128
00129
00130
00131
00132
00133
00134
00135
00136
00137
00138
00139
00140
00141
00142
00143
00144
00145
00146
00147
00148
00149
00150
00151
00152
00153
00154
00155
00156
00157
00158
00159
00160
00161
00162
00163
00164
00165
00166
00167
00168
00169
00170
00171
00172
00173
00174
00175
00176
00177
00178
00179
00180
00181
00182
00183
00184
00185
00186
00187
00188
00189
00190
00191
00192
00193
00194
00195
00196
00197
00198
00199
00200
00201
00202
00203
00204
00205
00206
00207
00208
00209
00210
00211
00212
00213
00214
00215 if(keyF2) {
00216 if(downF2 == false) {
00217 fps = !fps;
00218 if(fps) gui->showFPS();
00219 else gui->hideFPS();
00220 downF2 = true;
00221 }
00222 } else
00223 downF2 = false;
00224
00225
00226 if(keyF3){
00227 if(downF3 == false) {
00228 wireframe = !wireframe;
00229 render.setEnableWireframe(!render.getEnableWireframe());
00230 if(wireframe) gui->showStatusLabel(0);
00231 else gui->showStatusLabel(1);
00232 statusStartTime = statusLabelTimer.init();
00233 statusShown = true;
00234 downF3 = true;
00235 }
00236 }else
00237 downF3 = false;
00238
00239 if(keyF4) {
00240 if(downF4 == false) {
00241 texture = !texture;
00242 render.setEnableLinearTexture(!render.getEnableLinearTexture());
00243 if(texture) gui->showStatusLabel(2);
00244 else gui->showStatusLabel(3);
00245 statusStartTime = statusLabelTimer.init();
00246 statusShown = true;
00247 downF4 = true;
00248 }
00249 } else
00250 downF4 = false;
00251
00252 if(keyF5) {
00253 if(downF5 == false) {
00254 mipmap = !mipmap;
00255 render.setEnableMipmap(!render.getEnableMipmap());
00256 if(mipmap) gui->showStatusLabel(4);
00257 else gui->showStatusLabel(5);
00258 statusStartTime = statusLabelTimer.init();
00259 statusShown = true;
00260 downF5 = true;
00261 }
00262 } else
00263 downF5 = false;
00264
00265 if(keyF8){
00266 if(downF8 == false) {
00267 frustum = !frustum;
00268 render.setEnableCulling(!render.getEnableCulling());
00269 if(frustum) gui->showStatusLabel(6);
00270 else gui->showStatusLabel(7);
00271 statusStartTime = statusLabelTimer.init();
00272 statusShown = true;
00273 downF8 = true;
00274 }
00275 }else
00276 downF8 = false;
00277
00278 if(keyF9){
00279 if(downF9 == false) {
00280 transparency = !transparency;
00281 render.setEnableBlending(!render.getEnableBlending());
00282 if(transparency) gui->showStatusLabel(8);
00283 else gui->showStatusLabel(9);
00284 statusStartTime = statusLabelTimer.init();
00285 statusShown = true;
00286 downF9 = true;
00287 }
00288 }else
00289 downF9 = false;
00290
00291
00292
00293
00294 if(keyESCDown) {
00295 player->saveGameStatesToFiles();
00296 window.close();
00297 }
00298
00299 if(keyR) {
00300 player->restart();
00301 gameState = FREE_CAMERA;
00302 }
00303
00304 if(labelShown) {
00305 labelTime = (labelShowTimer.timef() - labelStartShowTime) / 100000000000;
00306 if(labelTime > 50) {
00307 player->resetCannonLabels();
00308 labelShown = false;
00309 }
00310 }
00311
00312 if(statusShown) {
00313 float statusTime = (statusLabelTimer.timef() - statusStartTime) / 100000000000;
00314 if(statusTime > 50) {
00315 gui->hideAllStatusLabels();
00316 statusShown = false;
00317 }
00318 }
00319
00320 if(saveShown) {
00321 saveTime = (saveShowTimer.timef() - saveStartShowTime) / 100000000000;
00322 if(saveTime > 50) {
00323 player->resetSaveLabel();
00324 player->resetCannonLabels();
00325 saveShown = false;
00326 }
00327 }
00328
00329 switch(gameState) {
00330 case FREE_CAMERA:
00331
00332 if(keyA || keyD || keyS || keyW)
00333 camera.move(forward * 3, right * 3);
00334 if(mouseDX < 0.f || 0.f < mouseDX || mouseDY < 0.f || 0.f < mouseDY)
00335 camera.rotate(mouseDY * dRotate, mouseDX * dRotate, 0.0f);
00336
00337
00338 if(mouseRight && !player->isMoving()) {
00339 gameState = CANNON;
00340 camera.setPosition(player->getCannonPosition());
00341 }
00342
00343
00344
00345
00346
00347
00348
00349
00350
00351 if(mouseDZ > 0) {
00352 player->setBallType(-2);
00353 labelStartShowTime = labelShowTimer.init();
00354 labelShown = true;
00355 } else if(mouseDZ < 0) {
00356 player->setBallType(-1);
00357 labelStartShowTime = labelShowTimer.init();
00358 labelShown = true;
00359 }
00360
00361 if(load != -1) {
00362 camera.setPosition(player->loadGameState(load, camera.getPosition()));
00363 saveStartShowTime = saveShowTimer.init();
00364 saveShown = true;
00365 }
00366 else if(save != -1) {
00367 player->saveGameState(save, camera.getPosition());
00368 saveStartShowTime = saveShowTimer.init();
00369 saveShown = true;
00370 }
00371
00372 break;
00373 case CANNON:
00374
00375 if(mouseDX < 0.f || 0.f < mouseDX || mouseDY < 0.f || 0.f < mouseDY)
00376 camera.rotate(mouseDY * dRotate, mouseDX * dRotate, 0.0f);
00377
00378
00379 if(keyGDown) {
00380 render.toggleGui();
00381 window.showCursor(true);
00382 oldGameState = CANNON;
00383 gameState = MENU;
00384 }
00385
00386 if(mouseDZ > 0) {
00387 player->setBallType(-2);
00388 labelStartShowTime = labelShowTimer.init();
00389 labelShown = true;
00390 } else if(mouseDZ < 0) {
00391 player->setBallType(-1);
00392 labelStartShowTime = labelShowTimer.init();
00393 labelShown = true;
00394 }
00395
00396
00397 if(mouseLeft && player->selectedBallAvailable()) {
00398 if(shotTime == -1) shotTime = shotTimer.init();
00399
00400 shotDeltaTime = shotTimer.timef();
00401 camera.setFieldOfView(60.0f - ((shotDeltaTime - shotTime) / 99000000000 ));
00402 if(camera.getFieldOfView() <= 15.0f) {
00403 proceedWithShot = true;
00404 }
00405 }
00406
00407
00408 if(proceedWithShot || mouseLeftUp) {
00409 if(shotTime != -1) {
00410 shotDeltaTime = shotTimer.timef();
00411 float3 vec;
00412 vec = camera.getDirection();
00413 vec(0) *= (shotDeltaTime - shotTime) / 40000000000;
00414 vec(1) *= (shotDeltaTime - shotTime) / 40000000000;
00415 vec(2) *= (shotDeltaTime - shotTime) / 40000000000;
00416 player->applyForce(vec);
00417 cameraStartTime = cameraPositionTimer.timef();
00418 oldCannonPosition = player->getMovingCannonPosition(false);
00419
00420
00421 gameState = BALL_FLYING;
00422 shotTime = -1;
00423 proceedWithShot = false;
00424 camera.setFieldOfView(60.0f);
00425 }
00426 }
00427
00428 break;
00429 case BALL_FLYING:
00430
00431 if(mouseDX < 0.f || 0.f < mouseDX || mouseDY < 0.f || 0.f < mouseDY)
00432 camera.rotate(mouseDY * dRotate, mouseDX * dRotate, 0.0f);
00433
00434
00435 if(player->checkWinCondition()) {
00436 gameState = WIN;
00437 }
00438
00439
00440 player->checkForLevelObjects();
00441
00442
00443 if(player->isMoving()) {
00444 float3 pos = player->getMovingCannonPosition(mouseLeft);
00445 float3 camPos;
00446 float3 distance = pos - oldCannonPosition;
00447 distance.normalize();
00448 camPos(0) = pos(0) - distance(0) * 5.0f;
00449 camPos(1) = (pos(1) - distance(1) * 5.0f) + 1.5f;
00450 camPos(2) = pos(2) - distance(2) * 5.0f;
00451 camera.setPosition(camPos);
00452 } else {
00453
00454 gameState = player->outOfBalls() ? GAME_OVER : FREE_CAMERA;
00455 }
00456
00457 if(player->getSelectedBall() == EXPLOSIVE_BALL && keySpace) {
00458 float3 pos = player->getMovingCannonPosition(false);
00459 physic.createExplosion(pos);
00460 player->playExplosionSound();
00461 if(player->getCurrentLevel() != 0) {
00462 player->explosion();
00463 gameState = player->outOfBalls() ? GAME_OVER : FREE_CAMERA;
00464 }
00465 }
00466
00467 break;
00468
00469 case MENU:
00470 break;
00471 case MENU_WAIT:
00472 if(mouseDX < 0.f || 0.f < mouseDX || mouseDY < 0.f || 0.f < mouseDY)
00473 camera.rotate(mouseDY * dRotate, mouseDX * dRotate, 0.0f);
00474
00475 menuNowTime = (menuClosedTimer.timef() - menuClosedTime) / 100000000000;
00476 if(menuNowTime > 10) {
00477 gameState = oldGameState;
00478 }
00479 break;
00480 case GAME_OVER:
00481
00482 break;
00483 case WIN:
00484 break;
00485 }
00486
00487
00488 gui->update();
00489 float3 velocity;
00490 for(int i = 0; i < 3; i++) { velocity[i] = 0.0f; }
00491 audio.listener(camera.getPosition(), velocity, camera.getDirection());
00492 audio.update();
00493 physic.update(dt);
00494 render.update(camera);
00495 }
00496
00497 void RenderListener::eventPaint(void)
00498 {
00499 }
00500
00501 void RenderListener::guiInstanceCallback(pIControl source)
00502 {
00503 if(wcscmp(source->getName(),TEXT("close")) == 0) {
00504
00505
00506 } else if(wcscmp(source->getName(),TEXT("fast")) == 0) {
00507 player->setBallType(0);
00508 } else if(wcscmp(source->getName(),TEXT("strong")) == 0) {
00509 player->setBallType(1);
00510 } else if(wcscmp(source->getName(),TEXT("explosive")) == 0) {
00511 player->setBallType(2);
00512 }
00513
00514
00515
00516
00517 render.toggleGui();
00518 gameState = MENU_WAIT;
00519 window.showCursor(false);
00520 menuClosedTime = menuClosedTimer.init();
00521 }
00522
00523 void RenderListener::guiCallback(pIControl source)
00524 {
00525 m_instance->guiInstanceCallback(source);
00526 }
00527