子弹追击目标
最近在开发一种带射击性质的游戏,需要子弹能跟踪目标。就是跟踪算法。
首先来回忆几个三角函数 :
sin(x) 对边/斜边 | 在1,2项限为正,3,4项限为负
cos(x) 邻边/斜边 | 在1,4项限为正,2,3项限为负
tan(x) 对边/邻边 | 在1,3项限为正,2,4项限为负
考虑到游戏里面的坐标系如下所示:
假设子弹坐标为:bullet.getX(), bullet.getY(), 子弹速度: bullet.getSpeed()
int angle = 30; //角度
double directX = (float)Math.cos(angle);
double directY = (float)Math.sin(angle);
// next point
double nextX = bullet.getX() + bullet.getSpeed() * directX * Time(时间);
double nextY = bullet.getY() + bullet.getSpeed() * directY * Time(时间);
在敌人子弹向你发射过来的时候,首先要计算子弹位置与你所在的位置所夹的角度 theta
double deltaX = player.getX() - bullet.getX(); // 注意,是以主角位置为起点 在上图中表示就是x1-x0
double deltaY = player.getY() - bullet.getY(); // y1-y0
为了防止在相除的时候分母为0,做一个判断,使分母近似为0,究竟是负的近似还是正的近似呢?这就需要比较子弹和你的Y坐标谁大谁小了。
if( deltaX == 0 ) {
if (player.getY() >= bullet.getY()) // 子弹需要下移
deltaX = 0.0000001;
else { // 子弹需要上移
deltaX = -0.0000001;
}
}
// 同理,对deltaY作判断
if (deltaY == 0 ) {
if( player.getX() >= bullet.getX() ) // 子弹需要右移
deltaY = 0.0000001;
else { // 子弹需要左移
deltaY = -0.0000001;
}
}
对角度所处的项限作判断
double direct = 0; // 方向
if (deltaX > 0 && deltaY > 0) {
angle = Math.atan(Math.abs(deltaY/deltaX)); // 第一象限
} else if (delatX < 0 && deltaY > 0) {
angle = Math.PI - Math.atan(Math.abs(deltaY/deltaX)); // 第二象限
} else if (delatX < 0 && deltaY < 0) {
angle = Math.PI + Math.atan(Math.abs(deltaY/deltaX)); // 第三象限
} else {
angle = 2 * Math.PI - Math.atan(Math.abs(deltaY/deltaX)); // 第四象限
}
double angle = Math.toDegrees(direct); //转化为角度
知道方向后,试用开始的计算公式就能知道子弹下一个坐标。
参考: — [ 子非あ鱼]