python - 当速度小于 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
解决方案
由于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)
推荐阅读
- javascript - ol.source.Vector 实例的 .getFeatures() 方法在控制台中工作,但不在脚本中
- javascript - 如何在 Sweet Alert 弹出消息内容中获得价值?
- html - 无论设备类型如何,如何在 HTML 和 CSS 中将动画图像和非动画文本居中?
- http - Nginx 客户端发送了重复的标题行?
- java - 哪一个执行得更快?sql order by 或 java PriorityQueue 或任何其他?
- reporting-services - SSRS 向下钻取报告未正确过滤参数
- python - 使用循环返回顺序在列表中搜索字符串
- python - 如何使用 executemany 将每个 Key 中的第一个值写入数据库
- javascript - 从 React.js 中的 div 获取 ID
- php - PHP AJAX多表单未插入数据库