392 lines
8.0 KiB
C++
392 lines
8.0 KiB
C++
|
||
#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 旋转方向(0到7)
|
||
* &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)方向以后得到新的位置(nNewX,nNewY)
|
||
* 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
|
||
}
|
||
|
||
} |