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

📄 crole.cpp

📁 一个个人开发的rpg游戏<亚特兰蒂斯传奇>的源码
💻 CPP
📖 第 1 页 / 共 2 页
字号:
		{
			if(!bOffsiteOk)									//如果还没有移动到位,继续移动
			{
				MoveRole(&rtMap,pGame);
				return true;
			}
			else
			{
				int dx=DestPosX-(x>>5);
				int dy=DestPosY-(y>>5);
				if(dx>0 && dy==0)
					nDirection=LOA_ROLE_DIR_RIGHT;
				else if(dx<0 && dy==0)
					nDirection=LOA_ROLE_DIR_LEFT;
				else if(dx==0 && dy>0)
					nDirection=LOA_ROLE_DIR_DOWN;
				else if(dx==0 && dy<0)
					nDirection=LOA_ROLE_DIR_UP;
				bMoving=false;								//设置为“停下来了”
				OldDestPosX=-1;								//改变旧的目标点
				OldDestPosY=-1;
				Path.~STPath();								//释放资源
				return true;
			}
		}
		else
		{

			if(bOffsiteOk)									//如果这一步移动到位了
			{
				pGame->SetRoleBlock();						//设置角色障碍
				if(pGame->GetMap()->m_ppTile[Path.pPos[this->nCurrentPathStep].x][Path.pPos[this->nCurrentPathStep].y].bCross==false)
				{											//如果路径的下一步被角色挡住了
					OldDestPosX=-1;							
					OldDestPosY=-1;
					bMoving=false;
					
					Path.~STPath();
					pGame->ClearRoleBlock();
					return MoveTo(pLog,pGame,DestPosX,DestPosY);//重新旬路
				}
				pGame->ClearRoleBlock();						//清除角色障碍
/*
				if(this==pGame->GetPlayer()->pRole)																//如果这个角色是主角
				{
					if(pGame->GetMap()->m_ppTile[Path.pPos[this->nCurrentPathStep].x][Path.pPos[this->nCurrentPathStep].y].flag==LOA_MAP_FLAG_CHANGE_MAP)					//如果下一步要走的地图块是切换地图的事件
					{
//						nDirection=LOA_ROLE_DIR_DOWN;															//设置主角方向
						bMoving=false;								//设置为“停下来了”
						OldDestPosX=-1;								//改变旧的目标点
						OldDestPosY=-1;
						Path.~STPath();								//释放资源
						pGame->LoadMap(pGame->GetMap()->m_ppTile[Path.pPos[this->nCurrentPathStep].x][Path.pPos[this->nCurrentPathStep].y].flagdata);						//切换地图
						return false;
					}
					else if(pGame->GetMap()->m_ppTile[Path.pPos[this->nCurrentPathStep].x][Path.pPos[this->nCurrentPathStep].y].flag==LOA_MAP_FLAG_LOAD_SCRIPT)				//如果下一步要走的地图块触发脚本
					{
//						nDirection=LOA_ROLE_DIR_DOWN;				//设置方向
						bMoving=false;								//设置为“停下来了”
						OldDestPosX=-1;								//改变旧的目标点
						OldDestPosY=-1;
						Path.~STPath();								//释放资源
						pGame->ExecuteScript(pGame->GetMap()->m_ppTile[Path.pPos[this->nCurrentPathStep].x][Path.pPos[this->nCurrentPathStep].y].flagdata);					//执行脚本
						return false;
					}
				}
*/
				int TempX=(x>>5)-Path.pPos[this->nCurrentPathStep].x;

				int TempY=(y>>5)-Path.pPos[this->nCurrentPathStep].y;
																//根据下一步位置,判断方向
				if(TempX==0 && TempY<0)
					this->nDirection=LOA_ROLE_DIR_DOWN;
				else if(TempX==0 && TempY>0)
					this->nDirection=LOA_ROLE_DIR_UP;
				else if(TempY==0 && TempX<0)
					this->nDirection=LOA_ROLE_DIR_RIGHT;
				else if(TempY==0 && TempX>0)
					this->nDirection=LOA_ROLE_DIR_LEFT;
			
				else
				{
					pGame->GetLog()->WriteMessage("X=%d,Y=%d,PathX=%d,PathY=%d,TempX=%d,TempY=%d,FindPath=Failed!",x>>5,(y)>>5,Path.pPos[this->nCurrentPathStep].x,Path.pPos[this->nCurrentPathStep].y,TempX,TempY);
					OldDestPosX=-1;							
					OldDestPosY=-1;
					bMoving=false;
					Path.~STPath();
					return MoveTo(pLog,pGame,DestPosX,DestPosY);//重新旬路
				}
				this->nCurrentPathStep++;						//步数增加
				MoveRole(&rtMap,pGame);							//移动角色

			}
			else												//否则,还没有移动到位,继续移动
			{
				MoveRole(&rtMap,pGame);
			}
		}
		return true;
	}


