簡體   English   中英

如何使窗口上的所有圖像隨顯示器的大小縮小或放大

[英]How can i make all the images on a window scale down or up with the size of the monitor

所以我正在用python和pygame制作游戲,並且我有這樣的indow設置

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

這使得窗口的大小約為1334 X 800,因此我將所有精靈和背景都基於該屏幕大小,但是您知道不是每個人都擁有與我相同的屏幕大小,所以我的問題是如何使圖像縮放到多大監視器屏幕是

(PS游戲處於全屏模式)

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

這很棘手,因為某人的屏幕的縱橫比可能與您的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()

與背景相同。

這個SO問題中 ,您可以獲得

infoObject = pygame.display.Info()

它將屏幕的高度和寬度作為infoObject.current_winfoObject.current_h

然后,您可以使用這些值適當地縮放所有內容。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM