Sprites presos na borda da janela quando a velocidade é menor que 1 [duplicar]

Dec 28 2020

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

2 Rabbid76 Dec 28 2020 at 21:01

Como pygame.Rectdeve representar uma área na tela, um pygame.Rectobjeto 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.Rectobjeto. 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)