Pygame正面碰撞未检测到

时间:2014-04-19 21:27:43

标签: python-3.x pygame collision

我是Python的新手,最近我一直致力于在pygame中创建一个小型的太空入侵者风格的游戏。我几乎已经到了尽头,但是如果敌人的船只(阻挡)与我的船(玩家)发生碰撞,发现碰撞,移除我的两艘船并显示一个短的游戏,我想这样做。过"消息。

到目前为止,我有用于检测子弹和敌舰发生碰撞的代码,如果我的船和敌舰发生碰撞,我已经重写了这个代码,但是这个代码只有在我没有射击时才有效,我也必须移动一旦检测到碰撞并且两艘船都消失,我仍然能够从检测到碰撞的位置发射子弹,从一侧到另一侧检测碰撞(碰撞时头部无效)。我不知道为什么会这样。如果有人能帮助我,我肯定会欣赏它。

有问题的代码:

for i in range(15):
    block = Block(BLACK)
    block.rect.x = random.randrange(screen_width)
    block.rect.y = random.randrange(55) # change to 155 collisions fixed
    block_list.add(block)
    all_sprites_list.add(block)

for i in range(1):
    player = Player()
    player.rect.y = 480
    player_list.add(player)
    all_sprites_list.add(player)

...

    for player in player_list:

        player_hit_list = pygame.sprite.spritecollide(block, player_list, True)

        for player in player_hit_list:
            gameover.play()
            player_list.remove(player)
            all_sprites_list.remove(player)
            block_list.remove(block)
            all_sprites_list.remove(block)

     for bullet in bullet_list:

        block_hit_list = pygame.sprite.spritecollide(bullet, block_list, True)

        for block in block_hit_list:
            explosion.play()
            bullet_list.remove(bullet)
            all_sprites_list.remove(bullet)
            score += 10

更新

我现在设法让碰撞得到正确检测,但是一旦船只消失(由于碰撞),我仍然可以开火。一旦发生碰撞,我有什么方法可以隐藏子弹吗?

见下我的更新代码:

for i in range(15):
    block = Block(BLACK)
    block.rect.x = random.randrange(screen_width)
    block.rect.y = random.randrange(55) # change to 155 collisions fixed
    block_list.add(block)
    all_sprites_list.add(block)

for i in range(1):
    player = Player()
    player.rect.y = 480
    player_list.add(player)
    all_sprites_list.add(player)

...

    for player in player_list:

        block_hit_list = pygame.sprite.spritecollide(player, block_list, True)

        for block in block_hit_list:
            gameover.play()
            player_list.remove(player)
            all_sprites_list.remove(player)
            block_list.remove(block)
            all_sprites_list.remove(block)

     for bullet in bullet_list:

        block_hit_list = pygame.sprite.spritecollide(bullet, block_list, True)

        for block in block_hit_list:
            explosion.play()
            bullet_list.remove(bullet)
            all_sprites_list.remove(bullet)
            score += 10

1 个答案:

答案 0 :(得分:1)

由于您正在使用组,因此您可能希望使用此功能来处理组之间的冲突:

会是这样的(我还没试过你的代码)

pygame.sprite.groupcollide(bullet_list, block_up_list, True, True, collided = None)

如果两个参数为True,则从列表中删除两者。当您学习如何使用groupcollide时,您会注意到它非常有用。

无论如何,在pygame文档中查找函数描述并查看一些示例。 希望有所帮助;)