Sprite'lar hız 1'den düşük olduğunda pencerenin kenarına takıldı [kopya]

Dec 28 2020

Oyunum için hareketli bulutlar yapmaya çalışıyorum ama bulutun hızını 1'den daha düşük bir hızda ayarladığımda sınırlara yapışan bulut spriteleri bulutun bir parçası zaten ekranın dışındaysa bulutun hareket etmeye devam etmesini istiyorum. X of rect 0'a eşitse sprite'ın sıkıştığını öğrendim. Nasıl düzeltilir?

Kodum:

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

Yanıtlar

2 Rabbid76 Dec 28 2020 at 21:01

Yana pygame.Rectekranda bir alanı temsil etmesi gereken bir pygame.Rectnesne yalnızca ayrılmaz verileri saklayabilir.

Rect nesnelerinin koordinatlarının tümü tam sayıdır. [...]

Nesnenin yeni konumu Rect nesnesine ayarlandığında koordinatların kesir kısmı kaybolur :

self.rect.x -= self.vel

Nesne konumlarını kayan nokta doğruluğu ile saklamak istiyorsanız, nesnenin konumunu ayrı değişkenler ve nitelikler halinde saklamanız ve nesneyi senkronize etmeniz gerekir pygame.Rect. roundkoordinatları belirleyin ve .topleftdikdörtgenin konumuna (örneğin ) atayın :

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)