Nic*_*o A 7 python graphics pygame resize
我正在 pygame 中开发基于网格的游戏,并希望窗口可以调整大小。我使用以下初始化代码完成此操作:
pygame.display.set_mode((740, 440), pygame.RESIZABLE)
Run Code Online (Sandbox Code Playgroud)
以及我的事件处理程序中的以下内容:
elif event.type == pygame.VIDEORESIZE:
game.screen = pygame.display.set_mode((event.w, event.h),
pygame.RESIZABLE)
# Code to re-size other important surfaces
Run Code Online (Sandbox Code Playgroud)
我遇到的问题是 pygame.VIDEORESIZE 事件似乎只有在用户完成窗口大小调整后才会被推送,即放开边框。screen.get_size() 更新类似。由于我的游戏图形非常简单,我真的希望它们在用户拖动窗口时调整大小。这在许多其他语言中是微不足道的,但我在 pygame 中找不到任何参考资料 - 尽管我无法想象这种基本的功能是不可能的。
在 pygame 中调整屏幕大小时如何更新我的游戏?
编辑:这是一个最小的工作示例。在 Windows 10,pygame 1.9.4 上运行,以下代码只会在用户完成拖动窗口后绘制更新的矩形。
import sys
import pygame
pygame.init()
size = 320, 240
black = 0, 0, 0
red = 255, 0, 0
screen = pygame.display.set_mode(size, pygame.RESIZABLE)
while True:
for event in pygame.event.get():
if event.type == pygame.QUIT:
sys.exit()
elif event.type == pygame.VIDEORESIZE:
pygame.display.set_mode((event.w, event.h), pygame.RESIZABLE)
screen.fill(black)
pygame.draw.rect(screen, red, (10,10,screen.get_width(),screen.get_height()))
pygame.display.flip()
Run Code Online (Sandbox Code Playgroud)
如果您遇到此类问题,最好使用 googleSDL来代替pygame,因为 pygame 是一个相当低级的 SDL 包装器。
所以这不是 pygame 本身的问题,而是 sdl 和窗口管理器如何交互的问题,例如,请参阅此 SDL bug 报告。
尽管如此,如果您确实需要在调整大小时更新窗口,如果您使用的是 Windows,则可以侦听WM_SIZEWindows 的实际事件,重绘屏幕,并通过调用 来更新“Windows”窗口RedrawWindow。
这是一个简单的例子:
import pygame
import win32gui
import win32con
def wndProc(oldWndProc, draw_callback, hWnd, message, wParam, lParam):
if message == win32con.WM_SIZE:
draw_callback()
win32gui.RedrawWindow(hWnd, None, None, win32con.RDW_INVALIDATE | win32con.RDW_ERASE)
return win32gui.CallWindowProc(oldWndProc, hWnd, message, wParam, lParam)
def main():
pygame.init()
screen = pygame.display.set_mode((320, 240), pygame.RESIZABLE | pygame.DOUBLEBUF)
def draw_game():
screen.fill(pygame.Color('black'))
pygame.draw.rect(screen, pygame.Color('red'), pygame.Rect(0,0,screen.get_width(),screen.get_height()).inflate(-10, -10))
pygame.display.flip()
oldWndProc = win32gui.SetWindowLong(win32gui.GetForegroundWindow(), win32con.GWL_WNDPROC, lambda *args: wndProc(oldWndProc, draw_game, *args))
while True:
for event in pygame.event.get():
if event.type == pygame.QUIT:
return
elif event.type == pygame.VIDEORESIZE:
pygame.display.set_mode((event.w, event.h), pygame.RESIZABLE| pygame.DOUBLEBUF)
draw_game()
if __name__ == '__main__':
main()
Run Code Online (Sandbox Code Playgroud)
默认行为:
和RedrawWindow:
| 归档时间: |
|
| 查看次数: |
254 次 |
| 最近记录: |