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

Pygame切换游戏场景时fill透明色无法隐藏按钮问题求解

Pygame阶段切换按钮不消失问题修复

核心问题定位

你的代码存在3个直接导致效果不符合预期的错误:

  • 资源加载、函数定义全部写在了faze_hry == 1的循环内部,每帧都会重新从磁盘读取原始按钮图片覆盖内存中的Surface对象,你对按钮图片做的透明填充操作会被直接覆盖。
  • 鼠标点击判定逻辑写在了pygame.event.get()事件遍历循环的外部,会出现事件漏读、变量未定义的报错,点击切换阶段的逻辑本身就存在触发异常的可能。
  • 你在faze_hry == 2的设置阶段没有做任何屏幕重绘、显示刷新操作:Pygame中执行blit绘制到屏幕上的像素会一直留在显示缓冲区,你修改按钮图片的Surface对象,不会对已经绘制到屏幕上的内容产生任何影响;且你没有在设置阶段调用screen.fill清空旧内容、也没有调用pygame.display.update刷新画面,屏幕会一直停留在最后一次主菜单循环绘制的状态,按钮自然不会消失。
    额外说明:你试图通过给按钮Surface填充透明色的方式隐藏按钮本身就是错误思路,Pygame采用逐帧全量重绘的渲染逻辑,不需要手动"擦除"元素。

可行修复方案

按照以下逻辑调整代码即可实现预期效果:

  1. 把图片加载、尺寸坐标常量、通用函数全部移到游戏主循环外部,程序初始化时只执行一次加载,避免每帧重复读磁盘造成性能浪费,也防止资源被意外覆盖。
  2. 所有事件判断逻辑(包括鼠标点击、窗口关闭)全部放到pygame.event.get()的遍历循环内部,不要写在循环外。
  3. 每个游戏阶段都遵循「清空屏幕→绘制当前阶段需要显示的元素→刷新显示」的固定渲染流程:设置阶段不写主菜单按钮的绘制代码,按钮自然不会出现在画面上,不需要额外做隐藏操作。

修复后的核心可运行代码如下:

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 12:51:19