【问题标题】:Finding Vectors with 2 points查找具有 2 个点的向量
【发布时间】:2013-06-27 00:41:05
【问题描述】:

我正在帮助我的朋友玩一个 pygame,但我们被卡住了

因此正试图获得弹丸的方向,但我们无法找到方法

例如:

[1,1] 将走向 SE

[1,-1] 将向东北方向移动

[-1,-1] 将向西北方向移动

并且 [-1,1] 将变为 SW

我们需要某种方程,将玩家 pos 和鼠标 pos 找出射弹需要去的方向

这里是我们插入向量的地方:

def update(self):

    self.rect.x += self.vector[0]
    self.rect.y += self.vector[1]

然后我们在 rects coords 处对射弹进行 blitting

【问题讨论】:

  • 这个等式背后的规则是什么?玩家是否朝从玩家到鼠标光标的矢量方向射击?还是从屏幕中心到鼠标光标?或者是其他东西?她是否仅限于 8 个罗盘方向,还是可以在两者之间的任意角度射击?
  • 玩家可以从任何方向射击说玩家在玩家前面点击箭头将直接向前如果玩家在角色后面点击箭头将返回单词所以给定鼠标位置和我们需要找到箭头需要去哪个方向的玩家位置

标签: python vector pygame direction


【解决方案1】:

因此,首先您要获取从玩家到光标的矢量距离。 Subtracting two points gives you the vector between them:

distance = [mouse.x - player.x, mouse.y - player.y]

现在,你想normalize that to a unit vector。为此,您只需获得范数(通过Pythagorean theorem),然后将向量除以范数:

norm = math.sqrt(distance[0] ** 2 + distance[1] ** 2)
direction = [distance[0] / norm, distance[1] / norm]

最后,您需要velocity 向量。您可以通过multiplying 方向(单位矢量)通过速度来获得。

由于您希望向 SE 发射的子弹具有矢量 [1, 1],因此您(可能)希望所有子弹以该速度矢量的速度移动,即 sqrt(2)(再次由勾股定理)。所以:

bullet_vector = [direction[0] * math.sqrt(2), direction[1] * math.sqrt(2)]

就是这样。


Here 你可以看到这段代码在工作。 (这是一个交互式的可视化工具,所以如果有任何你不明白的部分,你可以一步一步来。)

我在[10.0, 25.0] 创建了一个播放器,在[30.0, 70.0] 处创建了一个大致(但不完全)东南方向的鼠标指针,bullet_vector 最终成为[0.5743665268941905, 1.2923246855119288],一个指向同一方向的向量一般东南方向,速度sqrt(2).

这表明它可以去东南(如果你想准确地去东南,把8号线换成mouse = Point(30.0, 45.0)),它可以去8个罗盘点以外的方向,而且它总是以同样的速度前进。

【讨论】:

  • 这似乎只适用于 8 个指南针方向,但它根本不会去 SE?
  • 您的 xy 值是整数吗?如果是这样,您需要将它们转换为float。 (您可以通过在 norm 行中使用 ** 2.0 而不是 ** 2 来做到这一点。)
  • 同时,这些是正确的公式。如果您需要帮助调试您的代码,您需要实际向我们展示您的代码。 (理想情况下,一个小型的、可运行的 SSCCE 可以演示问题。)
  • 代码有效,因为如果我使用斜率公式,它有效,但我无法调节速度,所以我不能这样做
  • @ChristianCareaga:我不明白最后的评论。 “调节速度”是什么意思,为什么不能做,还有什么因为它不能做?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-07-19
  • 2017-09-29
  • 1970-01-01
  • 1970-01-01
  • 2021-12-15
  • 2020-11-01
  • 2020-05-07
相关资源
最近更新 更多