2016-10-01 22 views
1

ユーザーが画面の反対側にある移動するターゲットで瞬時に撮影するクイックプログラムを作成します。ユーザーはターゲットを3回逃すことができ、その後ゲームは終了します。私はミスを検出してそれに応じて合計に加算しますが、ターゲットと弾(ヒット!)の間に衝突があると、合計から本質的にリセットします。今私はそれが "1"を引くことを期待しているだけですが、なんらかの理由でそれは束を引いてすべてを邪魔しています。なぜこれが起こっているか、これを行うためのより良い方法があるかについての任意のアイデア?ターゲットはパイゲームです。レクト、弾丸はスプライト、船はイメージです。Pygame衝突検出バグ

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

私が正しく何が起こっているのか分かっていると、弾丸がターゲットと衝突しているとき、衝突しているすべてのフレームで弾丸が衝突しています。それが10フレームにわたってターゲットと衝突する場合、それは10回を減算することになります。

これに対する解決策は、衝突の最初のフレームに衝突した後にターゲットを破壊すること、または最初の衝突で弾を破壊することです。

簡単なスプライトにターゲットを回すとスプライトグループからそれを削除することによって弾丸を「破壊する」べきbullet_hit = pygame.sprite.spritecollide(target, bullets, True)

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

を交換します。 これはあなたのプログラムには当てはまらないかもしれませんが、何が原因で起こっているのかを知ることができます(同じターゲット上の同じ箇条書きからの複数の衝突)。

+0

良いこと、あなたは絶対に正しいです。私はあなたの提案を試みたが、それを動作させることができなかったので、汚れた/怠け者の方法を取り除き、 "stats.number_of_misses"から ".10"を引いて、それをフレームのために "int"に変換した。私は他の選択肢で遊んでいきます。これの主な問題は、毎回10フレームになるという前提で実行していることです。正確な金額を見つける方法がわからないが、これは今のところうまくいくようだ。あなたの助けをありがとう! – terratunaz