2015-01-05 110 views
1

我正在pygame中使用python制作pacman风格的游戏。目前我正在创造pacman必须避开迷宫的鬼怪/怪物。我创造了这些,并尝试添加碰撞检测的随机移动,以便他们绕过迷宫,而不是遍布屏幕。这些怪物的代码是波纹管。我的问题是,Monster似乎略有跳动,几乎没有动作,我怎么能得到,顺利通过像pacman鬼迷宫?任何帮助是极大的赞赏。随机精灵运动和碰撞python

回答

3

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

这个问题似乎是从以下两行出现:

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

这是你的update(self)功能下面。

由于您将怪物设置为“更新”每次屏幕刷新,因此每次您致电更新时,怪物会随机向上,向下,向左或向右移动一个像素。你的“更新”函数每次调用一个从-1到1的随机数。所以,你的怪物要么以垂直和水平方向刷新+1或0或-1像素的方式刷新。因此,它们看起来很滑,并且根本不在任何位置移动。

你想要一个平稳的运动是你的“更新”功能移动你的怪物在一个恒定的方向。

我不知道去了解你的游戏的最佳方式,但这里是我的建议:(我的代码只是一个指导性的,可能包含错误)

给怪物类变量或属性称为“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坐标。所以这并不表示你的怪物的方向。所以我不认为你可以在你的if陈述中使用self.rect.xself.rect.y进行碰撞。

取而代之,请考虑使用我刚推荐给您的“dir”。 我会改变你的第一行,你可以做它的其余部分。

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。所以你的上下运动是互换的。

+0

哦,我明白了!是的,精灵现在顺利移动谢谢你!由于它有你没有的图像,所以它可能不适用于你的图像,我试图通过在图像中添加不同的值来改变碰撞,检查左侧碰撞似乎正常,但没有其他方向!你能提出任何价值吗?再次感谢! – alfiej12

+0

为了方便起见,我已经将整个游戏添加到了代码中,如果您将怪物类中的#loadbackground和self.image中的图像名称更改为与代码具有相同文件的任何图像,则代码将起作用好的,再次感谢你! – alfiej12

+0

不,这个错误不是关于图像,因为我放置了我自己的图像。错误说''super()至少需要1个参数(0给出)“' – Sciffany