【问题标题】:Pygame head-on collisions not detectingPygame 正面碰撞未检测到
【发布时间】:2014-04-19 21:27:42
【问题描述】:

我对 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

【问题讨论】:

    标签: python-3.x pygame collision


    【解决方案1】:

    由于您使用的是组,您可能希望使用此函数来处理组之间的冲突:

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

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

    如果两个参数都为 True,您可以从列表中删除这两个参数。当您学习如何使用 groupcollide 时,您会发现它非常有用。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-06-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多