pygame - 创建流体效果使表面变小
pygame - create fluid effect to make a surface smaller
我想在 pygame 中创建一个表面慢慢变小的效果。我试试这个:
在主循环中:
earth = pygame.transform.scale(earth, (int(earth.get_width()*0.9999), int(earth.get_height()*0.9999)))
如何开始
结局如何
我可以使用哪种技术来做到这一点?
谢谢!
`
好吧,有几件事可以提供帮助
- 不要覆盖原来的,这会导致各种转换问题累积。保持原样,每次都执行您想要的整体转换。
- 不要每次循环都按静态数字缩放。每个循环之间的时间量不会完全相同。收缩开始后的使用时间*收缩率。这将使您的动画保持流畅并防止累积错误。
代码看起来像这样:
# time_start is when you start the shrinkage
# time_end is when the shrinkage should be completed
now = time.time()
if now < time_end:
shrinking = (time_end - now) / (time_end - time_start)
new_size = (int(earth.get_width()*shrinking),
int(earth.get_height()*shrinking))
earth_scaled = pygame.transform.scale(earth, new_size)
# draw earth_scaled
注意:随着 earth_scaled 变小,您可能还需要注意绘制位置。
回复评论
转换不是无损的。每次变换都会使您的图像不那么完美。您可能会遇到伪像、裁剪问题等。例如,在您的情况下,您将宽度和高度乘以略小于 1,然后用 int
截断它。这将导致每次迭代将尺寸减小 1 个像素(除非你有一张疯狂的大图像)。将图像缩放到比开始时少 1 个像素宽度可能只会忽略其中一个像素列。如果你继续这样做,它每次都会删除 1 列和 1 行。 (不是你想要的)。相反,如果您获取完整图像并对其进行缩放,则缩放功能可以更好地选择要省略或合并的内容。
我想在 pygame 中创建一个表面慢慢变小的效果。我试试这个:
在主循环中:
earth = pygame.transform.scale(earth, (int(earth.get_width()*0.9999), int(earth.get_height()*0.9999)))
如何开始
结局如何
我可以使用哪种技术来做到这一点?
谢谢!
`
好吧,有几件事可以提供帮助
- 不要覆盖原来的,这会导致各种转换问题累积。保持原样,每次都执行您想要的整体转换。
- 不要每次循环都按静态数字缩放。每个循环之间的时间量不会完全相同。收缩开始后的使用时间*收缩率。这将使您的动画保持流畅并防止累积错误。
代码看起来像这样:
# time_start is when you start the shrinkage
# time_end is when the shrinkage should be completed
now = time.time()
if now < time_end:
shrinking = (time_end - now) / (time_end - time_start)
new_size = (int(earth.get_width()*shrinking),
int(earth.get_height()*shrinking))
earth_scaled = pygame.transform.scale(earth, new_size)
# draw earth_scaled
注意:随着 earth_scaled 变小,您可能还需要注意绘制位置。
回复评论
转换不是无损的。每次变换都会使您的图像不那么完美。您可能会遇到伪像、裁剪问题等。例如,在您的情况下,您将宽度和高度乘以略小于 1,然后用 int
截断它。这将导致每次迭代将尺寸减小 1 个像素(除非你有一张疯狂的大图像)。将图像缩放到比开始时少 1 个像素宽度可能只会忽略其中一个像素列。如果你继续这样做,它每次都会删除 1 列和 1 行。 (不是你想要的)。相反,如果您获取完整图像并对其进行缩放,则缩放功能可以更好地选择要省略或合并的内容。