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

子弹追击目标

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

首先来回忆几个三角函数

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

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

参考: — [ 子非あ鱼]

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值