You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java游戏开发中弹朝向光标射击接近±90度时速度异常过快问题

问题根因

你当前的移动逻辑是固定x轴每步移动1像素,再通过斜率反推y的坐标,这种实现下子弹的实际移动速度会随角度变化:

  • 角度接近0/180度时,斜率接近0,y几乎不变,每帧总位移就是1像素,速度正常
  • 角度接近±90度时,斜率趋近于无穷大,x每走1像素,y会跳转数十甚至上百像素,每帧总位移远大于1,就会出现超速现象
    同时当前实现还存在cursorPos.x和currentX相等时,斜率计算触发除以零异常的隐患。

修复方案

改用方向向量归一化的方式实现固定速度移动,无论朝向什么角度,子弹每帧的总位移都保持一致,彻底解决速度不均的问题。

修正后代码

public void run() {
    super.run();
    final double startY = y;
    final double startX = x;
    // 自定义子弹每帧移动速度,数值越大速度越快
    final double BULLET_SPEED = 1.0;

    // 计算初始位置指向光标的方向向量
    double deltaX = cursorPos.x - startX;
    double deltaY = cursorPos.y - startY;
    // 计算向量模长
    double distance = Math.sqrt(deltaX * deltaX + deltaY * deltaY);
    // 归一化方向向量(模长转为1)
    double dirX = deltaX / distance;
    double dirY = deltaY / distance;

    // 用double存储中间坐标避免精度丢失
    double currentX = startX;
    double currentY = startY;

    while (true) {
        try {
            // 按固定速度更新坐标
            currentX += dirX * BULLET_SPEED;
            currentY += dirY * BULLET_SPEED;
            // 赋值给实际坐标变量
            x = (int) currentX;
            y = (int) currentY;

            Thread.sleep(5);
        } catch (InterruptedException e) {
            e.printStackTrace();
            break; // 线程中断后退出循环,避免无限运行
        }
    }
}

内容的提问来源于stack exchange,提问作者Almogbb

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 13:45:07