2016-10-01 4 views
1

Erstellen eines schnellen Programms, in dem ein Benutzer auf ein bewegliches Ziel auf der gegenüberliegenden Seite des Bildschirms schießt. Der Benutzer kann das Ziel 3 mal verfehlen und dann ist das Spiel vorbei. Ich erkenne die Fehler und füge sie der Summe entsprechend hinzu, aber wenn es eine Kollision zwischen dem Ziel und der Kugel gibt (ein Treffer!) Subtrahiere ich von der Summe und setze sie im Wesentlichen zurück. Jetzt erwarte ich nur, dass es "1" subtrahiert, aber aus irgendeinem Grund subtrahiert es einen Haufen und bringt alles durcheinander. Irgendwelche Ideen, warum dies passiert und gibt es einen besseren Weg, dies zu tun? Ziel ist ein Pygame.Rect, Geschosse sind Sprites und Schiff ist ein Bild.Pygame Collision Detection 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 

Antwort

2

Wenn ich verstehe, was richtig geschieht, wenn die Kugel mit dem Ziel kollidiert es so auf jedem Rahmen tut, dass es zu kollidieren. Wenn es mit dem Ziel über zehn Frames kollidiert, wird es zehnmal subtrahieren.

Eine Lösung wäre, das Ziel zu zerstören, nachdem es im ersten Bild der Kollision kollidiert ist, oder das Geschoss bei der ersten Kollision zu zerstören.

Drehen der Ziele in einfaches Sprites und ersetzt bullet_hit = pygame.sprite.spritecollideany(target, bullets)

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

Sollte „zerstören“ die Kugel durch sie von der Sprite-Gruppe zu entfernen. Dies ist möglicherweise nicht auf Ihr Programm anwendbar, aber es sollte hoffentlich eine Vorstellung davon geben, was das Problem verursacht (mehrere Kollisionen von demselben Geschoss auf demselben Ziel).

+0

Gute Sachen, du hast absolut Recht. Ich habe Ihren Vorschlag ausprobiert, aber ich konnte es nicht zum Laufen bringen, also nahm ich den dreckigen/faulen Ausweg und subtrahierte ".10" von "stats.number_of_misses" und konvertierte ihn dann in ein "int", um die Frames zu berücksichtigen. Ich werde mit anderen Alternativen spielen. Das Hauptproblem dabei ist, dass ich davon ausgehe, dass es jedes Mal 10 Frames sein wird. Nicht sicher, wie man die genaue Menge findet, aber das scheint jetzt zu funktionieren. Vielen dank für Deine Hilfe! – terratunaz