Dépannage de la détection de collision et du positionnement des sprites
Dans votre code, vous rencontrez deux problèmes : la fonction collide_rect renvoie systématiquement « True », même alors que ce n'est pas le cas, et la position du rectangle représentant les sprites semble être (0, 0).
Parlons d'abord de la détection de collision. La raison pour laquelle collide_rect renvoie toujours « True » est que vous ne définissez pas correctement la position des rectangles. pygame.Surface.get_rect() renvoie un objet rectangle avec les dimensions de la surface, mais il commence toujours à (0, 0). Pour placer le rectangle à la position du sprite, vous devez utiliser l'une de ces méthodes :
self.rect = self.image.get_rect(topleft=(self.x, self.y))
ou
self.rect = self.image.get_rect() self.rect.topleft = (self.x, self.y)
En définissant l'attribut topleft du rectangle, vous êtes explicitement en l'alignant avec la position du sprite.
En ce qui concerne la position incorrecte du sprite, vous avez introduit des attributs self.x et self.y inutiles. Il est préférable de s'appuyer directement sur la position du rectangle. Ceci est un exemple avec les attributs supprimés et la position en haut à gauche définie dans l'appel get_rect() :
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))
De plus, vous pouvez choisir d'utiliser un pygame.sprite.Group pour gérer le rendu des sprites et mise à jour. Cela simplifie le processus de dessin car il dessine tous les sprites du groupe :
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)
Veuillez noter que les méthodes Ball.update() et Obstacle.update() peuvent être supprimées si vous utilisez un groupe car elles se chargera de mettre à jour la position du sprite et de dessiner l'image à l'écran.
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!