สไปรต์ติดอยู่ที่ขอบหน้าต่างเมื่อความเร็วน้อยกว่า 1 [ซ้ำกัน]
ฉันกำลังพยายามสร้างคลาวด์ที่เคลื่อนไหวสำหรับเกมของฉัน แต่สไปรต์ของเมฆติดอยู่ที่ขอบเมื่อฉันตั้งค่าความเร็วของเมฆให้น้อยกว่า 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
คำตอบ
เนื่องจาก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)