Python - PyGame - 学习向量/动画

标签 python pygame vector-graphics

所以,我在数学方面不是最有见识的,希望得到一些急需的反馈。 对于初学者来说,我的目标只是让图像追逐我的鼠标。发生了几件我没想到会收到反馈的事情。

1) 追逐非常严格,以一种非常...“有角度”的方式跟随鼠标,仅在屏幕上似乎设置的点(中间 x 轴、中间 y 轴和对角线)。

2) 我希望速度保持恒定,但图像越靠近鼠标移动得越快。

3) 当图像到达鼠标时,它“弹弓”经过鼠标,造成模糊的狂乱,而不是到达鼠标位置并停止。

这些是我主要关心的问题,但如果您看到任何我可能误解的内容,请告诉我。我非常想了解整个矢量/三角函数(很快进入物理学)。

def follow (self):
    mouse_pos = pygame.mouse.get_pos()
    diff = (self.xPos-mouse_pos[0], self.yPos-mouse_pos[1])
    vector = math.sqrt(diff[0]**2 + diff[1]**2)
    distance = (self.xPos/vector, self.yPos/vector)

    if (self.xPos, self.yPos) == mouse_pos:
        return
    if mouse_pos[0] >= self.xPos:
        self.xPos += distance[0]
    else:
        self.xPos -= distance[0]
    if mouse_pos[1] >= self.yPos:
        self.yPos += distance[1]
    else:
        self.yPos -= distance[1]

(整个程序可以在这里看到 http://ideone.com/6OxWLi )

在此先感谢您的帮助!

最佳答案

我不知道你的变量 vectordistance 是什么意思,但 IMO 应该交换它们的名称。在您的代码中,vectordiff 向量的长度,它是使用毕达哥拉斯定理计算的:

d^2 = dx^2 + dy^2
d = sqrt(dx^2 + dy^2)

在您的代码中,有一个distance 变量,它是位置向量,只是归一化了(除以它自己的长度)。这就是为什么我宁愿交换他们的名字。此外,更有趣的是规范化形式的 diff 向量。所以宁愿这样做:

distance = math.sqrt(diff[0]**2, diff[1]**2) # instead of `vector = ...`
diff_norm = (diff[0] / distance, diff[1] / distance) # instead of `distance = ...`

从现在开始,每次我编写 distance 时,我都假设您已经交换了名称,并且指的是距离值,而不是归一化向量。与 vector 相同,从现在开始我将其称为 diff_norm(归一化差异向量)。

现在,针对您的问题:

1) 和 2) 当您使用 diff_norm 向量(归一化差异向量而不是归一化位置向量,这真的没有意义 :P)时应该更好。

3) 您的图像位置 (self.xPos, self.yPos) 不太可能恰好在任何时候的鼠标位置。因为你使用 float 作为你的位置(python 为你做),它们可能永远不会精确地在像素上。所以您的图像永远不会完全在鼠标位置。因此,与其编写 (self.xPos, self.yPos) == mouse_pos,不如检查图像与鼠标的距离是否真的很近,例如少于 1 或 2 个像素:

if distance <= 2: return

此外,您不需要最后的所有 if/else - diff_norm 向量可以有负值,所以您不需要检查它们是否为负 - 只需减去来自位置向量的 diff_norm 向量,如下所示:

self.xPos -= diff[0]
self.yPos -= diff[1]

关于Python - PyGame - 学习向量/动画,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14142282/

相关文章:

python - 我可以在 pyspark mapPartitions 中使用多线程吗?

Python Asyncio & Websocket 如何避免全局变量?

python - cx_Freeze : “No module named ' codecs'” Windows 10

python - 如何在 python 中获取我的系统支持的所有屏幕分辨率

python - 生成 PDF 文件,绘制带圆角的多边形

python - Vigenère Cipher 函数实现

python - 从python中的特定索引值排序列表

python - 在列表中位图传送图片时程序崩溃

c# - 无尖点的线偏移(平行线)

python - 将多个矢量形状与低浪费空间相结合