首页 > 解决方案 > 当速度小于 1 时,精灵会粘在窗口的边界上

问题描述

我正在尝试为我的游戏制作移动的云,但是当我将云的速度设置为小于 1 时,云的精灵会粘在边界上。如果云的一部分已经在屏幕之外,我希望云继续移动。我发现如果 rect 的 x 等于 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

在此处输入图像描述

标签: pythonpygame

解决方案


由于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)

推荐阅读