随机精灵运动和碰撞python

时间:2015-01-05 00:51:25

标签: python pygame collision-detection sprite

我在pygame中使用python制作一个pacman风格的游戏。目前我正在创造pacman在迷宫周围避开的幽灵/怪物。我已经创建了这些并尝试添加随机运动进行碰撞检测,以便它们绕过迷宫,而不仅仅是整个屏幕。这些怪物的代码如下。我的问题是,Monster似乎略微跳了一下,几乎没有移动,我怎么能得到,像pacman鬼一样顺利地穿过迷宫呢?任何帮助是极大的赞赏。

1 个答案:

答案 0 :(得分:3)

我无法在计算机上测试您的代码,因为出于某种原因,python会返回一些错误。但是让我分一下你的代码分析。

问题似乎来自这两行:

self.rect.x += random.randint(-1,1)
self.rect.y += random.randint(-1,1)

位于update(self)功能下方。

因为你将怪物设置为"更新"每次屏幕刷新时,每次调用更新时,怪物都会随机向上,向下,向左或向右移动一个像素。您的更新"函数每次调用一个从-1到1的随机数。因此,你的怪物要么在每个屏幕上垂直和水平移动+1或0或-1像素。结果,它们显得摇摆不定,根本无法移动。

您想要的平稳运动是为了您的更新"使你的怪物在一个恒定的方向上移动的功能。

我不确定你的游戏的最佳方式,但我建议:(我的代码只是一个指南,它们可能包含错误)

给Monster类一个名为" dir"的变量或属性。它代表着方向。在开始上课时,请给出" dir"从1到4的随机值(代表向上,向下,向左和向右)

self.dir = random.randint(1,4)

然后,在你的"更新(自我)"函数,写一些if这样的语句:

if self.dir == 1: #Moving up
    self.rect.y+=1;

if self.dir == 2: #Moving down
    self.rect.y-=1;

if self.dir == 3: #Moving left
    self.rect.x-=1;

if self.dir == 4: #Moving right
    self.rect.x+=1;

这样,你的怪物一次只向左或向右移动一个方向。

有了这个,我认为你必须修改你的"检查碰撞"代码也是如此。让你的代码改变你的怪物的方向,取决于它击中的墙壁的哪一部分。

希望这有帮助! :)

修改

你的第二个问题是你的怪物没有正确碰撞墙壁。这是你的代码:

if self.rect.x > -1: # Moving right; Hit the left side of the wall
    self.rect.right = wall.rect.left
if self.rect.x < 0: # Moving left; Hit the right side of the wall
    self.rect.left = wall.rect.right
if self.rect.y < -1: # Moving down; Hit the top side of the wall
    self.rect.bottom = wall.rect.top
if self.rect.y > 0: # Moving up; Hit the bottom side of the wall
    self.rect.top = wall.rect.bottom

我发现你根据它的位置检查怪物的方向是很奇怪的。以if self.rect.x > -1:为例。 "self.rect.x"实际上是你怪物的x坐标。所以这并不表示你的怪物的方向。因此,我认为您不能在self.rect.x语句中使用self.rect.yif进行冲突。

相反,请考虑使用&#34; dir&#34;我刚推荐你 我将为您更改第一行,您可以完成其余部分。

if self.dir == 4: # Moving right; Hit the left side of the wall
self.rect.right = wall.rect.left

在那之后,你的怪物会停下来,因为它会再次向同一方向移动但是这段代码会停止它。所以,你必须再次随机改变它的方向。只要确保它不再选择相同的方向。我现在将此作为一个谜题留给你。

编辑2:

您提到您的碰撞不适用于顶部和底部。

在我到达你的错误之前花了一段时间;)

if self.dir == 1: #Moving up
    self.rect.y+=2;

if self.dir == 2: #Moving down
    self.rect.y-=2;

我认为你互换了y+=2y=-2。所以你上下移动的动作是互换的。