使对象沿着由AB Points创建的直线行进

时间:2018-09-16 20:48:53

标签: java vector trigonometry

[在我的previous question上,我已经解释了详细信息]

如果您观察下面的图片,您会注意到有一个Bullet对象,它起源于点A(x1,y1),另外两个点分别是B和{{ 1}}。现在,创建C时,它将获得Bullet的最后一个已知位置并保存。然后,应该走到那个点,直到它与任何其他物体碰撞为止。

因此,我对您的问题是:如何使target对象沿着A和B之间的直线移动,然后继续以相同的路径行驶,除非被另一个块挡住了?想象一下用实枪射击目标;即使目标移动了,子弹也会尽可能地移动。那就是我想要达到的目标。
enter image description here

1 个答案:

答案 0 :(得分:0)

要获取在给定时间t处以一定速度v行进的子弹的位置(可以任意选择),我们可以按照以下步骤进行操作。我将假设发射子弹时的t=0。 (如果您愿意的话,也可以将其设置为dt(增量时间),这没有什么区别

  1. 首先找到将指示子弹方向的(归一化)向量。这将由(1 / sqrt((x2-x1)^2 + (y2-y1)^2)) * (x2-x1, y2-y1)给出。当子弹被“发射”时,一次创建此向量,并且不要更改它,因为子弹保持在恒定的轨迹上。 (您可以将向量设为Bullet类的成员以保存它,只是一个想法)
  2. 接下来,将其乘以标量v。我应该注意,如果您愿意,可以忽略此变量,因为可以在t中进行解释,但是从物理学的角度来看,包含它是很直观的。
  3. 最后,要获取位置,只需将此向量乘以t(其中t是某个时间),然后将原始点(x1, y1)向量添加到此结果向量中。 (请注意,所有这些只是二维运动学,如果您想进一步探索,则有很多在线资源。

这将在给定时间x产生子弹的yt位置。然后,在更新xy位置时,您将需要实现一些碰撞检测功能/算法以检测子弹是否击中了物体。由于我不太了解代码的组织方式,因此无法为您提供最佳的建议,但是这里有一些建议。

首先,我建议将屏幕上显示的对象放在列表/地图中。另外,我建议您将对象做成简单的形状(即正方形,圆形),这样相对容易检查是否发生了碰撞。或者,可以将碰撞设置为某种颜色,然后检查子弹位置的颜色值是否与此颜色匹配。如果是这样,那么您就知道发生了碰撞。所有这些只是想法,但实际上还有很多(也许稍微更好)的方法。

看着上一个问题,我注意到您尝试使用角度。尽管这当然是一种有效的方法,但我认为此解决方案相对简单,易于理解并避免了所有这些问题的三角方面。

无论如何,我希望我回答了你的问题。如果您对此有任何疑问,请发表评论/问题。