碰撞不适用于pygame Sprites

时间:2014-12-16 05:58:35

标签: python pygame collision-detection sprite rect

我正在尝试为我的Python编程类创建一个太空飞船游戏,我想使用sprite.spritecollideany来检查我的玩家精灵spaceship是否与{中的任何小行星精灵碰撞{1}}组,但不管我做什么,它似乎都不起作用。

以下是代码:

spriteGroup

我无法弄清楚为什么碰撞不起作用。

1 个答案:

答案 0 :(得分:4)

您的问题是,spaceshipasteroids类都没有修改rectupdatex上自己的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)内的最低缩进级别!)

修改

或者,您可以使用以下内容替换主循环中的updateplayer.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分别重新定义为propertyreturn self.rect.left return self.rect.top,以便x和y值固定在你的hitbox的topleft。也是一个二传手。

我不确定您将来如何使用这些参数;如果你愿意,你可能完全消除它们,并使用他们的rect s&#39;定位器而不是。值得深思!

注意:

我还假设您的所有精灵的xy属性都引用其rect框的左上角。如果该点应该位于其他地方(例如中心),那么如果您决定使用它,则可能需要对此代码进行调整。