如何在游戏启动前禁用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
相关产品推荐
相关产品推荐

