我正在尝试为我的Python编程类创建一个太空飞船游戏,我想使用sprite.spritecollideany
来检查我的玩家精灵spaceship
是否与{中的任何小行星精灵碰撞{1}}组,但不管我做什么,它似乎都不起作用。
以下是代码:
spriteGroup
我无法弄清楚为什么碰撞不起作用。
答案 0 :(得分:4)
您的问题是,spaceship
和asteroids
类都没有修改rect
及update
和x
上自己的y
s(他们的命中箱) {1}}属性与该rect的位置没有直接或自动连接。
如果你为self.rect.topleft = self.x, self.y
函数的末尾添加类似update
的内容,那么它们各自的命令(即你的命中框)将移动到它们应该的位置,而不是保留在他们的初始化位置,在这种情况下为player
的(300,550)和...每个小行星的一些半随机偏移(我不确定在哪里,确切地说;我所做的只是做了草率的再现你的代码,然后测试一堆预感。我为没有找到确切的问题的起源而道歉...)
在任何情况下,简短的回答是,虽然你对每个精灵的x和y位置进行了运行检查,但你还没告诉pygame实际将该位置应用于hitbox,< / em>和sprite.spritecollideany
始终为Falsey,因为hitbox自己从未实际触及过。
将self.rect.topleft = self.x, self.y
放在每个sprite类的末尾。 update
函数将修复它。 (确保此行位于函数的末尾且位于def update(self)
内的最低缩进级别!)
修改强>
或者,您可以使用以下内容替换主循环中的update
和player.x = x_ship
,而不是将上述代码添加到player.y = y_ship
。
while keepGoing:
...
player.rect.move_ip(x_ship, y_ship) # move the ship's rect
player.x, player.y = player.rect.topleft # update it's x and y, if you use these elsewhere
for item in spriteGroup: # update the rects for your asteroid objects
item.rect.topleft = item.x, item.y
我会使用update
- 更改解决方案,因为当玩家接近游戏区域的边缘时,此解决方案很可能会让您感到悲伤。仍然是你要考虑的另一种途径。
作为建议,您可以将<Sprite>.x
和<Sprite>.y
分别重新定义为property
和return self.rect.left
return self.rect.top
,以便x和y值固定在你的hitbox的topleft。也是一个二传手。
我不确定您将来如何使用这些参数;如果你愿意,你可能完全消除它们,并使用他们的rect
s&#39;定位器而不是。值得深思!
注意:
我还假设您的所有精灵的x
和y
属性都引用其rect
框的左上角。如果该点应该位于其他地方(例如中心),那么如果您决定使用它,则可能需要对此代码进行调整。