Sprites presos na borda da janela quando a velocidade é menor que 1 [duplicar]
Estou tentando fazer nuvens em movimento para o meu jogo, mas os sprites das nuvens ficam presos nas bordas quando eu defino a velocidade da nuvem para menos de 1. Eu quero que a nuvem continue se movendo se uma parte da nuvem já estiver fora da tela. Eu descobri que sprites travavam se x de rect é igual a 0. Como consertar?
Meu código:
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

Respostas
Como pygame.Rectdeve representar uma área na tela, um pygame.Rect
objeto só pode armazenar dados integrais.
As coordenadas para objetos Rect são todos inteiros. [...]
A parte fracionária das coordenadas é perdida quando a nova posição do objeto é definida para o objeto Rect :
self.rect.x -= self.vel
Se você deseja armazenar as posições do objeto com precisão de ponto flutuante, você deve armazenar a localização do objeto em variáveis separadas, respectivamente, atributos e para sincronizar o pygame.Rect
objeto. roundas coordenadas e atribuí-lo à localização (por exemplo .topleft
) do retângulo:
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)