สไปรต์ติดอยู่ที่ขอบหน้าต่างเมื่อความเร็วน้อยกว่า 1 [ซ้ำกัน]

Dec 28 2020

ฉันกำลังพยายามสร้างคลาวด์ที่เคลื่อนไหวสำหรับเกมของฉัน แต่สไปรต์ของเมฆติดอยู่ที่ขอบเมื่อฉันตั้งค่าความเร็วของเมฆให้น้อยกว่า 1 ฉันต้องการให้เมฆนั้นยังคงเคลื่อนไหวต่อไปหากส่วนหนึ่งของคลาวด์อยู่นอกหน้าจอ ฉันพบว่าสไปรต์ติดอยู่ถ้า x ของ rect เท่ากับ 0 จะแก้ไขอย่างไร

รหัสของฉัน:

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

คำตอบ

2 Rabbid76 Dec 28 2020 at 21:01

เนื่องจากpygame.Rectควรจะเป็นตัวแทนของพื้นที่บนหน้าจอpygame.Rectวัตถุจึงสามารถจัดเก็บข้อมูลที่สำคัญได้เท่านั้น

พิกัดสำหรับวัตถุ Rect เป็นจำนวนเต็มทั้งหมด [... ]

ส่วนที่เป็นเศษส่วนของพิกัดจะหายไปเมื่อตำแหน่งใหม่ของวัตถุถูกตั้งค่าเป็นวัตถุRect :

self.rect.x -= self.vel

หากคุณต้องการจัดเก็บตำแหน่งวัตถุที่มีความแม่นยำของจุดลอยตัวคุณต้องจัดเก็บตำแหน่งของวัตถุในตัวแปรที่แยกจากกันตามลำดับแอตทริบิวต์และเพื่อซิงโครไนซ์pygame.Rectวัตถุ roundพิกัดและกำหนดให้กับตำแหน่ง (เช่น.topleft) ของสี่เหลี่ยมผืนผ้า:

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)