Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/283.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 皮加梅。如何调整曲面大小并使所有对象与新窗口大小成比例?_Python_Pygame_Resizable_Surface_Blit - Fatal编程技术网

Python 皮加梅。如何调整曲面大小并使所有对象与新窗口大小成比例?

Python 皮加梅。如何调整曲面大小并使所有对象与新窗口大小成比例?,python,pygame,resizable,surface,blit,Python,Pygame,Resizable,Surface,Blit,如果我将pygame窗口设置为可调整大小,然后在窗口的边框上单击并拖动,窗口将变大,但表面上的blit不会随之变大。(这是可以理解的)当我调整窗口大小时,如何使所有blit对象都能随之调整大小并正确填充窗口 例如:假设我有一个200 x 200的窗口,我在窗口宽度/2和窗口高度/2处单击一个按钮。该按钮将位于窗口中心的100 x 100处。现在,如果我将窗口调整为300 x 300,按钮将保持在100 x 100,而不是150 x 150 我试着和pygame.Surface.get_width

如果我将pygame窗口设置为可调整大小,然后在窗口的边框上单击并拖动,窗口将变大,但表面上的blit不会随之变大。(这是可以理解的)当我调整窗口大小时,如何使所有blit对象都能随之调整大小并正确填充窗口

例如:假设我有一个200 x 200的窗口,我在窗口宽度/2和窗口高度/2处单击一个按钮。该按钮将位于窗口中心的100 x 100处。现在,如果我将窗口调整为300 x 300,按钮将保持在100 x 100,而不是150 x 150

我试着和pygame.Surface.get_width等混在一起,但运气不好。
基本上,我试图调整程序窗口的大小,使所有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()    

因此,在没有gui初始化(pygame init和setmode comands)的情况下,您可以使用现有的pygame event get()(这是您只允许使用的一次(或者只是在pygame.event.get(VIDEORESIZE)中输入“for inkey:”( (注意,在pygame.event.get(VIDEORESIZE)中,每个循环只能对inkey使用一次“for inkey:”,因为它实际上是一个堆栈,在读取事件列表时会取消堆栈,因此您应该在pygame.event.get()中对inkey使用“”:''在pygame.event.get()中出现''for inkey:''之后,snd将您的所有密钥识别语句都放在''之后:'':


最近,在pygame2.0中,您可以使用缩放标志

您可以提供有关标志传递方式的更多信息吗?除了您的答案之外,还可以提供指向该标志相关文档的链接来实现这一点?
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()