Python PyGame学习向量/动画

2024-03-29 08:50:52 发布

您现在位置:Python中文网/ 问答频道 /正文

所以,我不是最有数学知识的人,我希望得到一些急需的反馈。 首先,我的目标是让一个图像追逐我的鼠标。有几件事我没想到会得到反馈。在

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

提前感谢您的帮助!在


Tags: pos图像self目标ifdiff鼠标else
1条回答
网友
1楼 · 发布于 2024-03-29 08:50:52

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

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

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

^{pr2}$

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

现在,针对你的问题:

1)和2)在使用diff_norm向量时应该更好(规范化的差分向量而不是规范化的位置向量,这真的没有意义:p)。在

3)图像的位置(self.xPos, self.yPos)在任何一点上都不可能是鼠标的位置。因为你用浮点数来表示你的位置(python为你这样做),它们可能永远不会精确到像素上。所以你的图像永远不会精确到鼠标位置。因此,与其写(self.xPos, self.yPos) == mouse_pos,不如检查图像与鼠标的距离是否真的很近,例如小于1或2个像素:

if distance <= 2: return

另外,您不需要在末尾使用所有if/else,diff_norm向量可以有负值,因此您不需要检查它们是否为负值-只需从位置向量中减去diff\u norm向量,如下所示:

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

相关问题 更多 >