void PlayerPosDetector::processDetector() { if(!_parentNPC) return; float d=0.0f; for(int i=0; i<_scene->players.size(); i++) { LVL_Player *p = _scene->players[i]; float d1=distance(p); if((d1<d)||(i==0)) { d=d1; pos = p->posRect.center(); _playersDirection=p->direction(); if(_parentNPC->posCenterX() < pos.x()) _directedTo=1; else if(_parentNPC->posCenterX() > pos.x()) _directedTo=-1; _plrptr=p; _plr_id=p->characterID; _plr_state=p->stateID; } } }
void LevelScene::collectGarbagePlayers() { QVector<LVL_Player *> stillVizible;//Avoid camera crash (which uses a cached render list) while(!dead_players.isEmpty()) { LVL_Player *corpse = dead_players.last(); dead_players.pop_back(); if(corpse->isInRenderList()) { stillVizible.push_back(corpse);//Avoid camera crash (which uses a cached render list) continue; } LVL_Player::deathReason reason = corpse->kill_reason; #if (QT_VERSION >= 0x050400) players.removeAll(corpse); #else //He-he, it's a great workaround for a Qt less than 5.4 which has QVector without removeAll() function while(1) { const QVector<LVL_Player *>::const_iterator ce = players.cend(), cit = std::find(players.cbegin(), ce, corpse); if (cit == ce) break; const QVector<LVL_Player *>::iterator e = players.end(), it = std::remove(players.begin() + (cit - players.cbegin()), e, corpse); players.erase(it, e); break; } #endif luaEngine.destoryLuaPlayer(corpse); switch(reason) { case LVL_Player::deathReason::DEAD_burn: case LVL_Player::deathReason::DEAD_fall: case LVL_Player::deathReason::DEAD_killed: if(players.size() > 0) PGE_Audio::playSoundByRole(obj_sound_role::PlayerDied); else { Mix_HaltChannel(-1); PGE_Audio::playSoundByRole(obj_sound_role::LevelFailed); } break; } if(reason==LVL_Player::deathReason::DEAD_burn) PGE_Audio::playSoundByRole(obj_sound_role::NpcLavaBurn); } dead_players.append(stillVizible); if(players.isEmpty()) { PGE_MusPlayer::MUS_stopMusic(); setExiting(4000, LvlExit::EXIT_PlayerDeath); } }
void LevelScene::addPlayer(PlayerPoint playerData, bool byWarp, int warpType, int warpDirect) { LVL_Player * player; if(luaEngine.isValid()){ player = luaEngine.createLuaPlayer(); if(player == nullptr) player = new LVL_Player(); }else{ player = new LVL_Player(); } if(players.size()==0) player->camera = &cameras.first(); else if(players.size()==1) player->camera = &cameras.last(); int sID = findNearestSection(playerData.x, playerData.y); LVL_Section *sct = getSection(sID); if(!sct) { delete player; return; } player->setParentSection(sct); player->z_index = Z_Player; player->setPlayerPointInfo(playerData); player->init(); players.push_back(player); if(playerData.id==1) player1Controller->registerInControl(player); else if(playerData.id==2) player2Controller->registerInControl(player); if(byWarp) { player->setPaused(true); player->WarpTo(playerData.x, playerData.y, warpType, warpDirect); if(warpType==2) PGE_Audio::playSoundByRole(obj_sound_role::WarpDoor); else if(warpType==0) PGE_Audio::playSoundByRole(obj_sound_role::PlayerMagic); } }
void LevelScene::onKeyboardPressedSDL(SDL_Keycode sdl_key, Uint16) { if(m_doExit || isExit()) return; if(m_isPauseMenu && (m_player1Controller->type() != Controller::type_keyboard)) m_pauseMenu.processKeyEvent(sdl_key); switch(sdl_key) { // Check which case SDLK_ESCAPE: case SDLK_RETURN: // Toggle pause mode case SDLK_AC_BACK: { if(m_isPauseMenu && (m_player1Controller->type() == Controller::type_keyboard)) m_pauseMenu.processKeyEvent(sdl_key); if(m_doExit || m_isPauseMenu) break; m_isPauseMenu = true; break; } case SDLK_BACKQUOTE: { PGE_Debugger::executeCommand(this); break; } default: //Keys allowed only in debug mode! if(PGE_Debugger::cheat_debugkeys) { switch(sdl_key) { case SDLK_1: { if(!m_itemsPlayers.empty()) launchEffect(1, m_itemsPlayers.front()->posX(), m_itemsPlayers.front()->posY(), 0, 2000, 0, 0, 0); } break; case SDLK_2: { if(!m_itemsPlayers.empty()) launchEffect(1, m_itemsPlayers.front()->posX(), m_itemsPlayers.front()->posY(), 0, 2000, 3, -6, 12); break; } case SDLK_3: { if(!m_itemsPlayers.empty()) { Scene_Effect_Phys p; p.decelerate_x = 0.02; p.max_vel_y = 12; LVL_Player *pl = m_itemsPlayers.front(); launchEffect(1, pl->posX(), pl->posY(), 0, 5000, -3, -6, 5, 0, p); launchEffect(1, pl->posX(), pl->posY(), 0, 5000, -4, -7, 5, 0, p); launchEffect(1, pl->posX(), pl->posY(), 0, 5000, 3, -6, 5, 0, p); launchEffect(1, pl->posX(), pl->posY(), 0, 5000, 4, -7, 5, 0, p); } break; } case SDLK_4: { if(!m_itemsPlayers.empty()) { Scene_Effect_Phys p; p.max_vel_y = 12; LVL_Player *pl = m_itemsPlayers.front(); launchEffect(11, pl->posX(), pl->posY(), 0, 5000, 0, -3, 12, 0, p); } break; } case SDLK_5: { if(!m_itemsPlayers.empty()) launchEffect(10, m_itemsPlayers.front()->posX(), m_itemsPlayers.front()->posY(), 1, 0, 0, 0, 0); break; } case SDLK_7: { if(!m_itemsPlayers.empty()) m_itemsPlayers[0]->setCharacterSafe(m_itemsPlayers[0]->characterID - 1, m_itemsPlayers[0]->stateID); break; } case SDLK_8: { if(!m_itemsPlayers.empty()) m_itemsPlayers[0]->setCharacterSafe(m_itemsPlayers[0]->characterID + 1, m_itemsPlayers[0]->stateID); break; } case SDLK_9: { if(m_itemsPlayers.size() >= 2) m_itemsPlayers[1]->setCharacterSafe(2, 1); if(!m_itemsPlayers.empty()) m_itemsPlayers[0]->setCharacterSafe(m_itemsPlayers[0]->characterID, m_itemsPlayers[0]->stateID - 1); break; } case SDLK_0: { if(m_itemsPlayers.size() >= 2) m_itemsPlayers[1]->setCharacterSafe(2, 2); else if(!m_itemsPlayers.empty()) m_itemsPlayers[0]->setCharacterSafe(m_itemsPlayers[0]->characterID, m_itemsPlayers[0]->stateID + 1); break; } case SDLK_F5: { PGE_Audio::playSoundByRole(obj_sound_role::PlayerMagic); m_isTimeStopped = !m_isTimeStopped; break; } case SDLK_F6: { PGE_Audio::playSoundByRole(obj_sound_role::CameraSwitch); m_debug_slowTimeMode = !m_debug_slowTimeMode; break; } case SDLK_F7: { PGE_Audio::playSoundByRole(obj_sound_role::WorldOpenPath); m_debug_oneStepMode = !m_debug_oneStepMode; break; } case SDLK_F8: { if(m_debug_oneStepMode) { PGE_Audio::playSoundByRole(obj_sound_role::WorldMove); m_debug_oneStepMode_doStep = true; } break; } default: break; }//switch(sdl_key) }//if(PGE_Debugger::cheat_debugkeys) }//switch(sdl_key) }
LevelScene::~LevelScene() { GlRenderer::clearScreen(); //destroy textures size_t i = 0; D_pLogDebugNA("clear level textures"); for(i = 0; i < m_texturesBank.size(); i++) GlRenderer::deleteTexture(m_texturesBank[i]); m_texturesBank.clear(); D_pLogDebugNA("Destroy cameras"); m_cameras.clear(); D_pLogDebugNA("Destroy players"); for(i = 0; i < m_itemsPlayers.size(); i++) { LVL_Player *tmp = m_itemsPlayers[i]; if(tmp) { if(m_player1Controller) m_player1Controller->removeFromControl(tmp); if(m_player2Controller) m_player2Controller->removeFromControl(tmp); tmp->unregisterFromTree(); if(!tmp->m_isLuaPlayer) delete tmp; } } D_pLogDebugNA("Destroy blocks"); for(auto tmp : m_itemsBlocks) { if(tmp) { m_layers.removeRegItem(tmp->data.layer, tmp); tmp->unregisterFromTree(); delete tmp; } } m_itemsBlocks.clear(); D_pLogDebugNA("Destroy BGO"); for(auto tmp : m_itemsBgo) { if(tmp) { m_layers.removeRegItem(tmp->data.layer, tmp); tmp->unregisterFromTree(); delete tmp; } } m_itemsBlocks.clear(); D_pLogDebugNA("Destroy NPC"); for(auto tmp : m_itemsNpc) { if(tmp) { tmp->unregisterFromTree(); if(!tmp->isLuaNPC) delete tmp; } } m_itemsNpc.clear(); D_pLogDebugNA("Destroy Warps"); for(auto tmp : m_itemsWarps) { if(tmp) { m_layers.removeRegItem(tmp->data.layer, tmp); tmp->unregisterFromTree(); delete tmp; } } m_itemsWarps.clear(); D_pLogDebugNA("Destroy Physical Environment zones"); for(auto tmp : m_itemsPhysEnvs) { if(tmp) { m_layers.removeRegItem(tmp->data.layer, tmp); tmp->unregisterFromTree(); delete tmp; } } m_itemsPhysEnvs.clear(); //Delete layers AFTER all objects are been deleted m_layers.clear(); m_switchBlocks.clear(); D_pLogDebugNA("Destroy sections"); m_sections.clear(); m_luaEngine.shutdown(); destroyLoaderTexture(); delete m_player1Controller; delete m_player2Controller; m_texturesBank.clear(); }
void LevelScene::addPlayer(PlayerPoint playerData, bool byWarp, int warpType, int warpDirect, bool cannon, double cannon_speed) { LVL_Player *player = nullptr; if(m_luaEngine.isValid()) { player = m_luaEngine.createLuaPlayer(); if(player == nullptr) player = new LVL_Player(this); } else player = new LVL_Player(this); if(!player) throw(std::runtime_error("Out of memory [new LVL_Player] addPlayer")); player->m_scene = this; if(m_itemsPlayers.size() == 0) player->camera = &m_cameras.front(); else if(m_itemsPlayers.size() == 1) player->camera = &m_cameras.back(); int sID = findNearestSection(playerData.x, playerData.y); LVL_Section *sct = getSection(sID); if(!sct) { delete player; return; } player->setParentSection(sct); player->z_index = zOrder.player; player->m_global_state = ((static_cast<unsigned>(m_playerStates.size()) > (playerData.id - 1)) ? &m_playerStates[static_cast<int>(playerData.id - 1)] : nullptr); player->setPlayerPointInfo(playerData); if(!player->init()) { delete player; m_errorMsg = "Failed to initialize playable character!\nSee log file for more information!"; m_fader.setFade(10, 1.0, 1.0); setExiting(0, LvlExit::EXIT_Error); return; } m_itemsPlayers.push_back(player); if(playerData.id == 1) m_player1Controller->registerInControl(player); else if(playerData.id == 2) m_player2Controller->registerInControl(player); if(byWarp) { player->setPaused(true); player->WarpTo(playerData.x, playerData.y, warpType, warpDirect, cannon, cannon_speed); if(warpType == 2) PGE_Audio::playSoundByRole(obj_sound_role::WarpDoor); else if(warpType == 0) PGE_Audio::playSoundByRole(obj_sound_role::PlayerMagic); } else player->camera->changeSection(sct, true); }