Esempio n. 1
0
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;
}
Esempio n. 2
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

}