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

如何通过MOUSEBUTTONDOWN事件点击图片按钮关闭pygame窗口

Pygame点击图片按钮退出功能修复方案

存在的问题

  • 点击检测逻辑位置错误:退出按钮的点击判断写在仅执行一次的淡入循环内,淡入完成后不会再响应点击,且使用的event变量不是实时触发的新事件。
  • 碰撞检测坐标不匹配:exit_button.get_rect()生成的矩形默认左上角坐标为(0,0),和按钮实际绘制位置(x_2,y_2)不对应,无法正确识别点击区域。
  • 淡入淡出逻辑阻塞事件循环:所有淡入淡出效果使用内部阻塞式for循环,循环执行期间无法响应任何用户输入事件。

修复后代码

import pygame, sys
from pygame.locals import *

clock = pygame.time.Clock()
pygame.init() 

pygame.display.set_caption('Lightmind')
screen = pygame.display.set_mode((0, 0), pygame.FULLSCREEN) 

# 加载资源
logo = pygame.image.load("GameLogo.png").convert()
logo = pygame.transform.scale(logo, (256, 256))
start_button = pygame.image.load("StartButton.png").convert()
start_button = pygame.transform.scale(start_button, (256, 256))
exit_button = pygame.image.load("ExitButton.png").convert()
exit_button = pygame.transform.scale(exit_button, (256, 100))

# 坐标配置
x_2 = 560
y_2 = 400
exit_rect = exit_button.get_rect(topleft=(x_2, y_2))

# 淡入淡出状态与透明度配置
logo_alpha = 0
start_alpha = 0
exit_alpha = 0
fade_in = True
fade_out = False
fade_in_start = False
fade_in_exit = False

running = True
while running: 
    # 统一处理所有事件
    for event in pygame.event.get():
        if event.type == QUIT:
            running = False
        # 处理鼠标点击事件
        if event.type == pygame.MOUSEBUTTONDOWN:
            if exit_rect.collidepoint(event.pos):
                running = False
            
    screen.fill((0,0,0))

    # logo淡入逻辑(非阻塞逐帧更新)
    if fade_in:
        if logo_alpha < 255:
            logo_alpha += 1
        else:
            fade_in = False
            fade_out = True
        logo.set_alpha(logo_alpha)
        screen.blit(logo, (560,260))
    # logo淡出逻辑
    elif fade_out:
        if logo_alpha > 0:
            logo_alpha -= 1
        else:
            fade_out = False
            fade_in_start = True
        logo.set_alpha(logo_alpha)
        screen.blit(logo, (560,260))
    # 开始按钮淡入逻辑
    elif fade_in_start:
        if start_alpha < 255:
            start_alpha +=1
        else:
            fade_in_start = False
            fade_in_exit = True
        start_button.set_alpha(start_alpha)
        screen.blit(start_button, (560, 240))
    # 退出按钮淡入逻辑
    elif fade_in_exit:
        if exit_alpha <255:
            exit_alpha +=1
        exit_button.set_alpha(exit_alpha)
        screen.blit(exit_button, (x_2, y_2))
    # 所有动画完成后常驻绘制按钮
    else:
        screen.blit(start_button, (560, 240))
        screen.blit(exit_button, (x_2, y_2))

    pygame.display.flip()
    clock.tick(60)

# 统一退出逻辑
pygame.quit()
sys.exit()

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 03:12:03