python Pygame按钮,第一个按钮工作,第二个按钮不工作

rta7y2nd  于 2022-11-21  发布在  Python
关注(0)|答案(1)|浏览(193)

我最近一直在使用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()

如果你知道问题出在哪里,我很乐意听听。

6g8kf2rb

6g8kf2rb1#

pygame.event.get()获取所有事件并将其从队列中删除。请参阅文档:
这将获取所有消息并将其从队列中删除。[...]
如果pygame.event.get()在每一帧被调用多次,事件只返回一次,但不是所有的调用都会返回所有的事件。
每帧获取一次事件列表,并将事件列表传递给Button.process

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):
        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))
    
    events = pygame.event.get()
    [button.process(events) for button in buttons]
    [pygame.draw.rect(WIN, button.display_color, button.rect) for button in buttons]
        
    pygame.display.update()

相关问题