//Player Update method void Player::Update(float deltaTime, SDL_Renderer *renderer) { //Adjust position floats based on speed, direction of joystick axis and deltaTime pos_X += (speed * xDir) * deltaTime; pos_Y += (speed * yDir) * deltaTime; //update player position with code to account for precision loss posRect.x = (int)(pos_X + 0.5f); posRect.y = (int)(pos_Y + 0.5f); if(posRect.x < 0) { posRect.x = 0; pos_X = posRect.x; } if(posRect.x > 1024 - posRect.w) { posRect.x = 1024 - posRect.w; pos_X = posRect.x; } if(posRect.y < 0) { posRect.y = 0; pos_Y = posRect.y; } if(posRect.y > 768 - posRect.h) { posRect.y = 768 - posRect.h; pos_Y = posRect.y; } //Update the player's bullets for (int i = 0; i < bulletList.size(); i++) { //check to see if the bullet is active if(bulletList[i].active){ //Update bullet bulletList[i].Update(deltaTime); } } //should score be updated? if (playerScore != oldScore) { UpdateScore(renderer); } //should lives be updated? if (playerLives != oldLives) { UpdateLives(renderer); } }
void Player::Update(float deltaTime, SDL_Renderer *renderer) { pos_X+=(speed*xDir)*deltaTime; pos_Y+=(speed*yDir)*deltaTime; posRect.x=(int)(pos_X+0.5f); posRect.y=(int)(pos_Y+0.5f); if(posRect.x<0) { posRect.x=0; pos_X=posRect.x; } if(posRect.x>1024-posRect.w){ posRect.x=1024-posRect.w; pos_X=posRect.x; } if(posRect.y<0) { posRect.y=0; pos_Y=posRect.y; } if(posRect.y>768-posRect.h){ posRect.y=768-posRect.h; pos_Y=posRect.y; } for (int i = 0; i < bulletList.size(); i++) { if (bulletList[i].active) { bulletList[i].Update(deltaTime); } } if(playerScore != oldScore) { UpdateScore(renderer); } if (playerLives != oldLives) { UpdateLives(renderer); } }
/** Handle a key press event. */ void HandleKeyPressEvent(XKeyEvent *event) { if(event->keycode == keyRight || event->keycode == keyL) { moveRight = 1; } else if(event->keycode == keyLeft || event->keycode == keyJ) { moveLeft = 1; } else if(event->keycode == keyESC) { shouldExit = 1; } else if(event->keycode == keySpace) { if(isPaused) { isPaused = 0; } else { isPaused = 1; } SetPaused(isPaused); } else if(event->keycode == keyBackspace) { EraseBall(); UpdateLives(-1); SetBallForRestart(); didDie = 1; } }
Player::Player(SDL_Renderer *renderer,int pNum,string filePath,string audioPath,float x,float y) { active = true; playerNum = pNum; speed=500.0f; laser = Mix_LoadWAV((audioPath + "/lazer.wav").c_str()); //init for score and lives var oldScore=0; playerScore=0; oldLives=0; playerLives=3; TTF_Init(); font = TTF_OpenFont((audioPath + "/Comic.ttf").c_str(), 40); if(playerNum==0){ scorePos.x=scorePos.y=10; livesPos.x=10; livesPos.y=40; }else{ scorePos.x=650; scorePos.y=10; livesPos.x=650; livesPos.y=40; } //update score method UpdateScore(renderer); UpdateLives(renderer); if(playerNum==0){ playerpath = filePath + "/Player1.png"; }else{ playerpath = filePath + "/Player2.png"; } surface = IMG_Load(playerpath.c_str()); texture = SDL_CreateTextureFromSurface(renderer,surface); SDL_FreeSurface(surface); posRect.x=x; posRect.y=y; int w,h; SDL_QueryTexture(texture,NULL,NULL,&w,&h); posRect.w=w; posRect.h=h; pos_X=x; pos_Y=y; xDir=0; yDir=0; string bulletPath; if (playerNum == 0) { bulletPath = filePath + "/bullet.png"; } else { bulletPath = filePath + "/bullet2.png"; } for (int i = 0; i < 10; i++) { Bullet tmpBullet(renderer, bulletPath, -1000, -1000); bulletList.push_back(tmpBullet); } }
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; }
void CPlayer::Update(CMap* Map) { int TilePos = 0; m_VelX = 5; m_VelY = 30; m_bScoreChanged = false; m_bLivesChanged = false; m_bCoinsChanged = false; m_bTouchesGround = false; //x axis first (--) if(m_bRight == true) { if (m_State != "JUMPING") { m_State = "WALKING_RIGHT"; } else { m_State = "JUMPING"; } if(Collision_Ver(m_PosX + m_Width + m_VelX, m_PosY, TilePos, Map) == 1) { m_PosX = (TilePos * Tile.GetSize()) - m_Width; Mix_PlayChannel(-1,cBlockhit,0); } else if (Collision_Ver(m_PosX + m_Width + m_VelX, m_PosY, TilePos, Map) == 2) { m_PosX = (TilePos * Tile.GetSize()) - m_Width; Mix_PlayChannel(-1,cBlockhit,0); } else if (Collision_Ver(m_PosX + m_Width + m_VelX, m_PosY, TilePos, Map) == 3) //Lava { m_VelX = 0; m_bDead = true; m_State = "DYING"; m_Lives -= 1; m_bLivesChanged = true; } else if (Collision_Ver(m_PosX + m_Width + m_VelX, m_PosY, TilePos, Map) == 5) //Coins { m_PosX += m_VelX; m_Score += 100; m_bScoreChanged = true; m_Coins += 1; m_bCoinsChanged = true; Mix_PlayChannel(-1,cCoinCollected,0); Map->SetTileAtPos( (int) (m_PosX / 32), (int) (m_PosY / 32),0,0); } else { m_PosX += m_VelX; } } else if(m_bLeft) { if (m_State != "JUMPING") { m_State = "WALKING_LEFT"; } else { m_State = "JUMPING"; } if(Collision_Ver(m_PosX - m_VelX, m_PosY, TilePos, Map) == 1) { m_PosX = (TilePos + 1)* Tile.GetSize(); Mix_PlayChannel(-1,cBlockhit,0); } else if (Collision_Ver(m_PosX - m_VelX, m_PosY, TilePos, Map) == 2) { m_PosX = (TilePos + 1)* Tile.GetSize(); } else if (Collision_Ver(m_PosX - m_VelX, m_PosY, TilePos, Map) == 3) { m_VelX = 0; m_State = "DYING"; m_Lives -= 1; m_bLivesChanged = true; } else if (Collision_Ver(m_PosX - m_VelX, m_PosY, TilePos, Map) == 5) //Coins { m_PosX -= m_VelX; m_Score += 100; m_bScoreChanged = true; m_Coins += 1; m_bCoinsChanged = true; Mix_PlayChannel(-1,cCoinCollected,0); Map->SetTileAtPos( (int) ((m_PosX - m_VelX) / 32), (int) (m_PosY / 32),0,0); } else if (Collision_Ver(m_PosX, m_PosY, TilePos, Map) == 6) // { m_PosX = (TilePos + 1)* Tile.GetSize(); } else { m_PosX -= m_VelX; } } //then y axis (|) if(m_bIsJumping == true) //up { m_State = "JUMPING"; Mix_PlayChannel(-1,cJump,0); if(Collision_Hor(m_PosX, (m_PosY - m_VelY), TilePos, Map) == 1) { m_PosY = (TilePos + 1)* Tile.GetSize(); m_VelY = 0; m_bLockJump = true; m_bApexReached = true; if (m_bApexReached == true) { m_PosY += m_Gravity; } Mix_PlayChannel(-1,cBlockhit,0); } else if(Collision_Hor(m_PosX, (m_PosY - m_VelY), TilePos, Map) == 2) { m_PosY -= m_VelY; } else if(Collision_Hor(m_PosX, (m_PosY - m_VelY), TilePos, Map) == 3) { m_VelX = 0; m_PosY += m_Gravity; m_State = "DYING"; m_Lives -= 1; m_bLivesChanged = true; } else if(Collision_Hor(m_PosX, (m_PosY - m_VelY), TilePos, Map) == 5) { m_PosY -= m_VelY; m_sScore = ""; m_Score += 100; m_bScoreChanged = true; Mix_PlayChannel(-1,cCoinCollected,0); m_sCoins = ""; m_Coins += 1; m_bCoinsChanged = true; Map->SetTileAtPos( (int) (m_PosX / 32), (int) (m_PosY / 32),0,0); } else if(Collision_Hor(m_PosX, (m_PosY - m_VelY), TilePos, Map) == 6) { m_PosY = (TilePos + 1)* Tile.GetSize(); m_VelY = 0; Mix_PlayChannel(-1,cBlockhit,0); } else if(Collision_Hor(m_PosX, (m_PosY - m_VelY), TilePos, Map) == 7) { m_PosY = (TilePos + 1)* Tile.GetSize(); m_VelY = 0; } else { if (m_bLockJump == false && m_bApexReached == false) { if (m_bOffsetIsSet == false) { m_JumpOffset = m_PosY; m_JumpApex = m_JumpOffset - m_JumpingHeight; m_bOffsetIsSet = true; } if (m_PosY > m_JumpApex) { m_PosY -= m_Gravity; //Move up at same speed like we move down } else if (m_PosY <= m_JumpApex) { m_bApexReached = true; m_bLockJump = true; } } if (m_bApexReached == true) { m_PosY += m_Gravity; } } } else { if(Collision_Hor(m_PosX, (m_PosY + m_Gravity + m_Height), TilePos, Map) == 1) { m_PosY = (TilePos * Tile.GetSize()) - m_Height - m_Gravity; m_VelY = 0; m_bTouchesGround = true; m_bIsJumping = false; m_bLockJump = false; m_bApexReached = false; } else if(Collision_Hor(m_PosX, (m_PosY + m_Gravity + m_Height), TilePos, Map) == 2) { m_PosY = (TilePos * Tile.GetSize()) - m_Height - m_Gravity; m_VelY = 0; m_bTouchesGround = true; m_bIsJumping = false; m_bLockJump = false; m_bApexReached = false; } else if(Collision_Hor(m_PosX, (m_PosY + m_Gravity + m_Height), TilePos, Map) == 3) { m_State = "DYING"; m_Lives -= 1; m_bLockJump = true; m_bApexReached = false; } else if(Collision_Hor(m_PosX, (m_PosY + m_Gravity + m_Height), TilePos, Map) == 5) { m_VelY = m_Gravity; m_Score += 100; m_Coins += 1; Mix_PlayChannel(-1,cCoinCollected,0); Map->SetTileAtPos( (int) (m_PosX / 32), (int) (m_PosY / 32),0,0); m_bLockJump = true; } else if(Collision_Hor(m_PosX, (m_PosY + m_Gravity + m_Height), TilePos, Map) == 6) { m_PosY += m_VelX; } else { m_VelY = m_Gravity; if(m_VelY >= Tile.GetSize()) { m_VelY = Tile.GetSize(); } m_bLockJump = true; } std::cout << "m_bTouchesGround: " << m_bTouchesGround << "\n"; if (m_bTouchesGround == true) { if (m_bRight == true) { m_State = "WALKING_RIGHT"; } else if (m_bLeft == true) { m_State = "WALKING_LEFT"; } } else { m_State = "JUMPING"; } m_PosY += m_VelX; } UpdateScore(); UpdateLives(); UpdateCoins(); HandleStates(); }
//Player creation method Player::Player(SDL_Renderer *renderer, int pNum, string filePath, string audioPath, float x, float y) { //activate the player active = true; //set the player number 0 or 1 playerNum = pNum; //set float for player speed speed = 500.0f; laser = Mix_LoadWAV((audioPath + "bullet.wav").c_str()); // init score and lives vars oldScore = 0; playerScore = 0; oldLives = 0; playerLives = 3; //init the font system TTF_Init(); //load the font font = TTF_OpenFont((audioPath + "Amperzand.ttf").c_str(), 40); //see if this is player 1 or player 2, and create the correct X and Y locations if (playerNum == 0) { //Create the score texture X and Y position scorePos.x = scorePos.y = 10; livesPos.x = 10; livesPos.y = 50; } else { scorePos.x = 650; scorePos.y = 10; livesPos.x = 650; livesPos.y = 50; } // update score method UpdateScore(renderer); //Update lives method UpdateLives(renderer); //see if this is player 1, or player 2, and create the correct file path if(playerNum == 0) {//Create the player 1 texture playerPath = filePath + "player.png"; }else {//Create the player 2 texture playerPath = filePath + "player2.png"; } //load the surface surface = IMG_Load(playerPath.c_str()); //load the surface into the texture texture = SDL_CreateTextureFromSurface(renderer, surface); //free the surface for later use SDL_FreeSurface(surface); //set the SDL_Rect X and Y for the player posRect.x = x; posRect.y = y; //Use SDL_QueryTexture to get the kW and H of the player's texture int w, h; SDL_QueryTexture(texture, NULL, NULL, &w, &h); posRect.w = w; posRect.h = h; //Set the movement floats to the players original X and Y pos_X = x; pos_Y = y; //set the xDir and yDir for the joysticks xDir = 0; yDir = 0; //String to create the path to the player's bullet image string bulletPath; //see if this is player 1, or player 2, and create the correct file path if(playerNum == 0){ //Create the bullet 1 texture bulletPath = filePath + "bullet.png"; }else{ //Create the bullet 2 texture bulletPath = filePath + "bullet2.png"; } //Create the player's bullet pool for(int i = 0; i < 10; i++) { //create the bullet and move offscreen, out of the game play area Bullet tmpBullet(renderer, bulletPath, -1000, -1000); //add to bulletlist bulletList.push_back(tmpBullet); } }
//---------------------------------------------------------------------------- // Nome: OnGame(void) // Desc: Trata o estado GS_GAME // Pams: nenhum //---------------------------------------------------------------------------- void CLevel::OnGame(void) { if(pr_Main->InputManager.KeyPressed(DIK_ESCAPE)) { ChangeState(GS_MENU); } //atualiza os personagens o laço é feito de trás para diante porque caso //um ou mais personagens tenham terminado sua execução, eles podem ser //excluídos sem dar problema de índices inválidos no vetor. int i = 0; for(i = (short)ListCharacters.size()-1; i >= 0; i--) { //executa o personagem ListCharacters[i]->Execute(); //21.1.5. //se o personagem morreu e não for o jogador, remover da lista } //atualiza a câmera no jogador se ele não estiver morrendo if (!pr_Player->IsDieing()) { LookToPlayer(); } //17.5.1. //colocar o jogo em pausa, caso tecla P seja pressionada if(pr_Main->InputManager.KeyPressed(DIK_P)) { ChangeState(GS_PAUSE); } //18.2.6. Atualização ou execução dos itens //o laço é feito de trás para frente porque caso um ou mais //itens tenham terminado sua execução, eles podem ser removidos //sem dar problema de índices inválidos no vetor. int iSize = (int) ListItems.size(); for(int i=iSize-1; i >= 0; i--){ ListItems[i]->Execute(); if(ListItems[i]->GetState() == CItem::IS_END){ ListItems[i]->Release(); delete ListItems[i]; ListItems.erase(ListItems.begin()+i); } } //23.1.3. //2. se os itens terminaram, preparar programação de fim de jogo. if(iSize == 0) { //a alavanca ainda não foi ativada... if(p_SprSwitch->sCurrentAnim == 0) { //se o jogador colide com a alavanca } //3. interação do jogador com a moeda else { //caso o jogador encoste na moeda, mudar estado do jogo } } //se existe a layer de interface... if(p_LayInterface) { //17.2.3. Atualizar o placar UpdateScore(); //17.3.3. Atualizar o número de vidas UpdateLives(); } //19.2.3. atualiza os tiros //remove aqueles que estão no estado SS_END }