📄 crole.cpp
字号:
{
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 + -