4

我用 pygame 帮助我的朋友,但我们被困住了

所以我们正试图获得弹丸的方向,但我们不知道如何

例如:

[1,1] 将走向 SE

[1,-1] 将走向东北

[-1,-1] 将走向 NW

和 [-1,1] 将转到 SW

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

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

def update(self):

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

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

4

1 回答 1

10

因此,首先您要获取从玩家到光标的矢量距离。减去两点可以得到它们之间的向量

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

现在,您想将其归一化为单位向量。为此,您只需获得范数(通过勾股定理),然后将向量除以范数:

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

最后,你想要速度矢量。你可以通过将方向(单位向量)乘以速度来得到它。

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

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

就是这样。


这里,您可以看到此代码有效。(这是一个交互式可视化工具,因此如果有任何您不理解的部分,您可以逐步完成。)

我在 处创建了一个玩家[10.0, 25.0],并在 处创建了一个通常(但不完全)东南方向的鼠标指针[30.0, 70.0]bullet_vector最终为[0.5743665268941905, 1.2923246855119288]一个向量,该向量以 速度 指向相同的东南方向sqrt(2)

这表明它可以向东南方向行驶(如果要准确地向东南方向行驶,请将第 8 行更改为mouse = Point(30.0, 45.0)),它可以向 8 个罗盘点以外的方向行驶,并且始终以相同的速度行驶。

于 2013-06-27T00:50:15.820 回答