Pygame。如何调整表面大小并使所有对象与新的 window 大小成比例?

Pygame. How do I resize a surface and keep all objects within proportionate to the new window size?

如果我将 pygame window 设置为可调整大小,然后单击并拖动 window 的边框,window 会变大,但没有任何 blit 到 window表面会随着它变大。 (这是可以理解的)当我调整 window 的大小时,所有 blit 对象都会随之调整大小并正确填充 window 吗?

例如:假设我有一个 200 x 200 的 window 并且我在 window_width/2 和 window_height/2 处 blit 了一个按钮。该按钮将位于 window 的中心,尺寸为 100 x 100。现在,如果我将 window 的大小调整为 300 x 300,按钮将保持在 100 x 100 而不是 150 x 150。

我试过 pygame.Surface.get_width 等等,但没有成功。 基本上,我正在尝试调整程序 window 的大小,并让所有 blit 图像保持比例。

不要直接在屏幕上绘制,而是在另一个表面上绘制。然后将另一个表面缩放到屏幕大小并将其 blit 显示在屏幕上。

这是一个简单的例子:

import pygame
from pygame.locals import *

def main():
    pygame.init()
    screen = pygame.display.set_mode((200, 200),HWSURFACE|DOUBLEBUF|RESIZABLE)
    fake_screen = screen.copy()
    pic = pygame.surface.Surface((50, 50))
    pic.fill((255, 100, 200))

    while True:
        for event in pygame.event.get():
            if event.type == QUIT: 
                pygame.display.quit()
            elif event.type == VIDEORESIZE:
                screen = pygame.display.set_mode(event.size, HWSURFACE|DOUBLEBUF|RESIZABLE)

        fake_screen.fill('black')
        fake_screen.blit(pic, (100, 100))
        screen.blit(pygame.transform.scale(fake_screen, screen.get_rect().size), (0, 0))
        pygame.display.flip()
    
main()    

所以在你有现有 pygame 事件 get()(你只允许一次(或只是放入''for inkey in pygame.event.get(VIDEORESIZE):''( 如果你想冗余))(请注意,每个循环只能使用一次''for inkey in pygame.event.get(VIDEORESIZE):'',因为它实际上是一个堆栈,当你阅读事件列表时会取消堆栈,所以你应该真正使用''for inkey in pygame.event.get():' ' snd 将您所有的关键识别语句放在 ''for inkey in pygame.event.get():'' 的这一次出现之后:

for inkey in pygame.event.get(VIDEORESIZE)
    if inkey.type == pygame.VIDEORESIZE:
        winwidth,winhight  = inkey.size  # or event.w, event.h
        Window1copy = Window1.copy()# make copy of existing window
        Window1=pygame.display.set_mode((winwidth,winhight),pygame.RESIZABLE) 
        Window1.blit(Window1copy, (0, 0))
        pygame.display.update()

最近用pygame2.0可以使用SCALED标志