Files
mir_server/server/LogicServer/skill/PosRotate.cpp

392 lines
8.0 KiB
C++
Raw Normal View History

2025-01-09 17:45:40 +08:00

#include "StdAfx.h"
#include "SkillSubSystem.h"
INT_PTR CSkillSubSystem::GetDirection(INT_PTR nX, INT_PTR nY, INT_PTR nTargetX, INT_PTR nTargetY)
{
INT_PTR Result = 4;
if (nTargetX < nX)
{
if (nTargetY < nY)
Result = 7;
else if (nTargetY == nY)
Result = 6;
else Result = 5;
}
else if (nTargetX == nX)
{
if (nTargetY < nY)
Result = 0;
else Result = 4;
}
else
{
if (nTargetY < nY)
Result = 1;
else if (nTargetY == nY)
Result = 2;
else Result = 3;
}
return Result;
}
void CSkillSubSystem::GetPosition(INT_PTR nX, INT_PTR nY, INT_PTR nDir, INT_PTR nStep, INT_PTR &nNewX, INT_PTR &nNewY)
{
switch(nDir & 7)
{
case 0:
nNewX = nX;
nNewY = nY - nStep;
break;
case 1:
nNewX = nX + nStep;
nNewY = nY - nStep;
break;
case 2:
nNewX = nX + nStep;
nNewY = nY;
break;
case 3:
nNewX = nX + nStep;
nNewY = nY + nStep;
break;
case 4:
nNewX = nX;
nNewY = nY + nStep;
break;
case 5:
nNewX = nX - nStep;
nNewY = nY + nStep;
break;
case 6:
nNewX = nX - nStep;
nNewY = nY;
break;
case 7:
nNewX = nX - nStep;
nNewY = nY - nStep;
break;
}
}
/* 计算坐标旋转
* cX X
* cY Y
* nX X相对坐标
* nY Y相对坐标
* nDir (07)
* &nNewX X
* &nNewY Y
*/
void CSkillSubSystem::PositionRotation(INT_PTR cX, INT_PTR cY, INT_PTR nX, INT_PTR nY, INT_PTR nDir, INT_PTR &nNewX, INT_PTR &nNewY)
{
INT_PTR nDistX, nDistY, nFixedY, nFixedX, nNewDir;
nDir = nDir & 7;
if ((nDir == 0) || ((nX == cX) && (nY == cY)))
{
nNewX = nX;
nNewY = nY;
}
else
{
nDistX = nX - cX;
nDistY = nY - cY;
if (nDistX == 0)
{
nDir = (GetDirection( cX, cY, nX, nY ) + nDir) & 7;
if (nDistY < 0)
nDistY = -nDistY;
GetPosition( cX, cY, nDir, nDistY, nNewX, nNewY );
}
else if (nDistY == 0)
{
nDir = (GetDirection( cX, cY, nX, nY ) + nDir) & 7;
if (nDistX < 0)
nDistX = -nDistX;
GetPosition( cX, cY, nDir, nDistX, nNewX, nNewY );
}
else if (abs(nDistX) == abs(nDistY))
{
nDir = (GetDirection( cX, cY, nX, nY ) + nDir) & 7;
if (nDistX < 0)
nDistX = -nDistX;
GetPosition( cX, cY, nDir, nDistX, nNewX, nNewY );
}
else
{
if (nDistX < 0)
{
if (nDistY < 0) //fourth quadrant
{
if (nDistX < nDistY)
{
nFixedY = nDistX - nDistY;
nNewY = nY + nFixedY;
nNewDir = (GetDirection( cX, cY, nX, nNewY ) + nDir) & 7;
GetPosition( cX, cY, nNewDir, -nDistX, nNewX, nNewY );
switch(nDir)
{
case 1:
case 2:
nNewX = nNewX + nFixedY;
break;
case 3:
case 4:
nNewY = nNewY + nFixedY;
break;
case 5:
case 6:
nNewX = nNewX - nFixedY;
break;
case 7:
nNewY = nNewY - nFixedY;
break;
}
}
else
{
nFixedX = nDistY - nDistX;
nNewX = nX + nFixedX;
nNewDir = (GetDirection( cX, cY, nNewX, nY ) + nDir) & 7;
GetPosition( cX, cY, nNewDir, -nDistY, nNewX, nNewY );
switch(nDir)
{
case 1:
nNewX = nNewX - nFixedX;
break;
case 2:
case 3:
nNewY = nNewY - nFixedX;
break;
case 4:
case 5:
nNewX = nNewX + nFixedX;
break;
case 6:
case 7:
nNewY = nNewY + nFixedX;
break;
}
}
}
else
{
if (-nDistX < nDistY) //thired quadrant
{
nFixedX = nDistY + nDistX;
nNewX = nX - nFixedX;
nNewDir = (GetDirection( cX, cY, nNewX, nY ) + nDir) & 7;
GetPosition( cX, cY, nNewDir, nDistY, nNewX, nNewY );
switch(nDir)
{
case 1:
case 2:
nNewY = nNewY + nFixedX;
break;
case 3:
case 4:
nNewX = nNewX - nFixedX;
break;
case 5:
case 6:
nNewY = nNewY - nFixedX;
break;
case 7:
nNewX = nNewX + nFixedX;
break;
}
}
else
{
nFixedY = nDistX + nDistY;
nNewY = nY - nFixedY;
nNewDir = (GetDirection( cX, cY, nX, nNewY ) + nDir) & 7;
GetPosition( cX, cY, nNewDir, -nDistX, nNewX, nNewY );
switch(nDir)
{
case 1:
nNewY = nNewY + nFixedY;
break;
case 2:
case 3:
nNewX = nNewX - nFixedY;
break;
case 4:
case 5:
nNewY = nNewY - nFixedY;
break;
case 6:
case 7:
nNewX = nNewX + nFixedY;
break;
}
}
}
}
else
{
if (nDistY < 0) //first quadrant
{
if (-nDistX < nDistY)
{
nFixedY = nDistX + nDistY;
nNewY = nY - nFixedY;
nNewDir = (GetDirection( cX, cY, nX, nNewY ) + nDir) & 7;
GetPosition( cX, cY, nNewDir, nDistX, nNewX, nNewY );
switch(nDir)
{
case 1:
nNewY = nNewY + nFixedY;
break;
case 2:
case 3:
nNewX = nNewX - nFixedY;
break;
case 4:
case 5:
nNewY = nNewY - nFixedY;
break;
case 6:
case 7:
nNewX = nNewX + nFixedY;
break;
}
}
else
{
nFixedX = nDistY + nDistX;
nNewX = nX - nFixedX;
nNewDir = (GetDirection( cX, cY, nNewX, nY ) + nDir) & 7;
GetPosition( cX, cY, nNewDir, -nDistY, nNewX, nNewY );
switch(nDir)
{
case 1:
case 2:
nNewY = nNewY + nFixedX;
break;
case 3:
case 4:
nNewX = nNewX - nFixedX;
break;
case 5:
case 6:
nNewY = nNewY - nFixedX;
break;
case 7:
nNewX = nNewX + nFixedX;
break;
}
}
}
else //second quadrant
{
if (nDistX < nDistY)
{
nFixedX = nDistY - nDistX;
nNewX = nX + nFixedX;
nNewDir = (GetDirection( cX, cY, nNewX, nY ) + nDir) & 7;
GetPosition( cX, cY, nNewDir, nDistY, nNewX, nNewY );
switch(nDir)
{
case 1:
nNewX = nNewX - nFixedX;
break;
case 2:
case 3:
nNewY = nNewY - nFixedX;
break;
case 4:
case 5:
nNewX = nNewX + nFixedX;
break;
case 6:
case 7:
nNewY = nNewY + nFixedX;
break;
}
}
else
{
nFixedY = nDistX - nDistY;
nNewY = nY + nFixedY;
nNewDir = (GetDirection( cX, cY, nX, nNewY ) + nDir) & 7;
GetPosition( cX, cY, nNewDir, nDistX, nNewX, nNewY );
switch(nDir)
{
case 1:
case 2:
nNewX = nNewX + nFixedY;
break;
case 3:
case 4:
nNewY = nNewY + nFixedY;
break;
case 5:
case 6:
nNewX = nNewX - nFixedY;
break;
case 7:
nNewY = nNewY - nFixedY;
break;
}
}
}
}
}
}
}
/*
* Comments:,(nX,nY)(nRotateTargetX,nRotateTargetY)nNewXnNewY
* Param int nRotateTargetX:x
* Param int nRotateTargetY:y
* Param int nX:x
* Param int nY:y
* Param int & nNewX:x
* Param int & nNewY:y
* @Return void:
*/
void CSkillSubSystem::AccurateRotation( INT_PTR nRotateTargetX,INT_PTR nRotateTargetY,INT_PTR nX,INT_PTR nY,INT_PTR &nNewX,INT_PTR &nNewY)
{
if(nRotateTargetX ==0) //如果是在y轴上
{
//不旋转
if(nRotateTargetY ==0)
{
nNewX = nX;
nNewY = nY;
}
else if(nRotateTargetY >0)
{
nNewX = 0;
double R = (double)(nX * nX + nY * nY); //旋转半径的平方和
nNewY = (int) sqrt(R);
}
else
{
nNewX = 0;
double R = (double)(nX * nX + nY * nY); //旋转半径的平方和
nNewY = (int)(-sqrt(R));
}
}
else
{
double k2= (double)(nRotateTargetY * nRotateTargetY) /(nRotateTargetX * nRotateTargetX); //k的平方
double R =(double) (nX * nX + nY * nY); //旋转半径的平方和
if(nRotateTargetX >=0)
{
nNewX =(INT_PTR) sqrt ( R/(1 + k2 ));
}
else
{
nNewX =-1* (INT_PTR)sqrt ( R/(1 + k2 ));
}
nNewY = (INT_PTR)((double)nRotateTargetY/nRotateTargetX * nNewX); //y= kx
}
}