我正在pygame中使用python制作pacman风格的游戏。目前我正在创造pacman必须避开迷宫的鬼怪/怪物。我创造了这些,并尝试添加碰撞检测的随机移动,以便他们绕过迷宫,而不是遍布屏幕。这些怪物的代码是波纹管。我的问题是,Monster
似乎略有跳动,几乎没有动作,我怎么能得到,顺利通过像pacman鬼迷宫?任何帮助是极大的赞赏。随机精灵运动和碰撞python
回答
我无法在计算机上测试您的代码,因为某些原因,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.x
或self.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+=2
和y=-2
。所以你的上下运动是互换的。
- 1. 如何随机移动精灵和保持碰撞工作 - Cocos2d?
- 2. Xna碰撞移动精灵
- 3. 与精灵碰撞
- 4. Phaser P2碰撞杀死碰撞精灵
- 5. Cocos2D随机精灵运动
- 6. 工作精灵碰撞
- 7. 两个精灵的碰撞
- 8. 的cocos2d精灵碰撞
- 9. 与UIImageView碰撞的精灵
- 10. 精灵碰撞Andengine(Android)
- 11. 精灵和碰撞检测cocos2d android
- 12. Cocos2d,旋转(透明)精灵碰撞
- 13. 更新碰撞精灵只有
- 14. cocos2d精灵碰撞检测包围盒
- 15. Android AndEngine:简单的精灵碰撞
- 16. 查找两个精灵的碰撞点
- 17. 不能让我的精灵碰撞?
- 18. SpriteKit中的精灵之间的碰撞
- 19. XNA剑精灵碰撞检测
- 20. AndEngine:两个精灵的碰撞
- 21. 阅读精灵,检测碰撞
- 22. 碰撞检测后显示精灵
- 23. 检测精灵之间的碰撞
- 24. cocos2d旋转精灵碰撞检测
- 25. 具有基本精灵碰撞的AtrributeError
- 26. 精灵熄灭屏幕碰撞
- 27. 精灵碰撞的单元格中心
- 28. 如何检测精灵表的精灵帧的碰撞
- 29. 与另一个精灵作为父母的精灵碰撞
- 30. 移动精灵但不会与Phaser中的其他精灵碰撞
哦,我明白了!是的,精灵现在顺利移动谢谢你!由于它有你没有的图像,所以它可能不适用于你的图像,我试图通过在图像中添加不同的值来改变碰撞,检查左侧碰撞似乎正常,但没有其他方向!你能提出任何价值吗?再次感谢! – alfiej12
为了方便起见,我已经将整个游戏添加到了代码中,如果您将怪物类中的#loadbackground和self.image中的图像名称更改为与代码具有相同文件的任何图像,则代码将起作用好的,再次感谢你! – alfiej12
不,这个错误不是关于图像,因为我放置了我自己的图像。错误说''super()至少需要1个参数(0给出)“' – Sciffany