int main() { //Print status message printf("Program Started...\n"); //=================================================================================================== // INITIALIZE HARDWARE //=================================================================================================== initialize_hardware(); // //Print Background // int i,j; // for (i=0; i<240; i++){ // for (j=0; j<320; j++){ // alt_up_pixel_buffer_dma_draw(pixel_buffer, world[i][j], j, i); // } // } //Draws the rectangle for the Game Grid (150 by 150) alt_up_pixel_buffer_dma_draw_rectangle(pixel_buffer, 149, 44, 300, 195, 0x3333, 0); alt_up_char_buffer_clear(char_buffer); alt_up_char_buffer_init(char_buffer); //=================================================================================================== //=================================================================================================== //=================================================================================================== // Game Grid and other initialization //=================================================================================================== int GameGrid[GRID_WIDTH][GRID_HEIGHT] = {0}; int UserHasQuit = 0; int GameStatus = 0; //=========================================================== //Create Player 1 struct and initialize positions struct Player Player1; Player1.CurrentPositionX = 37; Player1.CurrentPositionY = 75; Player1.PreviousPositionX = 37; Player1.PreviousPositionY = 75; Player1.DirectionX = 1; Player1.DirectionY = 0; //=========================================================== //Create Player 2 struct and initialize positions struct Player Player2; Player2.CurrentPositionX = 113; Player2.CurrentPositionY = 75; Player2.PreviousPositionX = 113; Player2.PreviousPositionY = 75; Player2.DirectionX = -1; Player2.DirectionY = 0; //=========================================================== // Sets the starting position as being filled GameGrid[Player1.CurrentPositionX][Player1.CurrentPositionY] = 1; GameGrid[Player2.CurrentPositionX][Player2.CurrentPositionY] = 1; //=================================================================================================== //=================================================================================================== //=================================================================================================== // Controls //=================================================================================================== alt_up_char_buffer_string(char_buffer, "Press Enter to Start!", 4, 40); alt_up_char_buffer_string(char_buffer, "Press 'P' to Pause", 4, 42); alt_up_char_buffer_string(char_buffer, "Player 1: RED", 4, 46); alt_up_char_buffer_string(char_buffer, "W- Up", 8, 47); alt_up_char_buffer_string(char_buffer, "S- Down", 8, 48); alt_up_char_buffer_string(char_buffer, "A- Left", 8, 49); alt_up_char_buffer_string(char_buffer, "D- Right", 8, 50); alt_up_char_buffer_string(char_buffer, "Player 2: BLUE", 4, 53); alt_up_char_buffer_string(char_buffer, "Arrow Up- Up", 8, 54); alt_up_char_buffer_string(char_buffer, "Arrow Down - Down", 8, 55); alt_up_char_buffer_string(char_buffer, "Arrow Left- Left", 8, 56); alt_up_char_buffer_string(char_buffer, "Arrow Right- Right", 8, 57); //=================================================================================================== // START GAME //=================================================================================================== while(UserHasQuit != 1){ // Function to read when user has pressed entered to start the game /* if( UserHasPressedEnter ) GameStatus = 1; */ // This is the beginning of the game while( GameStatus != 1) { //Starts the timer to read keyboard inputs until we update the player positions and collisions UpdatePlayerMovement(&Player1, &Player2); //Updating the collision detection, movement, and screen //UpdateGame(&Player1, &Player2, &GameGrid, GameStatus, pixel_buffer); } } return 0; }
bool PlayGame(Map &map, ResourceManager &resourceManager, const unsigned int livesIn) { bool nextMap(true), menu(true); SoundPlayer soundPlayer(alcGetCurrentContext()); unsigned int lives(livesIn); unsigned int specialItemScoreRequired(1000); unsigned int score(0), changedScore(score); TextRenderer textRender(resourceManager.GetTexture("text.png")); std::vector<std::string> stringVec{"Score:", "0"}; std::vector<std::string> livesVec{"Lives: ", std::to_string(lives)}; textRender.AddTextVerticalAlign(stringVec, TextRenderer::Alignment::Right, TextRenderer::Alignment::Top, 20.0f); textRender.AddTextHorizontalAlign(livesVec, TextRenderer::Alignment::Right, TextRenderer::Alignment::Bottom, 20.0f); glm::mat4 view(glm::ortho(0.0f, 40.0f, 0.0f, 30.0f, 1.0f, -1.0f)); std::vector<std::shared_ptr<VisibleObject>> objectVec; std::vector<Movement> movementVec; std::vector<std::shared_ptr<AI>> aiVec; std::vector<float> aiStateSwitchTimes; std::vector<DeadPlayers> deadPlayerVec; int level(0); int timesToChange(7); while(nextMap && !glfwWindowShouldClose(glfwGetCurrentContext())) { ++level; timesToChange = UpdateAiSwitchVec(aiStateSwitchTimes, timesToChange, level); bool playing = true; map.LoadNextMap(); GetVecFullOfObjects(objectVec, map, resourceManager, aiVec); textRender.AddTextHorizontalAlign(livesVec, TextRenderer::Alignment::Right, TextRenderer::Alignment::Bottom, 20.0f); CollisionDetection collisionDetect; collisionDetect.AddPlayersAndEnemys(objectVec); map.HideSpecialObj(); double currTime = glfwGetTime(), prevTime = glfwGetTime(), mapStartTime = glfwGetTime(), enemyKillFinish(0.0); while(playing && !glfwWindowShouldClose(glfwGetCurrentContext())) { glClear(GL_COLOR_BUFFER_BIT); if(AISwitchModes(aiVec, currTime - mapStartTime, aiStateSwitchTimes.back())) { soundPlayer.AddToPlay(*(resourceManager.GetSound("wolfhowl.ogg"))); aiStateSwitchTimes.erase(aiStateSwitchTimes.end() - 1); } if(score >= specialItemScoreRequired) specialItemScoreRequired = UpdateSpecialItem(objectVec, map, specialItemScoreRequired, resourceManager); if(enemyKillFinish != 0.0) { if(currTime >= enemyKillFinish) { UpdateEnemysDieStatus(objectVec, resourceManager); enemyKillFinish = 0.0; } } if(!deadPlayerVec.empty()) { for(auto player(deadPlayerVec.begin()); player != deadPlayerVec.end();) { if((*player).timeEnemyShouldLive <= currTime) { (*player).player->SwitchDeathVao(); (*player).player->ResetToOriginalSquare(); player = deadPlayerVec.erase(player); } else ++player; } } if(GetInput(movementVec, aiVec, map)) { if(PauseMenu(resourceManager, menu)) { playing = false; nextMap = false; break; } glfwSetTime(currTime); } for(auto & obj : objectVec) { if(obj->GetPlayer() > 0) { UpdatePlayerMovement(obj, movementVec, map, currTime - prevTime); if(obj->GetPlayer() == 1) { if(UpdateMap(obj, objectVec, map, changedScore, soundPlayer, resourceManager)) { if(enemyKillFinish == 0.0f) { enemyKillFinish = currTime; UpdateEnemysDieStatus(objectVec, resourceManager); } currTime -= 5.0; glfwSetTime(currTime); } if(score != changedScore) { UpdateScore(changedScore, textRender, stringVec); score = changedScore; if(map.HasFinished()) { playing = false; nextMap = true; } } } } obj->Draw(view); } textRender.DrawAll(); if(collisionDetect.DetectCollisions(lives, changedScore, deadPlayerVec, resourceManager, soundPlayer)) { soundPlayer.AddToPlay(*(resourceManager.GetSound("death.ogg"))); if(UpdateLives(lives, textRender, livesVec)) { playing = false; nextMap = false; UpdateHighscore(score, resourceManager); } } glfwSwapBuffers(glfwGetCurrentContext()); glfwPollEvents(); prevTime = currTime; currTime = glfwGetTime(); } } if(glfwWindowShouldClose(glfwGetCurrentContext())) nextMap = false; return menu; }