Heim >Backend-Entwicklung >Python-Tutorial >Warum ist meine Pygame-Kollisionserkennung immer wahr und warum sind meine Sprites bei (0, 0) positioniert?
Fehlerbehebung bei der Kollisionserkennung und Sprite-Positionierung
In Ihrem Code treten zwei Probleme auf: Die Funktion collide_rect gibt durchweg sogar „True“ zurück wenn dies nicht der Fall sein sollte und die Position des Rechtecks, das die Sprites darstellt, scheinbar (0, 0).
Befassen wir uns zunächst mit der Kollisionserkennung. Der Grund, warum collide_rect immer „True“ zurückgibt, liegt darin, dass Sie die Position der Rechtecke nicht richtig festlegen. pygame.Surface.get_rect() gibt ein Rechteckobjekt mit den Abmessungen der Oberfläche zurück, beginnt jedoch immer bei (0, 0). Um das Rechteck an der Position des Sprites zu platzieren, müssen Sie eine dieser Methoden verwenden:
self.rect = self.image.get_rect(topleft=(self.x, self.y))
oder
self.rect = self.image.get_rect() self.rect.topleft = (self.x, self.y)
Indem Sie das Attribut „oben links“ des Rechtecks festlegen, sind Sie explizit dabei Richten Sie es an der Position des Sprites aus.
Was die falsche Sprite-Position betrifft, haben Sie unnötige self.x- und self.y-Attribute eingeführt. Es ist besser, sich direkt auf die Position des Rechtecks zu verlassen. Dies ist ein Beispiel, bei dem die Attribute entfernt und die Position oben links im get_rect()-Aufruf festgelegt wurde:
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 class Obstacle(pygame.sprite.Sprite): def __init__(self): pygame.sprite.Sprite.__init__(self) self.image = pygame.image.load("obstacle.png") self.rect = self.image.get_rect(topleft=(1000, 483))
Zusätzlich können Sie sich dafür entscheiden, eine pygame.sprite.Group zu verwenden, um das Sprite-Rendering zu verarbeiten und Aktualisierung. Dies vereinfacht den Zeichenvorgang, da alle Sprites in der Gruppe gezeichnet werden:
all_sprites = pygame.sprite.Group([obstacle, ball]) while not crashed: # [...] gameDisplay.fill((255,255,255)) all_sprites.draw(gameDisplay) pygame.display.flip() clock.tick(1000)
Bitte beachten Sie, dass die Methoden Ball.update() und Obstacle.update() entfernt werden können, wenn Sie eine Gruppe als solche verwenden kümmert sich um die Aktualisierung der Sprite-Position und das Zeichnen des Bildes auf dem Display.
Das obige ist der detaillierte Inhalt vonWarum ist meine Pygame-Kollisionserkennung immer wahr und warum sind meine Sprites bei (0, 0) positioniert?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!