你的问题确实与 `pygame.display.set_mode` 的使用逻辑有关。以下是对你代码中问题的进一步分析,以及为什么我的代码可以解决问题的详细解释。
---
### 关键问题分析
1. **全屏与窗口模式切换的标志冲突**
在你的代码中,切换到窗口模式时,你使用了以下逻辑:
screen = pygame.display.set_mode(bg_size)
但在切换到全屏模式时,你使用了:
screen = pygame.display.set_mode(bg_size, FULLSCREEN | HWSURFACE)
这里的问题是,当你从全屏切换回窗口模式时,`pygame` 并没有完全清除之前的全屏标志,导致窗口模式仍然受到全屏模式的影响(例如,窗口的边框和位置未正确恢复)。
**我的代码解决方法:**
在切换到窗口模式时,我明确移除了所有与全屏相关的标志,仅使用:
screen = pygame.display.set_mode(bg_size)
这样可以确保窗口模式完全独立于全屏模式,避免标志冲突。
2. **`list_modes` 的使用问题**
你的代码中对 `pygame.display.list_modes()` 的使用存在问题:
listmode = pygame.display.list_modes()
if listmode:
bg_size = width, height = listmode
`pygame.display.list_modes()` 返回的是一个分辨率列表,而不是单一的分辨率值。直接将其赋值给 `bg_size` 会导致错误。
**我的代码解决方法:**
我直接使用了一个固定的窗口尺寸(如 `(800, 600)`)和全屏模式的系统分辨率(如 `screen_size`),避免了对 `list_modes` 的误用。
3. **`position` 变量未正确初始化**
你的代码中,`position` 变量未初始化,导致在后续逻辑中可能出现未定义错误。例如:
if position = width - background_rect.width:
position -= 10
这里的 `position` 在代码中并未初始化,可能会导致运行时错误。
**我的代码解决方法:**
我省略了 `position` 的逻辑,直接将背景图片绘制在固定位置,确保代码逻辑简单且无错误。
4. **窗口尺寸切换逻辑不完整**
在你的代码中,切换窗口模式时,未正确同步窗口尺寸和背景图片的绘制逻辑,导致画面显示异常。
**我的代码解决方法:**
我在切换模式后,重新设置了窗口尺寸和背景图片的绘制逻辑,确保画面始终正确显示。
---
### 代码修复建议
以下是对你代码的修复版本,解决了全屏与窗口模式切换时画面缩在左上角的问题:
import pygame
import sys
import traceback
from pygame.locals import *
def main():
pygame.init()
# 颜色参数
WHITE = (255, 255, 255)
# 获取屏幕分辨率
listmode = pygame.display.list_modes()
if listmode:
screen_size = listmode[0] # 选择第一个分辨率
else:
screen_size = (1366, 768)
# 初始化窗口
bg_size = (800, 600)
screen = pygame.display.set_mode(bg_size)
pygame.display.set_caption("侑发布新作")
# 加载背景图片
background_image = pygame.image.load("images/background.png").convert_alpha()
# 控制变量
is_fullscreen = False
clock = pygame.time.Clock()
FPS = 60
running = True
while running:
for event in pygame.event.get():
if event.type == QUIT:
pygame.quit()
sys.exit()
if event.type == KEYDOWN:
if event.key == K_F11:
# 切换全屏/窗口模式
is_fullscreen = not is_fullscreen
if is_fullscreen:
screen = pygame.display.set_mode(screen_size, FULLSCREEN)
else:
screen = pygame.display.set_mode(bg_size)
# 绘制背景
screen.fill(WHITE)
screen.blit(background_image, (0, 0))
pygame.display.flip()
clock.tick(FPS)
if __name__ == "__main__":
try:
main()
except SystemExit:
pass
except:
traceback.print_exc()
pygame.quit()
input()
---
### 修复的关键点
1. **全屏与窗口模式切换逻辑**
切换到全屏模式时,使用:
screen = pygame.display.set_mode(screen_size, FULLSCREEN)
切换到窗口模式时,使用:
screen = pygame.display.set_mode(bg_size)
确保两种模式的标志完全独立。
2. **正确使用 `list_modes`**
选择 `list_modes` 返回的第一个分辨率作为全屏模式的分辨率:
screen_size = listmode[0]
3. **简化背景绘制逻辑**
直接将背景图片绘制在固定位置 `(0, 0)`,避免复杂的 `position` 逻辑。
---
### 总结
你的问题并不是 `pygame` 的 bug,而是代码逻辑上的问题。通过正确处理窗口模式和全屏模式的切换逻辑,以及简化背景绘制逻辑,可以解决画面缩在左上角的问题。如果还有其他问题,欢迎继续提问!
以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。 |