【问题标题】:random sprite movement and collision python随机精灵运动和碰撞python
【发布时间】:2015-01-05 00:51:24
【问题描述】:

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

【问题讨论】:

    标签: python pygame collision-detection sprite


    【解决方案1】:

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

    问题似乎来自这两行:

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

    在您的 update(self) 函数下方。

    由于您将怪物设置为每次屏幕刷新时“更新”,每次您调用 update 时,您的怪物都会随机向上、向下、向左或向右移动一个像素。您的“更新”函数每次调用一个从 -1 到 1 的随机数。因此,您的怪物在垂直和水平刷新每个屏幕时移动 +1 或 0 或 -1 像素。结果,它们看起来摇摆不定,根本不动。

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

    我不确定进行游戏的最佳方式,但我的建议如下:(我的代码仅供参考,它们可能包含错误)

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

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

    然后,在你的“update(self)”函数中,写一些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 &gt; -1: 为例。 "self.rect.x" 实际上是你的怪物的 x 坐标。所以这根本不表明你的怪物的方向。所以我不认为你可以在你的if 声明中使用self.rect.xself.rect.y 来进行碰撞。

    相反,请考虑使用我刚刚向您推荐的“目录”。 我会为您更改第一行,其余的您可以完成。

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

    【讨论】:

    • 哦,对了,我明白了!是的,精灵现在可以顺利移动,谢谢!而且它可能对你没有用,因为它有你没有的图像,我试图通过在其中放置不同的值来改变碰撞,检查左碰撞似乎有效,但没有其他方向!你能提出任何价值观吗?再次感谢!
    • 为方便起见,我已将整个游戏添加到代码中,如果您将 Monster 类中的 #loadbackground 和 self.image 中的图像名称更改为您在同一文件中的任何图像代码然后代码就可以正常工作了,再次感谢您!
    • 不,错误与图像无关,因为我放置了自己的图像。错误说"super() takes at least 1 argument (0 given)"
    • 我已经研究过这个和左右碰撞,似乎工作但不是顶部或底部。如果有什么你可以建议我可能哪里出错了?更新的碰撞代码在代码中。谢谢。
    • 只是一个提示,您只需在代码self.dir = random.randint(1,4) 中的if 块之后添加一次此行。我又添加了我的答案。
    猜你喜欢
    • 2014-05-23
    • 1970-01-01
    • 1970-01-01
    • 2012-03-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-25
    相关资源
    最近更新 更多