如何使用监视器的大小向下或向上缩小窗口上的所有图像

时间:2015-04-27 20:19:32

标签: python pygame

所以我在python和pygame中制作游戏,我有像这样的indow设置

display = pygame.display.set_mode((0,0), pygame.FULLSCREEN)

这使得窗口大小约为1334 X 800所以我基于那个大小的屏幕上的所有精灵和背景,但是你知道不是每个人都有与我相同大小的屏幕所以我的问题是如何使图像缩放监视器屏幕有多大

(P.S游戏处于全屏模式)

2 个答案:

答案 0 :(得分:1)

首先,您如何获得分辨率和比例因子?

这很棘手,因为某人的屏幕可能与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的屏幕外表面(或者更好,通过常数因子扩展所有内容),然后transform该表面进行显示来完成此操作。 (请注意,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()

背景也一样。

答案 1 :(得分:-1)

来自this SO question,您可以使用

获取监视器的大小
infoObject = pygame.display.Info()

将屏幕的高度和宽度设为infoObject.current_winfoObject.current_h

然后,您可以使用这些值来适当地缩放所有内容。