void CMazeGameEngine::evolveWorld() { if (_isNextLevelRequested) { startNextLevel(); } if (menu.isMenuShowing() || !_worldModel.isWorldInitialized()) { //world is not initialized yet, or menu is showing - no need to evolve. return; } float deltaT = getTimeFromPreviousFrame(); if (deltaT > 0.3) //This probably happened because of a spike drop in framerate, ignore this long frame time. { //if it happend due to the FPS droping to 3, the game is not playable anyway... LOG(DEBUG) << "Skipped frame, it was too late"; return; } if (deltaT < _minTimeBetweenFrames) //I want max 60 FPS { _device->sleep((_minTimeBetweenFrames - deltaT) * 1000.0f); deltaT = getTimeFromPreviousFrame(); } _worldModel.evolve(deltaT); for (auto & playerView : _playerViews) playerView.update(0); _camera.evolve(deltaT); if (_worldModel.isMazeGameWon() && !isWinScreenShowing) { showWinScreen(); } }
void Game::prepareNextLevel() { GameState::getInstance()->setLevel(GameState::getInstance()->getLevel() + 1); if (GameState::getInstance()->getLevel() > GameState::getInstance()->getNumberOfLevels()) { setState(END); return; } if (GameState::getInstance()->isLevelBonusLevel(GameState::getInstance()->getLevel())) { setState(BONUS_LEVEL_OR_SHOP); } else { startNextLevel(); } }
void GameDisplay::timerTracking() { //SUN DISAPPEARING TIMERS for(int i=0;i<sunVector.size();i++) { if(sunVector[i]->timeEllapsed()>7500&&sunVector[i]->getX()!=-1) { scene()->removeItem(sunVector[i]); sunVector[i]->setClicked(); } } //CHECKS IF LEVEL IS COMPLETE if(zombieVector.size()==levelSequenceNumber[getCurrentLevel()-1].size()) { for(int i=0;i<zombieVector.size();i++) { if(zombieVector[i]->getLife()<=0) { levelComplete=true; } else { levelComplete=false; break; } } } if(levelComplete)//SET THE GAME PARAMETERS FOR NEXT LEVEL { zombieIndex=0; zombiesFinished=true; levelComplete=false; zombieVector.clear(); plantVector.clear(); bulletVector.clear(); sunVector.clear(); lawnmowerVector.clear(); emit startNextLevel();//this signals the next level to start } }
void Game::logic() { pollMusic(); switch (mState) { case SPLASHSCREEN: mSplashScreen->logic(); if (mSplashScreen->isDrawingDone()) { clear_keybuf(); setState(MENU); } break; case BONUS_LEVEL_OR_SHOP: mLevel->logic(); if (mOptionalDialog->getState() == OptionalDialog::NONE && !mOptionalDialog->isVisible() && !mDialog->isVisible()) { mOptionalDialog->setVisible(true); } else if (!mDialog->isVisible() && mOptionalDialog->getState() == OptionalDialog::SHOP) { setState(SHOP); } else if (!mDialog->isVisible() && mOptionalDialog->getState() == OptionalDialog::BONUS_LEVEL) { startNextLevel(); } break; case HIGH_SCORE: case SHOP: case MENU: break; case LEVEL: mLevel->logic(); if (mLevel->isGameOver()) { setState(HIGH_SCORE); } else if (mLevel->isLevelComplete()) { std::cout << "LEVEL COMPLETE" << std::endl; prepareNextLevel(); } else if (mLevel->isQuit()) { setState(MENU); } break; case END: mEnding->logic(); if (mEnding->isDone()) { setState(HIGH_SCORE); } break; case PAUSE: break; case EXIT: break; default: throw DBSH07_EXCEPTION("Unknown game state."); } mGui->logic(); if (key[KEY_F10]) { setState(EXIT); } if (key[KEY_P] && !mPauseButtonPressed && mState == PAUSE) { setState(LEVEL); } else if (key[KEY_P] && !mPauseButtonPressed && mState == LEVEL) { setState(PAUSE); } mPauseButtonPressed = key[KEY_P] != 0; }