网络游戏-弹道子弹追击目标

来源:互联网 发布:淘宝魅力惠官方旗舰店 编辑:程序博客网 时间:2024/04/29 17:02

子弹追击目标

最近在开发一种带射击性质的游戏,需要子弹能跟踪目标。就是跟踪算法。

首先来回忆几个三角函数

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); //转化为角度

知道方向后,试用开始的计算公式就能知道子弹下一个坐标。

参考: — [ 子非あ鱼]

原创粉丝点击