Grund:
Der Kollisionstest basiert auf dem Rect-Attribut des Sprite-Objekte, um festzustellen, ob sie sich überschneiden. Allerdings stellt die get_rect()-Methode in Ihrem Code die Position des Rechtecks nicht richtig auf die beabsichtigten Koordinaten ein.
Lösung:
Bei Verwendung von get_rect() können Sie die Position mit Schlüsselwortargumenten angeben oder sie dem virtuellen Attribut oben links des Rechtecks zuweisen. Verwenden Sie diesen korrigierten Code:
self.rect = self.image.get_rect(topleft=(self.x, self.y))
Grund:
Sie haben den Sprites unnötige x- und y-Attribute hinzugefügt, anstatt sich darauf zu verlassen von der Position des Rechtecks. Daher wird die Position des Rechtecks immer auf (0, 0) gesetzt, da Oberflächenobjekte keine Standardposition haben.
Lösung:
Entfernen Sie die x- und y-Attribute und verwenden Sie das rect-Attribut, um die Position der Sprite-Objekte festzulegen. Hier ist der korrigierte Code:
class Ball(pygame.sprite.Sprite): def __init__(self): pygame.sprite.Sprite.__init__(self) self.image = pygame.image.load("ball.png") self.rect = self.image.get_rect(topleft=(280, 475)) self.col = False
Sie können Ihren Code weiter vereinfachen, indem Sie eine pygame.sprite.Group zum Verwalten der Sprite-Objekte verwenden. Dadurch wird das Zeichnen und Aktualisieren automatisch durchgeführt.
obstacle = Obstacle() ball = Ball() # Create a sprite group and add the sprites to it. all_sprites = pygame.sprite.Group([obstacle, ball]) while not crashed: # [... event handling and game logic] gameDisplay.fill((255, 255, 255)) # Draw all sprites using the group's draw method. all_sprites.draw(gameDisplay) # [... other game loop tasks]
Das obige ist der detaillierte Inhalt vonWarum gibt meine Pygame-Kollisionserkennung immer „True' zurück und warum ist die Position meines Bildrechtecks fälschlicherweise auf (0, 0) eingestellt?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!