2013-01-03 42 views
4

所以,我不是数学知识最丰富的,并希望得到一些急需的反馈。 我的首要目标就是让图像追逐我的鼠标。有一些事情我没有想到我想要反馈意见。Python - PyGame - 学习矢量/动画

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

在此先感谢您的帮助!

回答

3

我不知道你的变数vectordistance是什么意思,但是他们的名字应该交换。在代码中,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)正好在任何点的鼠标位置。因为你为你的位置使用浮点数(python为你做),它们可能永远不会在像素上。所以你的图片永远不会在鼠标位置正好。因此,不要写(self.xPos, self.yPos) == mouse_pos,而应该检查图像与鼠标的距离是否非常接近,例如,不到1个或两个像素:

if distance <= 2: return 

而且,你并不需要所有的if/else在结束 - 的diff_norm向量可以有负值,所以你并不需要检查,如果它们是消极的 - 只需从位置矢量中减去diff_norm矢量,如下所示:

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

刚刚完成更改。它完美的作品。我了解了一点,但仍不是100%。非常感谢您的回答! – jtsmith1287

+0

你可能想观看[this](https://www.khanacademy.org/math/linear-algebra/vectors_and_spaces/vectors/v/linear-algebra--introduction-to-vectors) - 介绍矢量,由khanacademy .ORG。他在数学上解释了vector *是什么*以及它的含义*。请务必观看后续的视频! – opatut