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标志
如果我将 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标志