八方向坐标的游戏地图中,怪物( pos1 )要向玩家( pos2 )发起技能攻击的时候,需要计算出玩家 ( pos2 ) 相对于怪物 ( pos1 ) 所处的方向才能使技能正确攻击到玩家。下面我们来看一段 秦美人实现的判断两个坐标相对方向的代码:
double angle = Math. atan ((( double ) (pos2.getY() – pos1.getY())) / -(pos2.getX() – pos1.getX()));
double angle22d5 = Math. PI / 8;
double angle67d5 = Math. PI / 2 – angle22d5;
if (angle > -angle22d5 && angle <= angle22d5) {
if (pos1.getX() < pos2.getX()) {
return 2;
} else {
return 6;
}
} else if (angle > angle22d5 && angle <= angle67d5) {
if (pos1.getX() < pos2.getX()) {
return 1;
} else {
return 5;
}
} else if (angle > -angle67d5 && angle <= -angle22d5) {
if (pos1.getX() < pos2.getX()) {
return 3;
} else {
return 7;
}
} else {
if (pos1.getY() < pos2.getY()) {
return 4;
} else {
return 0;
}
}
首先第一行 double angle = Math. atan ((( double ) (pos2.getY() – pos1.getY())) / -(pos2.getX() – pos1.getX())),这是计算玩家 ( pos2 ) 与怪物 ( pos1 ) 两点直线与x轴正方向的夹角弧度值,atan()中的参数 是计算两点直线的一个斜率( 直线斜率公式:k= ),公式中的负号是作了笛卡儿坐标系统对计算机屏幕坐标系统的坐标转换。
笛卡儿坐标系统中x轴向右为正值,y轴向上为正值;计算机屏幕坐标系统中因为起点在屏幕左上角,虽然x轴同样向右是正值,而y轴却是向下为正值。上图是将 红色坐标(笛卡儿坐标系统)转换为 绿色坐标 (计算机屏幕坐标系统)的过程。
附:同 atan等价的 atan2 弧度计算公式: Math. atan2 ((( double ) (pos2.getY() – pos1.getY())), ( double ) (pos2.getX() – pos1.getX()))
如上图所示两个方向之间的夹角是45度,每个方向占有区域范围也是45度(分别共享相邻两个方向间夹角的一半)。 代码中的 double angle22d5 = Math. PI / 8是计算坐标系中22.5度角的弧度值,等价于 22.5 * Math. PI /180 , double angle67d5 = Math. PI / 2 – angle22d5即是计算 坐标系中67.5度角的弧度值,现在通过计算好的玩家( pos2 )相对于怪物( pos1 )两点直线与x轴正方向的夹角弧度和x座标的相对位置,就可以判断玩家( pos2 )相对于怪物( pos1 )正确方向了。
PS:要感谢一下我们的数学教父(肥皂哥)提供的数学支持!