Pygame切换游戏场景时fill透明色无法隐藏按钮问题求解
Pygame阶段切换按钮不消失问题修复
核心问题定位
你的代码存在3个直接导致效果不符合预期的错误:
- 资源加载、函数定义全部写在了
faze_hry == 1的循环内部,每帧都会重新从磁盘读取原始按钮图片覆盖内存中的Surface对象,你对按钮图片做的透明填充操作会被直接覆盖。 - 鼠标点击判定逻辑写在了
pygame.event.get()事件遍历循环的外部,会出现事件漏读、变量未定义的报错,点击切换阶段的逻辑本身就存在触发异常的可能。 - 你在
faze_hry == 2的设置阶段没有做任何屏幕重绘、显示刷新操作:Pygame中执行blit绘制到屏幕上的像素会一直留在显示缓冲区,你修改按钮图片的Surface对象,不会对已经绘制到屏幕上的内容产生任何影响;且你没有在设置阶段调用screen.fill清空旧内容、也没有调用pygame.display.update刷新画面,屏幕会一直停留在最后一次主菜单循环绘制的状态,按钮自然不会消失。
额外说明:你试图通过给按钮Surface填充透明色的方式隐藏按钮本身就是错误思路,Pygame采用逐帧全量重绘的渲染逻辑,不需要手动"擦除"元素。
可行修复方案
按照以下逻辑调整代码即可实现预期效果:
- 把图片加载、尺寸坐标常量、通用函数全部移到游戏主循环外部,程序初始化时只执行一次加载,避免每帧重复读磁盘造成性能浪费,也防止资源被意外覆盖。
- 所有事件判断逻辑(包括鼠标点击、窗口关闭)全部放到
pygame.event.get()的遍历循环内部,不要写在循环外。 - 每个游戏阶段都遵循「清空屏幕→绘制当前阶段需要显示的元素→刷新显示」的固定渲染流程:设置阶段不写主菜单按钮的绘制代码,按钮自然不会出现在画面上,不需要额外做隐藏操作。
修复后的核心可运行代码如下:
import pygame pygame.init() # 分辨率初始化 vyska_rozliseni = pygame.display.Info().current_h / 1.5 sirka_rozliseni = pygame.display.Info().current_w / 1.5 screen = pygame.display.set_mode((sirka_rozliseni, vyska_rozliseni)) pygame.display.set_caption('OK1RAJ GAME') icon = pygame.image.load('PYGAME\\hra.raj\\images\\logo.png') pygame.display.set_icon(icon) # === 资源、常量提前初始化,不要放到循环内 === # 主菜单按钮 start_button_img = pygame.image.load('PYGAME\\hra.raj\\images\\Start_button.png') start_button_w, start_button_h = 128, 512 start_button_x = vyska_rozliseni / 1.7 start_button_y = sirka_rozliseni / 7 settings_button_img = pygame.image.load('PYGAME\\hra.raj\\images\\Settings_button.png') settings_button_w, settings_button_h = 128, 512 settings_button_x = vyska_rozliseni / 1.7 settings_button_y = sirka_rozliseni / 3 faze_hry = 1 run_game = True clock = pygame.time.Clock() while run_game: if faze_hry == 1: # 主菜单逻辑 for event in pygame.event.get(): if event.type == pygame.QUIT: faze_hry = 0 run_game = False # 点击判定放在事件循环内 if event.type == pygame.MOUSEBUTTONUP and event.button == 1: x, y = pygame.mouse.get_pos() # 开始按钮点击判定 if start_button_x <= x <= start_button_x + start_button_w and start_button_y <= y <= start_button_y + start_button_h: faze_hry = 3 # 设置按钮点击判定 if settings_button_x <= x <= settings_button_x + settings_button_w and settings_button_y <= y <= settings_button_y + settings_button_h: faze_hry = 2 # 渲染流程 screen.fill((0, 0, 0)) # 主菜单阶段才绘制两个按钮 screen.blit(start_button_img, (start_button_x, start_button_y)) screen.blit(settings_button_img, (settings_button_x, settings_button_y)) pygame.display.update() elif faze_hry == 2: # 设置页逻辑 for event in pygame.event.get(): if event.type == pygame.QUIT: faze_hry = 0 run_game = False # 渲染流程:不绘制主菜单按钮,按钮自然消失 screen.fill((0, 0, 0)) # 后续可在这部分添加设置页需要的元素,比如音量滑块、返回按钮等 pygame.display.update() clock.tick(60) # 锁定60帧,避免CPU占用过高 pygame.quit()
额外提示:你代码开头导入的
argparse、ast、asyncio、multiprocessing、tkinter等模块在当前项目中完全没有用到,可以直接删掉,减少不必要的资源加载。
内容的提问来源于stack exchange,提问作者Filip Dvorak
相关产品推荐
相关产品推荐

