2017-09-26 2 views
1

Mein Kollisionscode ist wirklich fehlerhaft, weil die roten 'Kugeln' genau die Mitte des Spielers treffen müssen, um das Spiel über den Bildschirm laufen zu lassen. Ich brauche Hilfe den Ausdruck Refactoring also, wenn die roten ‚Kugeln‘ traf den Spieler überall wird es mein Spiel über Code ausführen (Das Spiel über Code ist am Ende vor pygame.quit())Ich kann meinen Kollisionscode in pygame nicht korrekt finden

import pygame 
import random 
BLACK = (0,0,0) 
WHITE = (255,255,255) 
GREEN = (0,255,0) 
RED = (255,0,0) 
BLUE = (0,0,255) 
pygame.init() 
size = (700,700) 
screen = pygame.display.set_mode(size) 
pygame.display.set_caption("Dodger") 
done = False 
clock = pygame.time.Clock() 

def resetpositions(): 
    global bulletrect1, bulletrect2, bulletrect3, bulletrect4, bulletrect5, circlerect 
    bulletrect1 = pygame.rect.Rect((350, 0, 20, 20)) 
    bulletrect2 = pygame.rect.Rect((175, 0, 20, 20)) 
    bulletrect3 = pygame.rect.Rect((525, 0, 20, 20)) 
    bulletrect4 = pygame.rect.Rect((525, 0, 20, 20)) 
    bulletrect5 = pygame.rect.Rect((525, 0, 20, 20)) 

circlerect = pygame.rect.Rect((350, 600, 20, 20)) 

resetpositions() 
while not done: 
    for event in pygame.event.get(): 
     if event.type == pygame.QUIT: 
      done = True 
     if event.type == pygame.KEYDOWN: 
      circlerect.x += 5 
    bulletrect1.y += 1 
    bulletrect2.y += 2 
    bulletrect3.y += 3 
    bulletrect4.y += 4 
    bulletrect5.y += 5 
    screen.fill(BLACK) 
    pygame.draw.circle(screen, GREEN, (circlerect.center), 15) 
    pygame.draw.circle(screen, RED, (bulletrect1.center), 20) 
    pygame.draw.circle(screen, RED, (bulletrect2.center), 20) 
    pygame.draw.circle(screen, RED, (bulletrect3.center), 20) 
    pygame.draw.circle(screen, RED, (bulletrect4.center), 20) 
    pygame.draw.circle(screen, RED, (bulletrect5.center), 20) 
    if bulletrect1.y == 800: 
     bulletrect1.y = 0 
     bulletrect1.x = random.randint(20,680) 
    if bulletrect2.y == 800: 
     bulletrect2.y = 0 
     bulletrect2.x = random.randint(20,680) 
    if bulletrect3.y == 800: 
     bulletrect3.y = 0 
     bulletrect3.x = random.randint(20,680) 
    if bulletrect4.y == 800: 
     bulletrect4.y = 0 
     bulletrect4.x = random.randint(20,680) 
    if bulletrect5.y == 800: 
     bulletrect5.y = 0 
     bulletrect5.x = random.randint(20,680) 
    if circlerect.x == 685: 
     circlerect.x = 15 
    if circlerect.collidelist((bulletrect1, bulletrect2, bulletrect3, bulletrect4, bulletrect5)) == 0: 
     screen.fill(BLACK) 
     font = pygame.font.SysFont('Calibri',40,True,False) 
     text = font.render("GAME OVER",True,RED) 
     screen.blit(text,[250,350]) 
     pygame.display.update() 
     pygame.time.delay(3000) 
     resetpositions() 
    pygame.display.flip() 
    clock.tick(300) 
pygame.quit() 
+0

Ist es sicher, alle Ihre Objekte zu übernehmen kann als Kreise behandelt werden? Wenn dies der Fall ist, können Sie einfach überprüfen, ob der Abstand zwischen den Zentren einer Kugel (roter Kreis) und eines Spielers (grüner Kreis) kleiner ist als die Summe der Radien dieser beiden Objekte/Kreise. – CodeSurgeon

Antwort

0

pygame.Rect.collidelist kehrt die Index des kollidierenden Rect in der Liste, dh Sie überprüfen nur, ob der circlerect mit dem Bulletrect bei Index 0 kollidiert. Es gibt -1 wenn keine Rects in der Liste kollidieren, so dass, wenn es nicht -1 zurückkehrt, eine der Rects hat mit dem Spieler zusammengestoßen und das Spiel ist vorbei:

if circlerect.collidelist((bulletrect1, bulletrect2, bulletrect3, bulletrect4, bulletrect5)) != -1: 
    # Game over. 
+0

Bitte upvote und akzeptiere hilfreiche Antworten, um sie als gelöst zu markieren. Wenn du eine Antwort akzeptierst, erhältst du 2 Rufpunkte. – skrx

Verwandte Themen