因此,首先您需要获取从玩家到光标的矢量距离。减去两个点就可以得到它们之间的向量:
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]
最后,您想要velocity向量。你可以通过相乘方向(单位向量)除以速度。
因为您希望向 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]
, and bullet_vector
最终成为[0.5743665268941905, 1.2923246855119288]
,一个矢量,以速度指向相同的东南方向sqrt(2)
.
这说明它可以往东南方向走(如果你想去exactly东南方向,换乘8号线至mouse = Point(30.0, 45.0)
),它可以向除 8 个罗盘点以外的方向行驶,并且始终以相同的速度行驶。