我最近一直在使用Python和Pygame开发一个游戏,并开始开发各种按钮。我遇到的一个问题是,当我创建一个按钮类并为每个按钮创建该类的两个对象时,当鼠标悬停在上面时,它们都会变暗,这是预期的,但是只有第一个处理的按钮才会检测到播放器点击它。我用相同的按钮类和基本相同的代码启动了一个新的python文件,它仍然有同样的问题。我尝试过分别处理按钮并更改其他内容,但唯一能让第二个按钮工作的方法是先处理它,但这样第一个按钮就不工作了。下面是简化的代码。
import pygame
class Button:
def __init__(self, x, y, width, height, color, hover_color, click_func):
self.rect = pygame.Rect(x, y, width, height)
self.color = color
self.hover_color = hover_color
self.display_color = self.color
self.click_func = click_func
def process(self):
events = pygame.event.get()
mouse_pos = pygame.mouse.get_pos()
if self.rect.collidepoint(mouse_pos):
self.display_color = self.hover_color
for event in events:
if event.type == pygame.MOUSEBUTTONDOWN:
self.click_func()
else:
self.display_color = self.color
def press_func1():
print('press func 1')
def press_func2():
print('press func 2')
WIN = pygame.display.set_mode((500, 500))
buttons = [
Button(200, 100, 100, 50, (255, 0, 0), (150, 0, 0), press_func1),
Button(200, 300, 100, 50, (0, 255, 0), (0, 150, 0), press_func2)
]
running = True
fps = pygame.time.Clock()
while running:
fps.tick(60)
WIN.fill((255, 255, 255))
[button.process() for button in buttons]
[pygame.draw.rect(WIN, button.display_color, button.rect) for button in buttons]
pygame.display.update()
如果你知道问题出在哪里,我很乐意听听。
1条答案
按热度按时间6g8kf2rb1#
pygame.event.get()
获取所有事件并将其从队列中删除。请参阅文档:这将获取所有消息并将其从队列中删除。[...]
如果
pygame.event.get()
在每一帧被调用多次,事件只返回一次,但不是所有的调用都会返回所有的事件。每帧获取一次事件列表,并将事件列表传递给
Button.process
: