Sprite'lar hız 1'den düşük olduğunda pencerenin kenarına takıldı [kopya]
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
Yana pygame.Rectekranda bir alanı temsil etmesi gereken bir pygame.Rect
nesne 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 .topleft
dikdö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)