Sprite menempel di tepi jendela saat kecepatan kurang dari 1 [duplikat]

Dec 28 2020

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

2 Rabbid76 Dec 28 2020 at 21:01

Karena pygame.Rectseharusnya mewakili suatu area di layar, suatu pygame.Rectobjek 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.Rectobjek. 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)