Pygame碰撞检测错误

时间:2016-10-01 08:56:22

标签: python-3.x pygame

制作一个快速程序,用户在屏幕另一侧的移动目标上进行拍摄。用户可以错过目标3次,然后游戏结束。我正在检测未命中并相应地将它们添加到总数中,但是当目标和子弹之间发生碰撞时(命中!)我从总数中减去基本上重置它。现在我只期望它减去" 1"但出于某种原因,它会减少一堆并弄乱一切。关于为什么会发生这种情况的任何想法,是否有更好的方法来做到这一点? Target是pygame.Rect,项目符号是Sprites,ship是图像。

def update_bullets(ai_settings, screen, stats, ship, bullets, target):
    bullets.update()
    for bullet in bullets.copy():
        if bullet.rect.left >= ai_settings.screen_width:
            bullets.remove(bullet)
            stats.number_of_misses += 1
    check_bullet_target_collisions(ai_settings, screen, stats, ship, bullets, target)
    if stats.number_of_misses >= stats.max_number_of_misses:
        stats.number_of_misses = 0
        stats.game_active = False
        bullets.empty()
        pygame.mouse.set_visible(True)      

def check_bullet_target_collisions(ai_settings, screen, stats, ship, bullets, target):      
    bullet_hit = pygame.sprite.spritecollideany(target, bullets)
    if bullet_hit:
        print("how many times")
        stats.number_of_misses -= 1

1 个答案:

答案 0 :(得分:2)

如果我理解正确发生的事情,当子弹与目标发生碰撞时,它会在每个碰撞的帧上这样做。如果它与目标碰撞超过十帧,那么它将减去十次。

对此的解决方案是在碰撞的第一帧碰撞后摧毁目标,或在第一次碰撞时摧毁子弹。

将目标转换为简单的精灵并替换 bullet_hit = pygame.sprite.spritecollideany(target, bullets)

bullet_hit = pygame.sprite.spritecollide(target, bullets, True)

应该通过从精灵组中删除子弹来“销毁”子弹。 这可能不适用于您的程序,但它应该可以确定导致问题的原因(来自同一目标的同一子弹的多次碰撞)。