当前位置: 首页 > 知识库问答 >
问题:

随机精灵运动和碰撞python

朱欣荣
2023-03-14

我正在制作一个吃豆人风格的游戏,在pygame中使用蟒蛇。目前,我正在创造吃豆人必须在迷宫周围避免的幽灵/怪物。我已经创建了这些,并试图添加随机运动碰撞检测,以便它们在迷宫中移动,而不仅仅是整个屏幕。这些怪物的代码是波纹管。我的问题是,怪物似乎有点跳来跳去,几乎一动不动,我怎么能像吃豆人幽灵一样顺利地穿过迷宫?任何帮助都非常感谢。

共有1个答案

华景明
2023-03-14

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

问题似乎源于以下两行:

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

它位于更新(自我)功能下方。

因为你设置你的怪物在每次屏幕刷新时“更新”,所以每次你调用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

我发现你根据怪物的位置来检查它们的方向很奇怪。如果self.rect.x,则取< code >

相反,考虑使用我刚才推荐的“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。所以你的上下移动运动是互换的。

 类似资料:
  • 这就是正在发生的事情,游戏不断停止,因为两个圆圈相互碰撞,我正在尝试通过确保ID是正方形ID来防止这种情况,我试图让圆圈碰撞在一起,而忽略碰撞,但它没有这样做,我不知道如何确切地阻止它相互碰撞,只允许它与正方形碰撞。 基本上我想阻止这个圆与另一个圆碰撞,并允许它与正方形碰撞。 任何帮助都会很好谢谢 游戏引擎引擎类 这是我在扩展game.engine.engine包的game类中检查冲突的地方。 游

  • 在开始学习相关知识点之前,我们有必要先学习精灵和碰撞检测的含义。 精灵(英文译为 Sprite),其实在一个游戏程序中,精灵本质指的是一张张小尺寸的图片,比如游戏中的各种道具、人物、场景装饰等,它们都可以看做成一张张小的“精灵”图。除此之外,人物的移动也可以看做是一系列小精灵图构成的序列(按帧组成的序列),如下图所示: 图1:动作逐帧分解图 如果将逐帧分解后的动作,按照一定的频率播放,那么就形成了

  • 在get_hit=pyGame.sprite的第82行,我检查sprite碰撞的移动时,它会给出错误提示:“:File”c:\Users\pc\VS_PYTHON_PY\pyGame.PY“。”。spritecollide(Player,敌方,True)文件“C:\python py\lib\site packages\pygame\sprite.py”,第1682行,位于spritecrolli

  • 我在PyGame中创建了两个简单的精灵,其中一个是雨伞,另一个是雨滴。雨滴被添加到一个名为< code>all_sprites的sprite组中。伞精灵有自己的组,名为< code>Umbrella_sprite 雨滴从屏幕顶部“落下”,如果其中一个碰到雨伞/与雨伞碰撞..雨滴应该被删除了。但是除了特定雨滴之外,所有其他雨滴都受此影响。

  • 我已经寻找并找到了单个碰撞的答案,但我正在寻找一种检测多种类型的碰撞的方法。我正在制作一个游戏,其中有3个我想要的碰撞。用户飞机与敌方子弹相撞,用户子弹与敌机相撞(我已经工作过),敌方子弹与用户子弹相撞。我已经设置并更正了所有类别BitMask和contactTestBitMask。这是我的委托方法。

  • 我一直在学习一些pygame教程,并且基于这些教程开发了自己的代码。具体如下: 所以我想出了如何让我的家伙跳跃,但是我已经在天空中放置了一个块并试图这样做: 试图让角色停止跳跃。有没有一个内置的函数来测试这一点,或者有没有一个适合我的方法。顺便说一下,这是行不通的,我似乎也不知道该怎么做。非常感谢任何帮助:)