代码之家  ›  专栏  ›  技术社区  ›  Feelsbadman

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

  •  0
  • Feelsbadman  · 技术社区  · 8 年前

    previous question 我已经解释了细节]

    如果你观察下图,你会发现有一个 Bullet 对象,它源于点 A(x1,y1) ,以及 B 和 C . 现在,当 子弹 创建时,它将获取的最后一个已知位置 target 并保存它。然后,它应该移动到该点,并进一步移动,直到它与任何其他物体碰撞。

    所以,我想问你的问题是: 我该怎么做 子弹 对象沿A&然后继续在同一路径上,除非被另一个块停止? 想象一下用真枪向目标射击;即使目标自行移动,子弹也能移动到尽可能长的距离。这就是我想要达到的目标。
    enter image description here

    1 回复  |  直到 8 年前
        1
  •  0
  •   Alerra    8 年前

    获取子弹在给定时间的位置 t v (您可以任意选择),我们可以按照以下步骤操作。我假设 t=0 当子弹发射时。(您可以调整以使其成为 dt

    1. 首先找到表示子弹方向的(标准化)向量。这将由 (1 / sqrt((x2-x1)^2 + (y2-y1)^2)) * (x2-x1, y2-y1) Bullet 类来保存它,只是一个想法)
    2. 接下来,将其乘以标量 . 我应该注意,如果您愿意,您可以忽略这个变量,因为它可以在 ,但从物理学的角度来看,将其包括在内是很直观的。
    3. 最后,要得到位置,只需将该向量乘以 其中t是某个时间,然后添加原点 (x1, y1) 向量到这个结果向量。(请注意,所有这些都只是二维运动学,如果您想进一步了解这一点,有许多在线资源。

    这将产生 x y T . 然后,当您更新 和 位置,您需要实现一些碰撞检测功能/算法来检测子弹是否击中了物体。因为我不知道你是如何组织代码的,所以我不能给你具体的建议,告诉你最好的方法,但这里有一些建议。

    首先,我建议将屏幕上的对象放在列表/地图中。此外,我建议将对象制作为简单形状(即正方形、圆形),以便相对容易地检查是否发生碰撞。或者,可以将碰撞设置为特定颜色,然后检查项目符号位置处的颜色值是否与该颜色匹配。如果是这样,那么您就知道发生了碰撞。所有这些都只是想法,但实际上还有更多(或许更好)的方法。

    看看你之前的问题,我注意到你试图使用角度。虽然这确实是一种有效的方法,但我认为这种解决方案相对简单,可以避免三角函数方面的问题。

    不管怎样,我希望我回答了你的问题。如果您对此有任何进一步的疑问,请留下评论/问题。