使对象沿AB点创建的线移动

问题描述 投票:0回答:1

[在我的previous question我已经解释了细节]

如果您观察下面的图像,您会注意到有一个Bullet对象,它来自点A(x1,y1),另外两个点是BC。现在,当Bullet被创建时,它获得target的最后已知位置并保存它。然后,它应该前往该点并进一步直到它与任何其他物体碰撞。

所以,我的问题是:如何使Bullet对象沿A和B之间的线移动,然后继续在相同的路径中,除非被另一个块阻止?想象一下用真枪射击目标;只要目标移动自己,子弹就会行进。这就是我想要实现的目标。 enter image description here

java vector trigonometry
1个回答
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)向量添加到此结果向量。 (请注意,所有这些只是2d运动学,如果您想要更多地探索这一点,有许多在线资源。

这将在给定时间x产生子弹的yt位置。然后,当您更新xy位置时,您将需要实现一些碰撞检测功能/算法来检测子弹是否已击中某些东西。由于我真的不知道你是如何组织代码的,所以我无法就最佳方法给出具体的建议,但这里有一些指示。

首先,我建议将屏幕上的对象放在列表/地图中。此外,我建议您制作简单形状的对象(即方形,圆形),以便检查是否发生碰撞相对容易。或者,您可以使碰撞成为某种颜色,然后检查子弹位置的颜色值是否与此颜色匹配。如果是,则表示发生了碰撞。所有这些只是想法,但实际上还有更多(可能稍微好一点)的方法。

看看你之前的问题,我注意到你尝试使用角度。虽然它确实是一种有效的方法,但我认为这个解决方案相对简单地理解并避免了三角测量的一切。

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

© www.soinside.com 2019 - 2024. All rights reserved.