首先,你如何获得分辨率和比例因子?
这很棘手,因为某人的屏幕可能与您的 1334x800 的宽高比不同。您可以使用信箱(以各种不同的方式)或拉伸精灵;你需要决定你想要什么,但我会展示一种可能的信箱:
NOMINAL_WIDTH, NOMINAL_HEIGHT = 1334., 800.
surface = display.get_surface()
width, height = surface.get_width(), surface.get_height()
xscale = width / NOMINAL_WIDTH
yscale = height / NOMINAL_HEIGHT
if xscale < 1 and yscale < 1:
scale = max(xscale, yscale)
elif xscale > 1 and yscale > 1:
scale = min(xscale, yscale)
else:
scale = 1.0
现在,如何缩放每个精灵和背景?
首先,您确定要这样做吗?仅转换整个表面可能更简单。如果没有测试,很难预测这是更慢还是更快(并且可能无论如何都不相关),但它肯定会看起来更好(因为任何插值,抖动,抗锯齿等都发生在合成之后,而不是之前 - 除非你要去当然,对于那个 8 位外观,在这种情况下它会破坏外观……)。为此,您可以将所有内容合成到 1334x800 的屏幕外表面(或者,更好的是,将所有内容放大一个常数因子),然后 transforming 该表面进行显示。 (注意transform 方法包含一个可选的DestSurface 参数。您可以使用它直接从屏幕外表面转换到显示器表面。)
但是让我们假设你想按照你要求的方式去做。
您可以在加载精灵时执行此操作。例如:
def rescale(surf, scale):
new_width, new_height = surf.get_width() * scale, surf.get_height() * scale
return pygame.transform.smoothscale(surf, (new_width, new_height))
class ScaledSprite(pygame.sprite.Sprite):
def __init__(self, path, scale):
pygame.sprite.Sprite.__init__(self)
self.image = rescale(pygame.image.load(path), scale)
self.rect = self.image.get_rect()
背景也一样。