2016-10-01 145 views
1

製作一個快速程序,用戶在屏幕另一側拍攝移動目標。用戶可以錯過目標3次,然後遊戲結束。我正在檢測未命中並相應地將它們添加到總數中,但是當目標和子彈之間發生碰撞(一次命中!)時,我從總數中減去重置它的次數。現在我只希望它減去「1」,但由於某種原因,它正在減去一堆,並搞亂了一切。任何想法爲什麼會發生這種情況,有沒有更好的方法來做到這一點?目標是一個pygame.Rect,子彈是精靈,船是一個圖像。Pygame碰撞檢測Bug

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 

回答

2

如果我理解正確發生了什麼,當子彈與目標發生碰撞時,它在每個正在碰撞的幀都這樣做。如果它在十幀內與目標碰撞,那麼它將減去十次。

解決這個問題的方法是在碰撞第一幀碰撞後摧毀目標,或者在第一次碰撞時摧毀子彈。

談到目標爲簡單的精靈,用bullet_hit = pygame.sprite.spritecollide(target, bullets, True)

更換 bullet_hit = pygame.sprite.spritecollideany(target, bullets)

應該從雪碧組中刪除它「消滅」子彈。 這可能不適用於您的程序,但它應該有助於瞭解導致問題的原因(來自同一目標上同一子彈的多個碰撞)。

+0

好東西,你是對的。我嘗試了你的建議,但無法實現它,所以我採取了骯髒/懶惰的方式,並從「stats.number_of_misses」中減去「.10」,然後將其轉換爲「int」來計算幀。我會玩弄其他選擇。這個問題的主要問題是我假設每次都是10幀。不知道如何找到確切的數量,但這似乎現在工作。非常感謝你的幫助! – terratunaz