Sprites collés à la bordure de la fenêtre lorsque la vitesse est inférieure à 1 [dupliquer]
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
Puisqu'il pygame.Rectest censé représenter une zone à l'écran, un pygame.Rect
objet 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.Rect
objet. 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)