Sprite menempel di tepi jendela saat kecepatan kurang dari 1 [duplikat]
Saya mencoba membuat awan bergerak untuk permainan saya, tetapi kumpulan awan terjebak di perbatasan saat saya menyetel kecepatan awan kurang dari 1. Saya ingin awan itu terus bergerak jika sebagian awan sudah berada di luar layar. Saya menemukan bahwa sprite macet jika x dari rect sama dengan 0. Bagaimana cara memperbaikinya?
Kode saya:
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
Jawaban
Karena pygame.Rectseharusnya mewakili suatu area di layar, suatu pygame.Rect
objek hanya dapat menyimpan data integral.
Koordinat untuk objek Rect adalah bilangan bulat. [...]
Bagian pecahan dari koordinat akan hilang saat posisi baru objek disetel ke objek Rect :
self.rect.x -= self.vel
Jika Anda ingin menyimpan posisi objek dengan akurasi floating point, Anda harus menyimpan lokasi objek dalam variabel terpisah masing-masing atribut dan melakukan sinkronisasi pygame.Rect
objek. roundkoordinat dan menetapkannya ke lokasi (misalnya .topleft
) dari persegi panjang:
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)