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

我正在尝试创建自己的原始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  0) { try { Thread.sleep(remaining / 1000000); } catch(Throwable e) { System.out.println(e.getMessage()); } } } } 

这只是更新结构和图形的机制。 每次调用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; } 

下一个方法将位置设置为该行的下一步。 (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); } 

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

 public void update() { if(hasTarget) setNext(); } 

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

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

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

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

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

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

您应该将字段directionspeed添加到您的类中,并将它们声明为双精度数。

 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))); }