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

Pygame点击按钮后如何在游戏循环中永久显示设置界面

问题原因

你的问题根源是仅在按钮点击触发的那一帧绘制了设置界面,Pygame游戏循环每帧都会先清空屏幕再重新绘制所有内容,下一次循环时没有再调用settings_show(),设置界面只存在1帧,自然会出现后立即消失、闪烁的问题。


解决方案
  • 第一步:新增状态变量控制设置界面的显示
    在全局作用域或者你的游戏管理类中新增布尔变量,默认值为False:
# 新增设置界面显示状态变量
show_settings = False
  • 第二步:修改按钮点击逻辑,改为切换状态而不是直接绘制
    把原来点击按钮直接调用settings_show()的逻辑,改成翻转状态变量,可实现点一次开、再点一次关的交互:
if settings_button.draw(screen):
    MENUSELECT.play()
    show_settings = not show_settings
  • 第三步:在游戏循环的绘制阶段统一判断绘制设置界面
    在游戏循环中,清空屏幕之后、调用pygame.display.update()/flip()之前,新增判断逻辑:只要show_settings为True,每帧都绘制设置界面,参考循环结构如下:
while run:
    # 1. 事件处理
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            run = False
        # 可选拓展:加ESC快捷键关闭设置界面
        if event.type == pygame.KEYDOWN:
            if event.key == pygame.K_ESCAPE and show_settings:
                show_settings = False
    
    # 2. 清空屏幕(必须放在所有绘制操作最前面)
    screen.fill(BLACK) # 替换成你实际的背景填充/背景图绘制代码

    # 3. 绘制常规UI:按钮、游戏内容等
    if start_button.draw(screen):
        start_game = True
        MENUSELECT.play()
        pygame.mixer.music.stop()
    if exit_button.draw(screen):
        MENUSELECT.play()
        run = False
    settings_button.draw(screen) # 按钮要每帧都绘制,否则点击后会消失

    # 4. 判断绘制设置界面(放在常规UI之后,保证设置界面层级更高不会被覆盖)
    if show_settings:
        settings_show()

    # 5. 统一刷新屏幕(全游戏循环只留这一个display更新调用即可,避免零散刷新导致闪烁)
    pygame.display.update()

注意事项
  • 绘制顺序要严格遵循「背景→底层UI→顶层UI」的顺序,保证设置界面不会被其他内容覆盖
  • 如果需要实现「点击设置界面外区域关闭」的效果,可以在事件处理中加鼠标点击位置判断,检测到点击不在设置界面范围内时将show_settings设为False即可

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 03:45:03