当角度接近 90 时,子弹变得超快

Bullets become super fast as the angle gets closer 90

所以我正在 Java 中开发一款游戏,我正在尝试将子弹射向光标位置 - 射击部分没问题,但由于光标和玩家之间的角度(玩家射击子弹所以本质上是子弹的第一个坐标)接近 90(或 -90)子弹飞得超快,我不知道为什么

The red zone is the super-speed zone

代码:

    public void run() {
        super.run();
        final double currentY=y;
        final double currentX=x;

        double slope = (cursorPos.y - currentY) / (cursorPos.x - currentX);
        double angle= Math.toDegrees(Math.atan2(cursorPos.y - currentY, cursorPos.x - currentX));
        System.out.println(angle);
        while (true){
            try {
                double newY;// y = m * (x-x.) + y.
                newY = ((slope*(x - currentX))+currentY);
                y= (int) newY;
                if ((angle <=-90 && angle>=-180) || (angle >=90 && angle<=180) )
                {
                    x--;
                }
                else {
                    x++;
                }
                Thread.sleep(5);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }

您正在按固定增量 1 及时步进 x。所以当子弹线接近垂直时,斜率 m 是一个很大的数字,并且它们在 y 中每步覆盖 m 个像素。越接近垂直,他们走得越快。

相反,您需要沿着子弹跟随的线段以固定的距离增量步进。如果端点是 (x0,y0) 和 (x1,y1),则在方程 x = t*(x1-x0)+x0 中将 t 从 0 变为 1; y=t*(y1-y0)+y0 将扫描线段。要以 1 个像素为单位扫描,您需要知道沿线有多少个像素。那是 L = sqrt(sqr(x1-x0) + sqr(y1-y0)),所以 t 的值为 i / L for i = 0 to L.

您需要使用浮点数进行这些计算。

另一个注意事项是,您最终可能会像现在这样使用 Sleep 时遇到麻烦。这会阻止 Swing 事件处理循环在等待时执行任何工作。