如何通过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
相关产品推荐
相关产品推荐

