[在我的previous question上,我已经解释了详细信息]
如果您观察下面的图片,您会注意到有一个Bullet
对象,它起源于点A(x1,y1)
,另外两个点分别是B
和{{ 1}}。现在,创建C
时,它将获得Bullet
的最后一个已知位置并保存。然后,应该走到那个点,直到它与任何其他物体碰撞为止。
因此,我对您的问题是:如何使target
对象沿着A和B之间的直线移动,然后继续以相同的路径行驶,除非被另一个块挡住了?想象一下用实枪射击目标;即使目标移动了,子弹也会尽可能地移动。那就是我想要达到的目标。
答案 0 :(得分:0)
要获取在给定时间t
处以一定速度v
行进的子弹的位置(可以任意选择),我们可以按照以下步骤进行操作。我将假设发射子弹时的t=0
。 (如果您愿意的话,也可以将其设置为dt
(增量时间),这没有什么区别
(1 / sqrt((x2-x1)^2 + (y2-y1)^2)) * (x2-x1, y2-y1)
给出。当子弹被“发射”时,一次创建此向量,并且不要更改它,因为子弹保持在恒定的轨迹上。 (您可以将向量设为Bullet
类的成员以保存它,只是一个想法)v
。我应该注意,如果您愿意,可以忽略此变量,因为可以在t
中进行解释,但是从物理学的角度来看,包含它是很直观的。t
(其中t是某个时间),然后将原始点(x1, y1)
向量添加到此结果向量中。 (请注意,所有这些只是二维运动学,如果您想进一步探索,则有很多在线资源。这将在给定时间x
产生子弹的y
和t
位置。然后,在更新x
和y
位置时,您将需要实现一些碰撞检测功能/算法以检测子弹是否击中了物体。由于我不太了解代码的组织方式,因此无法为您提供最佳的建议,但是这里有一些建议。
首先,我建议将屏幕上显示的对象放在列表/地图中。另外,我建议您将对象做成简单的形状(即正方形,圆形),这样相对容易检查是否发生了碰撞。或者,可以将碰撞设置为某种颜色,然后检查子弹位置的颜色值是否与此颜色匹配。如果是这样,那么您就知道发生了碰撞。所有这些只是想法,但实际上还有很多(也许稍微更好)的方法。
看着上一个问题,我注意到您尝试使用角度。尽管这当然是一种有效的方法,但我认为此解决方案相对简单,易于理解并避免了所有这些问题的三角方面。
无论如何,我希望我回答了你的问题。如果您对此有任何疑问,请发表评论/问题。