Maison > développement back-end > Tutoriel Python > Pourquoi ma détection de collision Pygame est-elle toujours vraie et pourquoi mes sprites sont-ils positionnés à (0, 0) ?

Pourquoi ma détection de collision Pygame est-elle toujours vraie et pourquoi mes sprites sont-ils positionnés à (0, 0) ?

Mary-Kate Olsen
Libérer: 2024-12-16 19:52:28
original
287 Les gens l'ont consulté

Why is my Pygame collision detection always True, and why are my sprites positioned at (0, 0)?

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))
Copier après la connexion

ou

self.rect = self.image.get_rect()
self.rect.topleft = (self.x, self.y)
Copier après la connexion

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))
Copier après la connexion

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)
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal