Maison >développement back-end >Tutoriel Python >Pourquoi ma détection de collision Pygame renvoie-t-elle toujours vrai et pourquoi la position de mon rectangle d'image est-elle incorrectement définie sur (0, 0) ?
Raison :
Le test de collision repose sur l'attribut rect du Sprite des objets pour déterminer s'ils se croisent. Cependant, la méthode get_rect() dans votre code ne définit pas correctement la position du rectangle aux coordonnées prévues.
Solution :
Lors de l'utilisation de get_rect() , vous pouvez spécifier la position avec des arguments de mots-clés ou l'attribuer à l'attribut virtuel supérieur gauche du rectangle. Utilisez ce code corrigé :
self.rect = self.image.get_rect(topleft=(self.x, self.y))
Raison :
Vous avez ajouté des attributs x et y inutiles aux sprites au lieu de vous fier sur la position du rectangle. Par conséquent, la position du rectangle est toujours définie sur (0, 0) car les objets Surface n'ont pas de position par défaut.
Solution :
Supprimer les attributs x et y et utilisez l'attribut rect pour définir la position des objets Sprite. Voici le code corrigé :
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
Vous pouvez simplifier davantage votre code en utilisant un pygame.sprite.Group pour gérer les objets Sprite. Cela gérera automatiquement le dessin et la mise à jour.
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]
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!