以A,B的一致速度移动对象

Cab*_*ose 6 java game-physics

我正在尝试创建自己的原始2D图形游戏引擎.游戏的核心部分是向敌人发射不同的射弹.在我继续工作之前,我需要让这个组件工作.

我现在所拥有的是沿着穿过起点(x,y)和目标点(x1,x2)的线移动我的射弹.我利用了线性函数y = mx + b.问题在于我如何更新射弹的位置会导致速度不一致,具体取决于线的斜率.(更大的斜坡使它更快地移开).

这是我正在运行的游戏循环的核心结构:

    private void executeGameLoop() 
    {

        long nextFrameStart = System.nanoTime();
        while(panel.getRunning()) 
        {
            do 
            {
                panel.update();
                nextFrameStart += FRAME_PERIOD;
            } while(nextFrameStart < System.nanoTime());

            long remaining = nextFrameStart - System.nanoTime();
            panel.repaint();

            if (remaining > 0) 
            {
                try 
                {
                    Thread.sleep(remaining / 1000000);
                } 
                catch(Throwable e) 
                {
                System.out.println(e.getMessage()); 
                }
            }
        }
    }
Run Code Online (Sandbox Code Playgroud)

这只是更新结构和图形的机制.panel.update在某些情况下,每当这个叫炮弹更新它的位置时.以下是更新射弹的方法:

这告诉射弹它有一个目标并设置有关该线的信息.

public void setHasTarget(boolean hasTargetIn)
    {
        if(hasTargetIn)
        {
            deltaX = getTargetX() - getX();
            deltaY = getTargetY() - getY();
            slope = deltaY / deltaX;
            intercept = getY();
            System.out.println("y = " + slope + "x + " + intercept); //line the projectile will follow
        }
        hasTarget = hasTargetIn;
    }
Run Code Online (Sandbox Code Playgroud)

下一个方法将位置设置为该行的下一步.(X由速度更新,y根据x更新)

public void setNext()
        {
            float temp = (slope) * (getX() + velocity) + intercept;
            System.out.println("Slope: " + (slope) * (getX() + velocity));
            System.out.println("Current: (" + getX() + ", " + getY() + ")");
            System.out.println("Next: (" + (getX() + velocity)  + ", " + (getY() + temp) + ")");
            setX(getX() + velocity);
            setY(temp);
        }
Run Code Online (Sandbox Code Playgroud)

最后一个方法调用setNext()并由主循环调用.

public void update()
        {
            if(hasTarget)
                setNext();
        }
Run Code Online (Sandbox Code Playgroud)

正如我所说,根据我目前的代码,我运行时的结果是一个弹丸,它以不一致的速度在屏幕上移动,这取决于线的斜率.我希望能够改变我的代码,以便射弹在任何轨迹上以一致的速率在屏幕上移动.预先感谢您的任何帮助.

Bin*_*ews 10

通常,处理定向运动的最佳方法是使用三角法.你的射弹需要两件事:方向(弧度)和速度.

你需要的三个三角函数是sin,cos和arctan

要更新你的X: setX(getX() + (speed * Math.cos(direction)));

要更新你的Y: setY(getY() + (speed * Math.sin(direction)));

用于计算方向: Math.atan(slope)

您应该添加字段direction,并speed到类,并将其声明为双打.

public void setHasTarget(boolean hasTargetIn)
{
    if (hasTargetIn)
    {
        deltaX = getTargetX() - getX();
        deltaY = getTargetY() - getY();
        direction = Math.atan(deltaY / deltaX); // Math.atan2(deltaY, deltaX) does the same thing but checks for deltaX being zero to prevent divide-by-zero exceptions
        speed = 5.0;
    }
    hasTarget = hasTargetIn;
}

public void setNext()
{
    setX(getX() + (speed * Math.cos(direction)));
    setY(getY() + (speed * Math.sin(direction)));
}
Run Code Online (Sandbox Code Playgroud)