⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 worldmodel.cpp

📁 2006年世界杯足球赛2D仿真组第16名的源代码。在此代码上随便改改
💻 CPP
📖 第 1 页 / 共 5 页
字号:
		isGoalie = true;	}	if (teamId == TID_UNKNOWN) // Quarter	{		for (i = 0; i < QUARTER_PLAYERS_NUM; i++)			if (!quarterPlayers[i]->isValid() &&				!quarterPlayers[i]->isReadyToUpdate())				break;		if (i < QUARTER_PLAYERS_NUM)			quarterPlayers[i]->parse(teamId, uniNum, isGoalie, exp, getCurTime());	}	else if (uniNum == 0) // Half	{		for (i = 0; i < HALF_PLAYERS_NUM; i++)			if (!halfPlayers[teamId][i]->isValid() &&				!halfPlayers[teamId][i]->isReadyToUpdate())				break;		if (i < HALF_PLAYERS_NUM)			halfPlayers[teamId][i]->parse(teamId, uniNum, isGoalie, exp, getCurTime());	}	else // Full	{		assert(uniNum <= FULL_PLAYERS_NUM);		fullPlayers[teamId][uniNum - 1]->parse(teamId, uniNum, isGoalie, exp,											   getCurTime());	}}void WorldModel::resetObjects(){	unsigned i;	flagsNum = 0;	goalsNum = 0;	linesNum = 0;	// Reading to parse objects	ball->setReadyToUpdate(false);	for (i = 0; i < FULL_PLAYERS_NUM; i++)		fullPlayers[TID_TEAMMATE][i]->setReadyToUpdate(false);	for (i = 0; i < FULL_PLAYERS_NUM; i++)		fullPlayers[TID_OPPONENT][i]->setReadyToUpdate(false);	for (i = 0; i < HALF_PLAYERS_NUM; i++)		halfPlayers[TID_TEAMMATE][i]->setReadyToUpdate(false);	for (i = 0; i < HALF_PLAYERS_NUM; i++)		halfPlayers[TID_OPPONENT][i]->setReadyToUpdate(false);	for (i = 0; i < QUARTER_PLAYERS_NUM; i++)		quarterPlayers[i]->setReadyToUpdate(false);	// Killing a few players	for (i = 0; i < QUARTER_PLAYERS_NUM; i++)		quarterPlayers[i]->kill();	for (i = 0; i < HALF_PLAYERS_NUM; i++)	{		if (halfPlayers[TID_TEAMMATE][i]->isAlive() &&			halfPlayers[TID_TEAMMATE][i]->canBodySee(body->getPos(),													 body->getViewAngle(), body->getVisibleDistance()))			halfPlayers[TID_TEAMMATE][i]->kill();		if (halfPlayers[TID_OPPONENT][i]->isAlive() &&			halfPlayers[TID_OPPONENT][i]->canBodySee(body->getPos(),													 body->getViewAngle(), body->getVisibleDistance()))			halfPlayers[TID_OPPONENT][i]->kill();	}}void WorldModel::replaceBodyInPlayersList(unsigned bodyUniNum){	delete fullPlayers[TID_TEAMMATE][bodyUniNum - 1];	fullPlayers[TID_TEAMMATE][bodyUniNum - 1] = body;	setBodyReplaced(true);}void WorldModel::updateObjects(){	unsigned i;	for (i = 0; i < flagsNum; i++)		flags[i]->update(fieldData);	for (i = 0; i < goalsNum; i++)		goals[i]->update(fieldData);	for (i = 0; i < linesNum; i++)		lines[i]->update(fieldData);	body->update(flags, goals, lines, flagsNum, goalsNum, linesNum);	if (ball->isReadyToUpdate())		ball->update(*body);	else if (ball->isValid())		ball->virtualUpdate(*body);	for (i = 0; i < FULL_PLAYERS_NUM; i++)		if (fullPlayers[TID_TEAMMATE][i]->isReadyToUpdate())			fullPlayers[TID_TEAMMATE][i]->update(*body, playMode);		else if (i != body->getUniNum() - 1 && // this function do not virtual update body.				 fullPlayers[TID_TEAMMATE][i]->isAlive())			fullPlayers[TID_TEAMMATE][i]->virtualUpdate(*body);	for (i = 0; i < FULL_PLAYERS_NUM; i++)		if (fullPlayers[TID_OPPONENT][i]->isReadyToUpdate())			fullPlayers[TID_OPPONENT][i]->update(*body, playMode);		else if (fullPlayers[TID_OPPONENT][i]->isAlive())			fullPlayers[TID_OPPONENT][i]->virtualUpdate(*body);	for (i = 0; i < HALF_PLAYERS_NUM; i++)		if (halfPlayers[TID_TEAMMATE][i]->isReadyToUpdate())			halfPlayers[TID_TEAMMATE][i]->update(*body, playMode);		else if (halfPlayers[TID_TEAMMATE][i]->isValid())			halfPlayers[TID_TEAMMATE][i]->virtualUpdate(*body);	for (i = 0; i < HALF_PLAYERS_NUM; i++)		if (halfPlayers[TID_OPPONENT][i]->isReadyToUpdate())			halfPlayers[TID_OPPONENT][i]->update(*body, playMode);		else if (halfPlayers[TID_OPPONENT][i]->isValid())			halfPlayers[TID_OPPONENT][i]->virtualUpdate(*body);	for (i = 0; i < QUARTER_PLAYERS_NUM; i++)		if (quarterPlayers[i]->isReadyToUpdate())			quarterPlayers[i]->update(*body, playMode);		else if (quarterPlayers[i]->isValid())			quarterPlayers[i]->virtualUpdate(*body);	completeUpdateObjects();}void WorldModel::simulateObjects(const Body &lastBody, const Command *bodyCycleCommand){	unsigned i;	if (getPlayMode() == PM_FREE_KICK &&		getVirtualPlayMode() ==	VPM_GOALIE_CATCH_BALL && body->isGoalie())		ball->simulateByAction(lastBody, bodyCycleCommand, true);	else		ball->simulateByAction(lastBody, bodyCycleCommand);	ball->simulateByDynamics(*body, 2, ballStatus, curTime);	for (i = 0; i < FULL_PLAYERS_NUM; i++)		if (i != body->getUniNum() - 1 && // this function do not simulate body.			fullPlayers[TID_TEAMMATE][i]->isAlive())			fullPlayers[TID_TEAMMATE][i]->simulateByDynamics(*body);	for (i = 0; i < FULL_PLAYERS_NUM; i++)		if (fullPlayers[TID_OPPONENT][i]->isAlive())			fullPlayers[TID_OPPONENT][i]->simulateByDynamics(*body);	for (i = 0; i < HALF_PLAYERS_NUM; i++)		if (halfPlayers[TID_TEAMMATE][i]->isValid())			halfPlayers[TID_TEAMMATE][i]->simulateByDynamics(*body);	for (i = 0; i < HALF_PLAYERS_NUM; i++)		if (halfPlayers[TID_OPPONENT][i]->isValid())			halfPlayers[TID_OPPONENT][i]->simulateByDynamics(*body);	for (i = 0; i < QUARTER_PLAYERS_NUM; i++)		if (quarterPlayers[i]->isValid())			quarterPlayers[i]->simulateByDynamics(*body);}void WorldModel::completeUpdateObjects(){	int i, j;	Player *playerPtr;	// Removing same Halves	for (i = 0; i < HALF_PLAYERS_NUM; i++)	{		// Teammates		if (halfPlayers[TID_TEAMMATE][i]->isValid() &&			halfPlayers[TID_TEAMMATE][i]->getSeeTime() != getCurTime())		{			playerPtr = NULL;			for (j = 0; j < HALF_PLAYERS_NUM; j++)				if (halfPlayers[TID_TEAMMATE][j]->isValid() &&					halfPlayers[TID_TEAMMATE][j]->getSeeTime() == getCurTime() &&					halfPlayers[TID_TEAMMATE][j]->getDistance(*halfPlayers[TID_TEAMMATE][i]) <=					halfPlayers[TID_TEAMMATE][j]->getPosDeviation() + halfPlayers[TID_TEAMMATE][i]->getPosDeviation() + 1) // One meter for sure				{					if (!playerPtr)						playerPtr = halfPlayers[TID_TEAMMATE][j];					else					{						playerPtr = NULL;						break;					}				}				if (playerPtr)			{				for (j = 0; j < HALF_PLAYERS_NUM; j++)					if (i != j && halfPlayers[TID_TEAMMATE][j]->isValid() &&						halfPlayers[TID_TEAMMATE][j]->getSeeTime() != getCurTime() &&						halfPlayers[TID_TEAMMATE][j]->getDistance(*playerPtr) <=						halfPlayers[TID_TEAMMATE][j]->getPosDeviation() + playerPtr->getPosDeviation() + 1) // One meter for sure				{					j = -1;					break;				}				if (j != -1)					halfPlayers[TID_TEAMMATE][i]->kill();			}		}		// Opponents		if (halfPlayers[TID_OPPONENT][i]->isValid() &&			halfPlayers[TID_OPPONENT][i]->getSeeTime() != getCurTime())		{			playerPtr = NULL;			for (j = 0; j < HALF_PLAYERS_NUM; j++)				if (halfPlayers[TID_OPPONENT][j]->isValid() &&					halfPlayers[TID_OPPONENT][j]->getSeeTime() == getCurTime() &&					halfPlayers[TID_OPPONENT][j]->getDistance(*halfPlayers[TID_OPPONENT][i]) <=					halfPlayers[TID_OPPONENT][j]->getPosDeviation() + halfPlayers[TID_OPPONENT][i]->getPosDeviation() + 1) // One meter for sure				{					if (!playerPtr)						playerPtr = halfPlayers[TID_OPPONENT][j];					else					{						playerPtr = NULL;						break;					}				}				if (playerPtr)			{				for (j = 0; j < HALF_PLAYERS_NUM; j++)					if (i != j && halfPlayers[TID_OPPONENT][j]->isValid() &&						halfPlayers[TID_OPPONENT][j]->getSeeTime() != getCurTime() &&						halfPlayers[TID_OPPONENT][j]->getDistance(*playerPtr) <=						halfPlayers[TID_OPPONENT][j]->getPosDeviation() + playerPtr->getPosDeviation() + 1) // One meter for sure				{					j = -1;					break;				}				if (j != -1)					halfPlayers[TID_OPPONENT][i]->kill();			}		}	}	// Changing Quarters to Halves	for (i = 0; i < QUARTER_PLAYERS_NUM; i++)		if (quarterPlayers[i]->isValid())		{			playerPtr = NULL;			for (j = 0; j < HALF_PLAYERS_NUM; j++)			{				// Teammates				if (halfPlayers[TID_TEAMMATE][j]->isValid() &&					halfPlayers[TID_TEAMMATE][j]->getSeeTime() != getCurTime() &&					halfPlayers[TID_TEAMMATE][j]->getDistance(*quarterPlayers[i]) <=					halfPlayers[TID_TEAMMATE][j]->getPosDeviation() + quarterPlayers[i]->getPosDeviation() + 1) // One meter for sure				{					if (playerPtr == NULL)						playerPtr = halfPlayers[TID_TEAMMATE][j];					else					{						playerPtr = NULL;						break;					}				}				// Opponents				if (halfPlayers[TID_OPPONENT][j]->isValid() &&					halfPlayers[TID_OPPONENT][j]->getSeeTime() != getCurTime() &&					halfPlayers[TID_OPPONENT][j]->getDistance(*quarterPlayers[i]) <=					halfPlayers[TID_OPPONENT][j]->getPosDeviation() + quarterPlayers[i]->getPosDeviation() + 1) // One meter for sure				{					if (playerPtr == NULL)						playerPtr = halfPlayers[TID_OPPONENT][j];					else					{						playerPtr = NULL;						break;					}				}			}				if (playerPtr != NULL)			{				for (j = 0; j < QUARTER_PLAYERS_NUM; j++)					if (i != j && quarterPlayers[j]->isValid() &&						quarterPlayers[j]->getDistance(*playerPtr) <=						quarterPlayers[j]->getPosDeviation() + playerPtr->getPosDeviation() + 1) // One meter for sure					{						j = -1;						break;					}				if (j != -1)				{					playerPtr->setByAnotherPlayer(*quarterPlayers[i], *body);					quarterPlayers[i]->kill();				}			}		}	// Changing Quarters to Fulls	for (i = 0; i < QUARTER_PLAYERS_NUM; i++)		if (quarterPlayers[i]->isValid())		{			playerPtr = NULL;			for (j = 0; j < FULL_PLAYERS_NUM; j++)			{				// Teammates				if (fullPlayers[TID_TEAMMATE][j]->isAlive() &&					!fullPlayers[TID_TEAMMATE][j]->isBody() &&					fullPlayers[TID_TEAMMATE][j]->getSeeTime() != getCurTime() &&					fullPlayers[TID_TEAMMATE][j]->getDistance(*quarterPlayers[i]) <=					fullPlayers[TID_TEAMMATE][j]->getPosDeviation() + quarterPlayers[i]->getPosDeviation() + 1) // One meter for sure				{					if (playerPtr == NULL)						playerPtr = fullPlayers[TID_TEAMMATE][j];					else					{						playerPtr = NULL;						break;					}				}				// Opponents				if (fullPlayers[TID_OPPONENT][j]->isAlive() &&					fullPlayers[TID_OPPONENT][j]->getSeeTime() != getCurTime() &&					fullPlayers[TID_OPPONENT][j]->getDistance(*quarterPlayers[i]) <=					fullPlayers[TID_OPPONENT][j]->getPosDeviation() + quarterPlayers[i]->getPosDeviation() + 1) // One meter for sure				{					if (playerPtr == NULL)						playerPtr = fullPlayers[TID_OPPONENT][j];					else					{						playerPtr = NULL;						break;					}				}			}				if (playerPtr != NULL)			{				for (j = 0; j < QUARTER_PLAYERS_NUM; j++)					if (i != j && quarterPlayers[j]->isValid() &&						quarterPlayers[j]->getDistance(*playerPtr) <=						quarterPlayers[j]->getPosDeviation() + playerPtr->getPosDeviation() + 1) // One meter for sure					{						j = -1;						break;					}				if (j != -1)				{					playerPtr->setByAnotherPlayer(*quarterPlayers[i], *body);					quarterPlayers[i]->kill();//LOG << "Tran qua to " << playerPtr->getTeamId() << " " << playerPtr->getUniNum() << endl;//LOG << "qu ti: " << quarterPlayers[i]->getSeeTime() << " fu ti: " << playerPtr->getSeeTime() << " cur ti: " << curTime << endl;				}			}		}	// Changing Halves to Fulls	for (i = 0; i < HALF_PLAYERS_NUM; i++)	{		// Teammates		if (halfPlayers[TID_TEAMMATE][i]->isValid())		{			playerPtr = NULL;			for (j = 0; j < FULL_PLAYERS_NUM; j++)				if (fullPlayers[TID_TEAMMATE][j]->isAlive() &&					!fullPlayers[TID_TEAMMATE][j]->isBody() &&					fullPlayers[TID_TEAMMATE][j]->getSeeTime() != getCurTime() &&					fullPlayers[TID_TEAMMATE][j]->getDistance(*halfPlayers[TID_TEAMMATE][i]) <=					fullPlayers[TID_TEAMMATE][j]->getPosDeviation() + halfPlayers[TID_TEAMMATE][i]->getPosDeviation() + 1) // One meter for sure				{					if (playerPtr == NULL)						playerPtr = fullPlayers[TID_TEAMMATE][j];					else					{						playerPtr = NULL;						break;					}				}				if (playerPtr != NULL)			{				for (j = 0; j < HALF_PLAYERS_NUM; j++)					if (i != j && halfPlayers[TID_TEAMMATE][j]->isValid() &&							halfPlayers[TID_TEAMMATE][j]->getDistance(*playerPtr) <=							halfPlayers[TID_TEAMMATE][j]->getPosDeviation() + playerPtr->getPosDeviation() + 1) // One meter for sure					{						j = -1;						break;					}				if (j != -1)				{					playerPtr->setByAnotherPlayer(*halfPlayers[TID_TEAMMATE][i], *body);					halfPlayers[TID_TEAMMATE][i]->kill();				}			}		}		// Opponents		if (halfPlayers[TID_OPPONENT][i]->isValid())		{			playerPtr = NULL;			for (j = 0; j < FULL_PLAYERS_NUM; j++)				if (fullPlayers[TID_OPPONENT][j]->isAlive() &&					fullPlayers[TID_OPPONENT][j]->getSeeTime() != getCurTime() &&					fullPlayers[TID_OPPONENT][j]->getDistance(*halfPlayers[TID_OPPONENT][i]) <=					fullPlayers[TID_OPPONENT][j]->getPosDeviation() + halfPlayers[TID_OPPONENT][i]->getPosDeviation() + 1) // One meter for sure				{					if (playerPtr == NULL)						playerPtr = fullPlayers[TID_OPPONENT][j];					else					{						playerPtr = NULL;						break;					}				}				if (playerPtr != NULL)			{				for (j = 0; j < HALF_PLAYERS_NUM; j++)					if (i != j && halfPlayers[TID_OPPONENT][j]->isValid() &&						halfPlayers[TID_OPPONENT][j]->getDistance(*playerPtr) <=						halfPlayers[TID_OPPONENT][j]->getPosDeviation() + playerPtr->getPosDeviation() + 1) // One meter for sure					{						j = -1;						break;					}				if (j != -1)				{					playerPtr->setByAnotherPlayer(*halfPlayers[TID_OPPONENT][i], *body);					halfPlayers[TID_OPPONENT][i]->kill();				}			}		}	}	// Players change place	for (i = 0; i < FULL_PLAYERS_NUM; i++)	{		if (fullPlayers[TID_TEAMMATE][i]->isAlive() &&			!fullPlayers[TID_TEAMMATE][i]->isBody() &&			fullPlayers[TID_TEAMMATE][i]->getSeeTime() != getCurTime())		{			putOutOfVisibleDistance(*fullPlayers[TID_TEAMMATE][i]);			if (fabs(fullPlayers[TID_TEAMMATE][i]->getHeadVec().getDirection()) <				body->getViewAngle() - CHANGE_PLACE_SURE_ANGLE &&				fullPlayers[TID_TEAMMATE][i]->getAbsVec().getMagnitude() <				UNUM_FAR_LENGTH - CHANGE_PLACE_SURE_DIST)

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -