有没有办法用 MOUSEBUTTONDOWN 事件关闭 pygame 窗口?
Posted
技术标签:
【中文标题】有没有办法用 MOUSEBUTTONDOWN 事件关闭 pygame 窗口?【英文标题】:Is there a way to close the pygame window with a MOUSEBUTTONDOWN event? 【发布时间】:2021-09-02 03:45:59 【问题描述】:我正在尝试制作一个退出 pygame 的可点击图像,但我不确定如何关闭它。我曾尝试使用 pygame.quit() 和 sys.exit() 但加载了一秒钟但没有做任何事情。我将在这里展示我的代码(唯一相关的代码是 x 和 y 变量以及底部的退出按钮):
import pygame, sys
clock = pygame.time.Clock()
from pygame.locals import *
pygame.init() # inititates Pygame
pygame.display.set_caption('Lightmind')
screen = pygame.display.set_mode((0, 0), pygame.FULLSCREEN) # initiates the window
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
fade_in = True
fade_out = True
fade_in_ball = True
fade_in_start = True
fade_in_exit = True
running = True
while running: # game loop
for event in pygame.event.get():
if event.type == QUIT:
running = False
pygame.quit()
sys.exit()
# fade in the logo
if fade_in == True:
for i in range(255):
screen.fill((0,0,0))
logo.set_alpha(i)
screen.blit(logo, (560,260))
pygame.display.flip()
clock.tick(60)
fade_in = False
# fade out the logo
if fade_out == True:
for i in range(255):
screen.fill((0,0,0))
logo.set_alpha(255-i)
screen.blit(logo, (560,260))
pygame.display.flip()
clock.tick(60)
fade_out = False
# fade in the start button
if fade_in_start == True:
for i in range(255):
start_button.set_alpha(i)
screen.blit(start_button, (560, 240))
pygame.display.flip()
clock.tick(60)
fade_in_start = False
# fade in the exit button
if fade_in_exit == True:
for i in range(255):
exit_button.set_alpha(i)
screen.blit(exit_button, (x_2, y_2))
pygame.display.flip()
clock.tick(60)
fade_in_exit = False
# make exit button exit game
if event.type == pygame.MOUSEBUTTONDOWN:
x_2, y_2 = event.pos
if exit_button.get_rect().collidepoint(x_2, y_2):
pygame.quit()
sys.exit()
pygame.display.update()
感谢任何帮助!
【问题讨论】:
如果“唯一相关的代码是 x 和 y 变量以及底部的退出按钮”,那么请将您的代码缩减为仅包含该代码的 Minimum, reproducible example。 【参考方案1】:您正在事件循环之外检查事件。改为向上移动:
for event in pygame.event.get():
if event.type == QUIT:
running = False
pygame.quit()
sys.exit()
elif event.type == pygame.MOUSEBUTTONDOWN:
x_2, y_2 = event.pos
if exit_button.get_rect().collidepoint(x_2, y_2):
pygame.quit()
【讨论】:
它仍然只是弹出窗口加载符号然后什么都不做。它甚至不允许我再次点击它。 也尝试设置running = False
@TowerOfGray11 您的代码还有其他几个问题,例如重复使用clock.tick()、在定义之前使用x_2
和y_2
,以及中断淡入的主循环。尝试将您的示例简化为仅重现问题所必需的内容。【参考方案2】:
pygame.event.get()
获取所有消息并将它们从队列中删除。请参阅文档:
这将获取所有消息并将它们从队列中删除。 [...]
如果在多个事件循环中调用pygame.event.get()
,则只有一个循环接收事件,但并非所有循环都接收所有事件。因此,似乎错过了一些事件。
您必须在事件循环中处理点击检测。
pygame.Surface.get_rect.get_rect()
返回一个具有 Surface 对象大小的矩形,但它返回一个始终从 (0, 0) 开始的矩形,因为 Surface 对象具有没有位置。Surface 放置在显示屏上具有blit
功能的位置。
您必须通过关键字参数设置矩形的位置,例如:
running = True
while running: # game loop
for event in pygame.event.get():
if event.type == QUIT:
running = False
if event.type == pygame.MOUSEBUTTONDOWN:
extit_button_rect = exit_button.get_rect(topleft = (x_2, y_2))
if extit_button_rect.collidepoint(event.pos):
running = False
# [...]
pygame.quit()
sys.exit()
【讨论】:
以上是关于有没有办法用 MOUSEBUTTONDOWN 事件关闭 pygame 窗口?的主要内容,如果未能解决你的问题,请参考以下文章
用js控制 给一个input赋值之后,change事件不能捕获到,谁有没有解决办法?