int CMainScene::onBombDidLanded() { //逐个对比,从队列中剔除死亡角色,设置为-1, for (std::vector<CPlayer*>::iterator iterPlayer = m_playerVector.begin(); iterPlayer != m_playerVector.end(); iterPlayer++) { if ((*iterPlayer)->IsDead()) { for (int i = 0; i < m_alivePlayersNum; i++) { if (m_playersOrderList[i] == (*iterPlayer)->m_sPlayerInfo.m_ID) { deleteOrderListWithIndex(i); m_alivePlayersNum--; m_deadPlayersNum++; } } m_playerVector.erase(iterPlayer); } } //是否胜利 if (m_alivePlayersNum == 1) { Director::getInstance()->replaceScene(new Scene()); } //是否一轮结束 else { //一轮结束,刷新队列,重置第一位玩家并使能,论数+, if (m_curPlayerOrder == m_alivePlayersNum - 1) { m_curTurnIsOver = true; refreshPlayerOrderList(); m_curPlayerOrder = 0; m_curTurnIndex++; m_curTurnIsOver = false; } //否则指向下一个玩家并使能之 else { m_curPlayerOrder++; } for (std::vector<CPlayer*>::iterator iterPlayer = m_playerVector.begin(); iterPlayer != m_playerVector.end(); iterPlayer++) { if ((*iterPlayer)->m_sPlayerInfo.m_ID == m_playersOrderList[m_curPlayerOrder]) { m_curPlayer = (*iterPlayer); reRegisterInterruptions(); break; } } m_curPlayer->EnableAction(); m_playerActionTimer = STATE_INTERVAL[RUNNING]; } return 0; }
//update函数主要获取当前倒计时,并设置全局游戏状态、玩家状态、UI状态 void CMainScene::update(float delta) { //checking game state has the highest priority if (m_gameState == PAUSED || m_gameState == FINISHED) { return; } if (m_curPlayer == NULL) { return; } //事件触发,则进行相应处理,因m_curPlayer自动变换,因此不需要删除事件重新注册; /*for (std::map<pFunc, pCallbackFunc>::iterator iterFunc = m_interruptionMap.begin(); iterFunc != m_interruptionMap.end(); iterFunc++) { if ((m_curPlayer->*(iterFunc->first))() == 1) { (this->*(iterFunc->second))(); } }*/ if (m_curPlayer->Fired()) { this->onPlayerFired(); return; } if (m_curPlayer->BombDidLanded()) { this->onBombDidLanded(); return; } //调整previousState和timer, switch (m_gameState) { case PREPARING: //do nothing m_gameState = DOWN_COUNTING; break; case DOWN_COUNTING: //start down counting if (m_prevGameState == DOWN_COUNTING - 1) { m_prevGameState = DOWN_COUNTING; m_downCountingTimer = STATE_INTERVAL[DOWN_COUNTING]; } else if (m_prevGameState == DOWN_COUNTING) { m_downCountingTimer -= delta; } else { CCLOG("m_curGameState is DOWN_COUNTING, while m_prevGameState is wrong."); } break; case RUNNING: if (m_prevGameState == RUNNING - 1) { m_prevGameState = RUNNING; m_playerActionTimer = STATE_INTERVAL[RUNNING]; m_curPlayer->EnableAction(); } else if (m_prevGameState == RUNNING + 1) { m_prevGameState = RUNNING; m_playerActionTimer = STATE_INTERVAL[RUNNING]; m_curPlayer->EnableAction(); } else if (m_prevGameState == RUNNING) { m_playerActionTimer -= delta; } else { CCLOG("m_curGameState is RUNNING, while m_prevGameState is wrong."); } break; case WAITING: if (m_prevGameState == WAITING - 1) { m_prevGameState = WAITING; #ifdef _BOMB_DEBUG_ m_playerWaitingTimer = STATE_INTERVAL[WAITING]; #endif } else if (m_prevGameState == WAITING) { #ifdef _BOMB_DEBUG_ m_playerWaitingTimer -= delta; #endif } else { CCLOG("m_curGameState is WAITING, while m_prevGameState is wrong."); } break; case PAUSED: //do nothing; break; case FINISHED: //do nothing; break; default: CCLOG("Shouldn't be in other state! Logic Error1!"); break; } if (m_downCountingTimer <= 0.0f) { m_downCountingTimer = STATE_INTERVAL[DOWN_COUNTING]; m_gameState = RUNNING; } if (m_playerActionTimer <= 0.0f) { //Should've considered reaching the maxTurns of the game //Current player didn't fire // m_playerActionTimer = STATE_INTERVAL[RUNNING]; m_gameState = RUNNING; m_curPlayer->DisableAction(); //一轮结束,刷新队列,重置第一位玩家并使能,论数+, if (m_curPlayerOrder == m_alivePlayersNum - 1) { m_curTurnIsOver = true; refreshPlayerOrderList(); m_curPlayerOrder = 0; m_curTurnIndex++; m_curTurnIsOver = false; } //否则指向下一个玩家并使能之 else { m_curPlayerOrder++; } for (std::vector<Player*>::iterator iterPlayer = m_playerVector.begin(); iterPlayer != m_playerVector.end(); iterPlayer++) { if ((*iterPlayer)->m_sPlayerInfo.m_ID == m_playersOrderList[m_curPlayerOrder]) { m_curPlayer = (*iterPlayer); Global::getInstance()->_playerObj = m_curPlayer; //reRegisterInterruptions(); break; } } m_curPlayer->EnableAction(); m_playerActionTimer = STATE_INTERVAL[RUNNING]; } #ifdef _BOMB_DEBUG_ if (m_playerWaitingTimer <= 0.0f) { m_playerWaitingTimer = STATE_INTERVAL[WAITING]; } #endif }