You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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:虚拟表面手动缩放(自定义性更强)

若需要完全控制渲染流程,可创建低分辨率虚拟表面承载游戏内容,再将其缩放后居中绘制到全屏窗口:

  1. 修改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)
  1. 修改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()
  1. 修改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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.02 04:30:41