• Main Page
  • Namespaces
  • Classes
  • Files
  • File List
  • File Members

src/cannonball/src/RenderListener.cpp

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         //menuToggled = false;
00036         //menuWait = false;
00037         //cameraMode = 0;
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         //DEBUG keys
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         //16 scheint Shift zu sein (beide) und nicht keyMap.keyShift[L|R]
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         //printf("fps: %d\n", fps);
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         //if(cameraMode == 0)
00124         //      if(keyA || keyD || keyS || keyW)
00125         //              camera.move(forward, right);
00127         //if(!menuToggled)
00128         //      if(mouseDX < 0.f || 0.f < mouseDX || mouseDY < 0.f || 0.f < mouseDY)
00129         //              camera.rotate(mouseDY * dRotate, mouseDX * dRotate, 0.0f);
00130 
00131         //if(keyGDown && !menuToggled) {
00132         //      render.toggleGui();
00133         //      window.showCursor(true);
00134         //      menuToggled = true;
00135         //}
00136 
00137 
00138 
00139         //if(mouseRight && !player->isMoving()) {
00140         //      cameraMode = 1;
00141         //      camera.setPosition(player->getCannonPosition());
00142         //}
00143 
00144         //if(!winLabelShown && player->checkWinCondition()) {
00145         //      //gui->addControl(m_winLabel);
00146         //      render.toggleGui();
00147         //      menuToggled = true;
00148         //      window.showCursor(true);
00149         //      winLabelShown = true;
00150         //}
00151 
00152 
00153         //if(cameraMode == 1 && !menuToggled  && !menuWait && mouseLeft) {
00154         //      if(shotTime == -1) shotTime = shotTimer.init();
00155 
00156         //      shotDeltaTime = shotTimer.timef();
00157         //      camera.setFieldOfView(60.0f - ((shotDeltaTime - shotTime) / 99000000000 ));
00158         //      if(camera.getFieldOfView() <= 15.0f) {
00159         //              proceedWithShot = true;
00160         //      }
00161         //}
00162 
00163         //if(proceedWithShot || (cameraMode == 1 && mouseLeftUp)) {
00164         //      if(shotTime != -1) {
00165         //              shotDeltaTime = shotTimer.timef();
00166         //              float3 vec;
00167         //              vec = camera.getDirection();
00168         //              vec(0) *= (shotDeltaTime - shotTime) / 20000000000;
00169         //              vec(1) *= (shotDeltaTime - shotTime) / 20000000000;
00170         //              vec(2) *= (shotDeltaTime - shotTime) / 20000000000;
00171         //              player->applyForce(vec);
00172         //              cameraStartTime = cameraPositionTimer.timef();
00173         //              oldCannonPosition = player->getMovingCannonPosition();
00174 
00175         //              //Reset for next shot
00176         //              cameraMode = 0;
00177         //              shotTime = -1;
00178         //              proceedWithShot = false;
00179         //              camera.setFieldOfView(60.0f);
00180         //      }
00181         //}
00182         //
00183         //if(menuWait) {
00184         //      menuNowTime = (menuClosedTimer.timef() - menuClosedTime) / 100000000000;
00185         //      if(menuNowTime > 10) {
00186         //              menuWait = false;
00187         //      }
00188         //}
00189 
00190         //if(player->isMoving()) {
00191         //      float3 pos = player->getMovingCannonPosition();
00192         //      float3 camPos;
00193         //      float3 distance = pos - oldCannonPosition;
00194         //      distance.normalize();
00195         //      camPos(0) = pos(0) - distance(0) * 5.0f;
00196         //      camPos(1) = pos(1) - distance(1) * 5.0f;
00197         //      camPos(2) = pos(2) - distance(2) * 5.0f;
00198         //      camera.setPosition(camPos);
00199         //}
00200 
00201         /*if(player->isMoving()) {
00202                 cameraCurrentTime = cameraPositionTimer.timef();
00203 
00204                 if(((cameraCurrentTime - cameraStartTime) / 100000000000) > 10) {
00205                         camera.setPosition(oldCannonPosition);
00206                         oldCannonPosition = player->getMovingCannonPosition();
00207                         cameraStartTime = cameraPositionTimer.timef();
00208                 }
00209 
00210         }*/
00211         
00212         //DEBUG Keys
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         //end DEBUG keys
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                         //Move camera
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                         //Go to cannon position
00338                         if(mouseRight && !player->isMoving()) {
00339                                 gameState = CANNON;
00340                                 camera.setPosition(player->getCannonPosition());
00341                         }
00342                         
00343                         //Check for menu key
00344                         //if(keyGDown) {
00345                         //      render.toggleGui();
00346                         //      window.showCursor(true);
00347                         //      oldGameState = FREE_CAMERA;
00348                         //      gameState = MENU;
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                         //Change View
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                         //Check for menu key
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                         //Check for click Start
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                         //Shot cannonball
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                                         //Reset for next shot
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                         //Change View
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                         //Check if tarket was hit and start next level
00435                         if(player->checkWinCondition()) {
00436                                 gameState = WIN;
00437                         }
00438 
00439                         //Check if player collected an item
00440                         player->checkForLevelObjects();
00441 
00442                         //Move Camera after ball
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                                 //player->resetOtherCannonBalls();
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                         //TODO: show Game Over screen
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                 //render.toggleGui();
00505                 //menuToggled = false;
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         //menuToggled = false;
00516         //menuWait = true;
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 

Generated on Fri Jun 18 2010 17:48:39 for Cannonball by  doxygen 1.7.0