Pygame全屏模式下如何设置指定窗口尺寸?适配复古低分辨率游戏
解决Pygame 2.1.3.dev8全屏低分辨率黑边显示问题
问题原因
Pygame 2.x版本调整了全屏模式的处理逻辑,直接使用pygame.FULLSCREEN会强制将窗口拉伸适配屏幕原生分辨率,无法保留设定的低分辨率比例及边缘黑边效果。
解决方案1:使用pygame.SCALED标志(推荐)
修改variable.py中的显示模式初始化代码,通过pygame.SCALED让Pygame自动按比例缩放内容并居中显示,边缘自动填充黑边:
import pygame width = 256 height = 224 scale = 3 background = pygame.image.load("images/background.png") #纯色背景 clock = pygame.time.Clock() # 初始化显示模块并获取屏幕原生分辨率 pygame.display.init() screen_info = pygame.display.Info() screen_width, screen_height = screen_info.current_w, screen_info.current_h # 结合FULLSCREEN和SCALED标志,自动保持比例并添加黑边 screen = pygame.display.set_mode( (width * scale, height * scale), pygame.FULLSCREEN | pygame.SCALED, vsync=1 # 可选,开启垂直同步优化画面 ) FPSlock = 60 colour = (155, 0, 0)
该方案无需手动处理缩放逻辑,Pygame会自动计算最佳缩放比例,确保原始分辨率的宽高比不变,屏幕边缘自动生成黑边。
解决方案2:虚拟表面手动缩放(自定义性更强)
若需要完全控制渲染流程,可创建低分辨率虚拟表面承载游戏内容,再将其缩放后居中绘制到全屏窗口:
- 修改
variable.py:
import pygame width = 256 height = 224 scale = 3 background = pygame.image.load("images/background.png") #纯色背景 clock = pygame.time.Clock() # 创建匹配屏幕原生分辨率的全屏窗口 pygame.display.init() screen_info = pygame.display.Info() fullscreen_width, fullscreen_height = screen_info.current_w, screen_info.current_h screen = pygame.display.set_mode((fullscreen_width, fullscreen_height), pygame.FULLSCREEN) # 创建低分辨率虚拟表面,所有游戏内容渲染至此 virtual_screen = pygame.Surface((width, height)) FPSlock = 60 colour = (155, 0, 0)
- 修改
outerLayer.py的mainScreenUpdate函数:
def mainScreenUpdate(): # 填充虚拟表面 virtual_screen.fill(colour) # 计算保持比例的缩放参数 scale_x = fullscreen_width / width scale_y = fullscreen_height / height render_scale = min(scale_x, scale_y) render_size = (int(width * render_scale), int(height * render_scale)) # 计算居中位置 pos = ((fullscreen_width - render_size[0])//2, (fullscreen_height - render_size[1])//2) # 缩放虚拟表面并绘制到全屏窗口 screen.blit(pygame.transform.scale(virtual_screen, render_size), pos) pygame.display.update()
- 修改
slimeGame.py的screenUpdate函数:
def screenUpdate(): # 将背景渲染到虚拟表面 virtual_screen.blit(background, (0, 0)) # 计算缩放及居中参数 scale_x = fullscreen_width / width scale_y = fullscreen_height / height render_scale = min(scale_x, scale_y) render_size = (int(width * render_scale), int(height * render_scale)) pos = ((fullscreen_width - render_size[0])//2, (fullscreen_height - render_size[1])//2) # 缩放并绘制到全屏窗口 screen.blit(pygame.transform.scale(virtual_screen, render_size), pos) pygame.display.update()
该方案适合需要自定义缩放逻辑、添加额外渲染效果的场景,可完全控制黑边和内容显示位置。
注意事项
- 务必在创建显示模式前调用
pygame.display.init()完成初始化 - 若使用
SCALED标志遇到兼容性问题,优先选择虚拟表面方案 - 测试时可先移除
FULLSCREEN标志,用窗口模式验证效果后再切换全屏
内容的提问来源于stack exchange,提问作者sihea
相关产品推荐
相关产品推荐

