如何在Pygame可调整窗口中绘制固定比例的矩形边框?
问题分析与修正方案
嘿,我来帮你搞定这个Pygame可调整窗口的问题~你的代码思路是对的,但有两个关键细节没处理好,导致效果不符合预期,我们来一步步修正:
核心问题说明
- 未更新窗口表面引用:在
VIDEORESIZE事件中调用pygame.display.set_mode()后,你没有将返回的新窗口表面赋值给win变量。这会导致后续的win.blit()等操作依然在旧的窗口表面上执行,新窗口大小的内容根本不会正确显示出来。 - 绘制顺序颠倒:你先把空白的
surf贴到了窗口上,之后才在surf上绘制红色边框。这时候贴表面的操作已经完成了,边框不会被渲染到窗口上——必须先完成surf上的所有绘制操作,再把它贴到窗口。
修正后的完整代码
import pygame,sys pygame.init() # 初始化窗口,保存返回的表面到win变量 win = pygame.display.set_mode((400,400),pygame.HWSURFACE | pygame.DOUBLEBUF | pygame.RESIZABLE) while True: events = pygame.event.get() for event in events: if event.type == pygame.QUIT: pygame.quit() sys.exit() if event.type == pygame.VIDEORESIZE: # 关键修改:将新创建的窗口表面重新赋值给win win = pygame.display.set_mode((event.w,event.h),pygame.HWSURFACE | pygame.DOUBLEBUF | pygame.RESIZABLE) # 直接从win获取当前窗口尺寸,更简洁 win_width,win_height = win.get_size() # 创建对应比例的Surface surf = pygame.Surface((round(win_width/2),round(win_height/2))) surf.fill((255,255,255)) # 先绘制红色边框,再将surf贴到窗口 pygame.draw.rect(surf,(255,0,0),(0,0,surf.get_width(),surf.get_height()),10) win.blit(surf,(win_width/4,win_height/4)) pygame.display.update()
额外优化建议
- 如果你需要频繁调整窗口大小,每次循环都新建
Surface会有点浪费性能。可以把surf的创建逻辑移到VIDEORESIZE事件里,只在窗口尺寸变化时更新surf,平时循环只做绘制和贴表面的操作。 - 在双缓冲模式下,你可以用
pygame.display.flip()代替pygame.display.update(),两者效果一致,但flip()会更新整个屏幕,更适合这种全屏渲染的场景。
内容的提问来源于stack exchange,提问作者Rayquados
相关产品推荐
相关产品推荐

