制作一个快速程序,用户在屏幕另一侧的移动目标上进行拍摄。用户可以错过目标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
答案 0 :(得分:2)
如果我理解正确发生的事情,当子弹与目标发生碰撞时,它会在每个碰撞的帧上这样做。如果它与目标碰撞超过十帧,那么它将减去十次。
对此的解决方案是在碰撞的第一帧碰撞后摧毁目标,或在第一次碰撞时摧毁子弹。
将目标转换为简单的精灵并替换
bullet_hit = pygame.sprite.spritecollideany(target, bullets)
bullet_hit = pygame.sprite.spritecollide(target, bullets, True)
应该通过从精灵组中删除子弹来“销毁”子弹。 这可能不适用于您的程序,但它应该可以确定导致问题的原因(来自同一目标的同一子弹的多次碰撞)。