/* This methods is performing runtime logic */ void GameController::runGame(CInputManager inputManager, CLoopTimer loopTimer, unsigned long score, CollisionDetector collisionDetector, FoodProvider foodProvider, DrawEngine drawEngine) { //Draws gamearea drawEngine.drawGameArea(); //Reset score drawEngine.updateScore(score); loopTimer.Start(); int key = 0; Snake snake; //Init snake snake.initialize(drawEngine.getWindownWidth()/2, drawEngine.getWindowHeight()/2); //Getting initial foodlist vector<Cell> &foodList = foodProvider.provideFood(snake, drawEngine.getWindownWidth(), drawEngine.getMenuBorderHeight()); //Ouput game loop while(static_cast<char>(key) != 'Q') { //Inner gameloop ONE - waiting for keyinput while(!inputManager.GetNextKeyUpper(&key)) { //Sleep loopTimer.SleepUntilUpdate(); //Move Cell lastCell = snake.getLastCell(); snake.move(); //Performing standard runtimeChecks if(performGameRuntimeChecks(inputManager,score, collisionDetector, drawEngine, key, snake, foodList, foodProvider, lastCell) ) return; }//END inner game loop ONE //Inner game loop TWO - Pause function while(static_cast<char>(key) == 'P') { while(true) { loopTimer.SleepUntilUpdate(); //Any key hit, returns to game if(inputManager.GetNextKeyUpper(&key)) break; } }//END inner game loop TWO Cell lastCell = snake.getLastCell(); //Key pressed, changes direction switch(key) { case c_iKEY_ARROWUP: snake.up(); break; case c_iKEY_ARROWDOWN: snake.down(); break; case c_iKEY_ARROWLEFT: snake.left(); break; case c_iKEY_ARROWRIGHT: snake.right(); break; default: snake.move(); } //Performing standard runtimeChecks if(performGameRuntimeChecks(inputManager,score, collisionDetector, drawEngine, key, snake, foodList, foodProvider, lastCell) ) return; } }