//开始旬路
	pGame->SetRoleBlock();										//设置角色障碍
	CAStarFindPath asPath;
	
	BOOL bRet=asPath.FindPath(pLog,pGame->GetMap(),this->x>>5,(this->y)>>5,cx,cy,this->Path);
																//A*算法旬路
	pGame->ClearRoleBlock();									//清除障碍
	if(!bRet)
		return false;
	if(this->Path.nLength==0)
		return true;
	
	bMoving=true;
	
 
	this->nCurrentPathStep=1;
	this->OldDestPosX=cx;
	this->OldDestPosY=cy;

	return true;
}
//-------------------------------------------------------------------------------------------------
//角色往下走
//-------------------------------------------------------------------------------------------------
BOOL CRole::MoveDown(CGame*pGame,BOOL bChangeDir)
{
	LOA_ASSERT(pGame);

	int TempX=x>>5;																						//得到角色下一步的坐标
	int TempY=(y>>5)+1;
	if(TempY<pGame->GetMap()->m_head.Height && pGame->GetMap()->m_ppTile[TempX][TempY].bCross==true)	//如果下一步在地图范围内,并且可以通过
	{
		 
		if(this==pGame->GetPlayer()->pRole)																//如果这个角色是主角
		{
			if(pGame->GetMap()->m_ppTile[TempX][TempY].flag==LOA_MAP_FLAG_CHANGE_MAP)					//如果下一步要走的地图块是切换地图的事件
			{
				nDirection=LOA_ROLE_DIR_DOWN;															//设置主角方向
				pGame->LoadMap(pGame->GetMap()->m_ppTile[TempX][TempY].flagdata);						//切换地图
				return false;
			}
			else if(pGame->GetMap()->m_ppTile[TempX][TempY].flag==LOA_MAP_FLAG_LOAD_SCRIPT)				//如果下一步要走的地图块触发脚本
			{
				nDirection=LOA_ROLE_DIR_DOWN;															//设置方向
				int iRev=pGame->ExecuteScript(pGame->GetMap()->m_ppTile[TempX][TempY].flagdata);
				if(iRev==-1)
					return -1;																			//执行脚本
				return false;
			}
		}
		
		nDirection=LOA_ROLE_DIR_DOWN;																	//否则,如果是npc,就移动一步
		RECT rt={0,0,pGame->GetMap()->m_head.Width<<5,pGame->GetMap()->m_head.Height<<5};
		MoveRole(&rt,pGame);
	}
	else																								//如果不能通过
	{
		if(bChangeDir)																					//如果需要尝试换方向
		{
			nDirection=rand()%4;
			switch(nDirection)
			{
			case LOA_ROLE_DIR_LEFT:
				MoveLeft(pGame,false);
				return true;
			case LOA_ROLE_DIR_UP:
				MoveUp(pGame,false);
				return true;
			case LOA_ROLE_DIR_RIGHT:
				MoveRight(pGame,false);
				return true;
				
			}
		}
		nDirection=LOA_ROLE_DIR_DOWN;
		MoveAni();																						//动画效果
	}
	return true;
}
//-------------------------------------------------------------------------------------------------
//判断角色是否能往下走
//-------------------------------------------------------------------------------------------------
BOOL CRole::JudgeAndMoveDown(CGame*pGame,BOOL bChangeDir)
{
	LOA_ASSERT(pGame);

	if(bMoving)
		return true;

	if(bOffsiteOk)																						//如果移动到位了
	{
		if(pGame->IsRandomBattle())
		{
			if(rand()/256<pGame->GetBattleFrequency())
				return pGame->RandomBattle();
		}
		return MoveDown(pGame,bChangeDir);																//判断走下一步
	}
	else																								//否则,移动不到位,继续移动
	{
		RECT rt={0,0,pGame->GetMap()->m_head.Width<<5,pGame->GetMap()->m_head.Height<<5};
		MoveRole(&rt,pGame);
	}
	return true;
}
//-------------------------------------------------------------------------------------------------
//角色往左走
//-------------------------------------------------------------------------------------------------
BOOL CRole::MoveLeft(CGame*pGame,BOOL bChangeDir)
{
	LOA_ASSERT(pGame);

	int TempX=(x>>5)-1;
	int TempY=(y>>5);
	if(TempX>=0 && pGame->GetMap()->m_ppTile[TempX][TempY].bCross==true)
	{
		 
		if(this==pGame->GetPlayer()->pRole)
		{
			if(pGame->GetMap()->m_ppTile[TempX][TempY].flag==LOA_MAP_FLAG_CHANGE_MAP)
			{
				nDirection=LOA_ROLE_DIR_LEFT;
				pGame->LoadMap(pGame->GetMap()->m_ppTile[TempX][TempY].flagdata);
				return false;
			}
			else if(pGame->GetMap()->m_ppTile[TempX][TempY].flag==LOA_MAP_FLAG_LOAD_SCRIPT)
			{
				nDirection=LOA_ROLE_DIR_LEFT;
				int iRev=pGame->ExecuteScript(pGame->GetMap()->m_ppTile[TempX][TempY].flagdata);
				if(iRev==-1)
					return -1;
				return false;
			}
		}
		 
		nDirection=LOA_ROLE_DIR_LEFT;
		RECT rt={0,0,pGame->GetMap()->m_head.Width<<5,pGame->GetMap()->m_head.Height<<5};
		MoveRole(&rt,pGame);

	}
	else
	{
		if(bChangeDir)
		{
			nDirection=rand()%4;
			switch(nDirection)
			{
			case LOA_ROLE_DIR_DOWN:
				MoveDown(pGame,false);
				return true;
			case LOA_ROLE_DIR_UP:
				MoveUp(pGame,false);
				return true;
			case LOA_ROLE_DIR_RIGHT:
				MoveRight(pGame,false);
				return true;
				
			}
		}
		nDirection=LOA_ROLE_DIR_LEFT;
		MoveAni();
	}
	return true;
}
//-------------------------------------------------------------------------------------------------
//判断角色是否能往左走
//-------------------------------------------------------------------------------------------------
BOOL CRole::JudgeAndMoveLeft(CGame*pGame,BOOL bChangeDir)
{
	LOA_ASSERT(pGame);

	if(bMoving)
		return true;

	if(bOffsiteOk)
	{
		if(pGame->IsRandomBattle())
		{
			if(rand()/256<pGame->GetBattleFrequency())
				return pGame->RandomBattle();
		}
		return MoveLeft(pGame,bChangeDir);
	}
	else
	{
		RECT rt={0,0,pGame->GetMap()->m_head.Width<<5,pGame->GetMap()->m_head.Height<<5};
		MoveRole(&rt,pGame);
	}
	return true;
}
//-------------------------------------------------------------------------------------------------
//角色往右走
//-------------------------------------------------------------------------------------------------
BOOL CRole::MoveRight(CGame*pGame,BOOL bChangeDir)
{
	LOA_ASSERT(pGame);

	int TempX=(x>>5)+1;
	int TempY=(y>>5);
	if(TempX<pGame->GetMap()->m_head.Width && pGame->GetMap()->m_ppTile[TempX][TempY].bCross==true)
	{
		 
		if(this==pGame->GetPlayer()->pRole)
		{
			if(pGame->GetMap()->m_ppTile[TempX][TempY].flag==LOA_MAP_FLAG_CHANGE_MAP)
			{
				nDirection=LOA_ROLE_DIR_RIGHT;
				pGame->LoadMap(pGame->GetMap()->m_ppTile[TempX][TempY].flagdata);
				return false;
			}
			else if(pGame->GetMap()->m_ppTile[TempX][TempY].flag==LOA_MAP_FLAG_LOAD_SCRIPT)
			{
				nDirection=LOA_ROLE_DIR_RIGHT;
				int iRev=pGame->ExecuteScript(pGame->GetMap()->m_ppTile[TempX][TempY].flagdata);
				if(iRev==-1)
					return -1;
				return false;
			}
		}
		
		nDirection=LOA_ROLE_DIR_RIGHT;
		RECT rt={0,0,pGame->GetMap()->m_head.Width<<5,pGame->GetMap()->m_head.Height<<5};
		MoveRole(&rt,pGame);
	}
	else
	{
		if(bChangeDir)
		{
			nDirection=rand()%4;
			switch(nDirection)
			{
			case LOA_ROLE_DIR_DOWN:
				MoveDown(pGame,false);
				return true;
			case LOA_ROLE_DIR_UP:
				MoveUp(pGame,false);
				return true;
			case LOA_ROLE_DIR_LEFT:
				MoveLeft(pGame,false);
				return true;
				
			}
		}
		nDirection=LOA_ROLE_DIR_RIGHT;
		MoveAni();
	}
	return true;
}
//-------------------------------------------------------------------------------------------------
//判断角色是否能往右走
//-------------------------------------------------------------------------------------------------
BOOL CRole::JudgeAndMoveRight(CGame*pGame,BOOL bChangeDir)
{
	LOA_ASSERT(pGame);

	if(bMoving)
		return true;

	if(bOffsiteOk)
	{
		if(pGame->IsRandomBattle())
		{
			if(rand()/256<pGame->GetBattleFrequency())
				return pGame->RandomBattle();
		}
		return MoveRight(pGame,bChangeDir);
	}
	else
	{
		RECT rt={0,0,pGame->GetMap()->m_head.Width<<5,pGame->GetMap()->m_head.Height<<5};
		MoveRole(&rt,pGame);
	}
	return true;
}
//-------------------------------------------------------------------------------------------------
//角色是往上走
//-------------------------------------------------------------------------------------------------
BOOL CRole::MoveUp(CGame*pGame,BOOL bChangeDir)
{
	LOA_ASSERT(pGame);

	int TempX=x>>5;
	int TempY=(y>>5)-1;
	if(TempY>=0 && pGame->GetMap()->m_ppTile[TempX][TempY].bCross==true)
	{	
		if(this==pGame->GetPlayer()->pRole)
		{
			if(pGame->GetMap()->m_ppTile[TempX][TempY].flag==LOA_MAP_FLAG_CHANGE_MAP)
			{
				nDirection=LOA_ROLE_DIR_UP;
				pGame->LoadMap(pGame->GetMap()->m_ppTile[TempX][TempY].flagdata);
				return false;
			}
			else if(pGame->GetMap()->m_ppTile[TempX][TempY].flag==LOA_MAP_FLAG_LOAD_SCRIPT)
			{
				nDirection=LOA_ROLE_DIR_UP;
				int iRev=pGame->ExecuteScript(pGame->GetMap()->m_ppTile[TempX][TempY].flagdata);
				if(iRev==-1)
					return -1;
				return false;
			}
		}
		nDirection=LOA_ROLE_DIR_UP;
		RECT rt={0,0,pGame->GetMap()->m_head.Width<<5,pGame->GetMap()->m_head.Height<<5};
		MoveRole(&rt,pGame);
	}
	else
	{
		if(bChangeDir)
		{
			nDirection=rand()%4;
			switch(nDirection)
			{
			case LOA_ROLE_DIR_DOWN:
				MoveDown(pGame,false);
				return true;
			case LOA_ROLE_DIR_LEFT:
				MoveLeft(pGame,false);
				return true;
			case LOA_ROLE_DIR_RIGHT:
				MoveRight(pGame,false);
				return true;
			}
		}
		nDirection=LOA_ROLE_DIR_UP;
		MoveAni();
	}
	return true;
}
//-------------------------------------------------------------------------------------------------
//判断角色是否能往上走
//-------------------------------------------------------------------------------------------------
BOOL CRole::JudgeAndMoveUp(CGame*pGame,BOOL bChangeDir)
{
	LOA_ASSERT(pGame);

	if(bMoving)
		return true;

	if(bOffsiteOk)
	{
		if(pGame->IsRandomBattle())
		{
			if(rand()/256<pGame->GetBattleFrequency())
				return pGame->RandomBattle();
		}
		return MoveUp(pGame,bChangeDir);
	}
	else
	{
		RECT rt={0,0,pGame->GetMap()->m_head.Width<<5,pGame->GetMap()->m_head.Height<<5};
		MoveRole(&rt,pGame);
	}
	return true;
}
//-------------------------------------------------------------------------------------------------
//判断角色是否相碰撞(判断2个矩形是否相交)
//-------------------------------------------------------------------------------------------------
BOOL CRole::IsRoleComboRole(CRole*pRole)
{
	LOA_ASSERT(pRole);

	RECT rt1={x,y,x+32,y+32};
	RECT rt2={pRole->x,pRole->y,pRole->x+32,pRole->y+32};
	int cxLarge,cyLarge;

	if( abs(rt1.left-rt2.right) > abs(rt1.right-rt2.left))
	{
		cxLarge=abs(rt1.left-rt2.right);
	}
	else
	{
		cxLarge=abs(rt1.right-rt2.left);
	}
	cyLarge=abs(rt1.top-rt2.bottom) > abs(rt1.bottom-rt2.top) ? abs(rt1.top-rt2.bottom) : abs(rt1.bottom-rt2.top);
	if(rt1.right-rt1.left+rt2.right-rt2.left > cxLarge
		&& rt1.bottom-rt1.top+rt2.bottom-rt2.top > cyLarge)
		return true;
	return false;
}

⌨️ 快捷键说明

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