Sprites collés à la bordure de la fenêtre lorsque la vitesse est inférieure à 1 [dupliquer]

Dec 28 2020

J'essaie de créer des nuages ​​en mouvement pour mon jeu, mais des sprites de nuages ​​collent aux frontières lorsque je règle la vitesse du nuage à moins de 1. Je veux que ce nuage continue de se déplacer si une partie du nuage est déjà en dehors de l'écran. J'ai découvert que les sprites étaient bloqués si x de rect était égal à 0. Comment y remédier?

Mon code:

class Cloud(pygame.sprite.Sprite):
    def __init__(self):
        super(Cloud, self).__init__()
        images = [load_image(f"cloud{i}.png") for i in range(1, 5)]
        self.image = random.choice(images)
        self.rect = self.image.get_rect()

        self.rect.x = random.randrange(WIDTH - self.rect.w)
        self.rect.y = random.randrange(HEIGHT - self.rect.h)

        self.vel = 10 / FPS  # It returns value less then 1

    def update(self, event=None):
        if not event:
            self.rect.x -= self.vel

Réponses

2 Rabbid76 Dec 28 2020 at 21:01

Puisqu'il pygame.Rectest censé représenter une zone à l'écran, un pygame.Rectobjet ne peut stocker que des données intégrales.

Les coordonnées des objets Rect sont toutes des entiers. [...]

La partie fraction des coordonnées est perdue lorsque la nouvelle position de l'objet est définie sur l' objet Rect :

self.rect.x -= self.vel

Si vous souhaitez stocker les positions des objets avec une précision en virgule flottante, vous devez stocker l'emplacement de l'objet dans des variables séparées respectivement des attributs et synchroniser l' pygame.Rectobjet. roundles coordonnées et assignez-le à l'emplacement (par exemple .topleft) du rectangle:

class Cloud(pygame.sprite.Sprite):
    def __init__(self):
        super(Cloud, self).__init__()
        images = [load_image(f"cloud{i}.png") for i in range(1, 5)]
        self.image = random.choice(images)
        self.rect = self.image.get_rect()

        self.rect.x = random.randrange(WIDTH - self.rect.w)
        self.rect.y = random.randrange(HEIGHT - self.rect.h)
        self.x, self.y = self.rect.topleft

        self.vel = 10 / FPS  # It returns value less then 1

    def update(self, event=None):
        if not event:
            self.x -= self.vel
            self.rect.topleft = round(self.x), round(self.y)