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

如何在游戏启动前禁用ESC键?基于Pygame-menu的实现方案

解决未启动游戏时按ESC崩溃的问题

嘿,这个问题我用pygame-menu开发时也踩过坑!核心原因很明确:游戏还没初始化的时候,按ESC触发了恢复游戏的逻辑,但self.game根本还没创建,调用self.game.main()自然就会崩溃。下面给你几个具体的落地实现方案:

方案1:添加游戏启动状态标记

最直观的方法就是在GUI类里加一个状态变量,跟踪游戏是否已经启动,只有当游戏启动后才允许ESC键触发恢复逻辑。

修改后的代码示例:

class GUI:
    def __init__(self):
        # 初始化你的窗口、时钟、音效等变量...
        self.game_started = False  # 新增:标记游戏是否已启动

    # 点击新游戏按钮时触发的函数
    def start_new(self):
        # 禁用旧菜单
        self.main_menu.disable()
        # 调用EscapeTheGauntlet.py中的变量启动新游戏
        self.game = EscapeTheGauntlet(self.window, clock, self.sfx)
        self.game_started = True  # 游戏启动后更新状态
        # 将更新后的画面设置为主窗口
        self.game.main()

    # 自定义ESC键的处理逻辑
    def handle_esc_press(self):
        if self.game_started:
            # 游戏已启动,正常处理菜单切换
            if self.main_menu.is_enabled():
                # 菜单已打开,执行恢复游戏逻辑
                self.resume_feature()
            else:
                # 菜单未打开,呼出菜单
                self.main_menu.enable()
        else:
            # 游戏未启动,直接忽略ESC键
            pass

方案2:修改pygame-menu的ESC绑定逻辑

pygame-menu默认会把ESC键绑定到菜单的打开/关闭操作,你可以自定义这个行为,让它先检查游戏状态再执行对应逻辑:

class GUI:
    def __init__(self):
        # 创建主菜单
        self.main_menu = pygame_menu.Menu(
            title='主菜单',
            width=800,
            height=600,
            theme=pygame_menu.themes.THEME_BLUE
        )
        # 替换默认的ESC键行为,绑定到自定义处理函数
        self.main_menu.set_on_close(lambda: self.handle_esc_press())
        
        # 初始化其他变量...
        self.game_started = False

    # 这里复用方案1中的handle_esc_press函数
    def handle_esc_press(self):
        if self.game_started:
            if self.main_menu.is_enabled():
                self.resume_feature()
            else:
                self.main_menu.enable()
        else:
            pass

方案3:在resume_feature中增加存在性检查

如果你不想改动GUI类的结构,也可以直接在EntertheGauntlet的resume_feature里先检查游戏实例是否存在:

class EntertheGauntlet:
    # 用于菜单切换时禁用旧菜单的函数
    def resume_feature(self):
        # 先检查游戏实例是否已创建
        if hasattr(self, 'game') and self.game is not None:
            # 禁用菜单
            self.main_menu.disable()
            # 调用主游戏循环恢复后台暂停的游戏
            self.game.main()
        else:
            # 游戏未启动,什么都不做或者给个提示
            print("请先启动游戏!")

这几个方案里,方案1的状态标记方式最清晰,也方便后续扩展其他依赖游戏状态的逻辑,推荐优先尝试~

内容的提问来源于stack exchange,提问作者Joshua Gonzalez

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.13 08:03:39