Pygame:当我按住鼠标时,屏幕闪烁,但是只有特定的按钮

时间:2020-02-14 23:32:06

标签: python pygame mouseevent

我在菜单类中有多个按钮。我要特别指出的是播放按钮和后退按钮。播放按钮以“ main_menu”状态出现,单击时将状态更改为“ difficulty_menu”。后退按钮的作用恰好相反。难度菜单到主菜单。请注意,播放按钮和后退按钮位于屏幕上的两个不同位置。

当我按住播放按钮时,一切都会按预期进行。未单击下面的按钮,并且屏幕没有闪烁。但是,当我按住后退按钮时,屏幕会快速闪烁。根据我释放鼠标的时间,我要么进入主菜单,要么进入难度菜单。

我可能忽略了一些小问题,但我只是想不出它是什么。下面是与该问题相关的所有代码和方法调用。我确定其他方法不是问题,因为那里的播放和后退按钮的代码是相同的。

game.py

if self.menu.state == "main_menu":
    self.menu.check_hover(mouse)
    if event.type == pygame.MOUSEBUTTONDOWN and event.button == 1:
        self.menu.check_click(event.pos)
    elif event.type == pygame.MOUSEBUTTONUP and event.button == 1:
        self.menu.play_button.l_click = False
elif self.menu.state == "difficulty_menu":
    self.menu.check_hover(mouse)
    if event.type == pygame.MOUSEBUTTONDOWN and event.button == 1:
        self.menu.check_click(event.pos)
    elif event.type == pygame.MOUSEBUTTONUP and event.button == 1:
        self.menu.easy_button.l_click = False
        self.menu.medium_button.l_click = False
        self.menu.hard_button.l_click = False
        self.menu.back_button.l_click = False

menu.py

def check_hover(self, mouse):
    """
    Buttons are checked to see if they are being hovered over.
    If so, the button color changes.
    """
    if self.state == "main_menu":
        self.play_button.check_hover(mouse)
        self.about_button.check_hover(mouse)
        self.credits_button.check_hover(mouse)
        self.quit_button.check_hover(mouse)
    elif self.state == "difficulty_menu":
        self.easy_button.check_hover(mouse)
        self.medium_button.check_hover(mouse)
        self.hard_button.check_hover(mouse)
        self.back_button.check_hover(mouse)

def check_click(self, pos):
    """
    Buttons are checked to see if they have been clicked.
    """
    if self.state == "main_menu":
        self.play_button.check_left_click(pos)
        self.about_button.check_left_click(pos)
        self.credits_button.check_left_click(pos)
        self.quit_button.check_left_click(pos)
    elif self.state == "difficulty_menu":
        self.easy_button.check_left_click(pos)
        self.medium_button.check_left_click(pos)
        self.hard_button.check_left_click(pos)
        self.back_button.check_left_click(pos)

def update(self):
    """
    The state changes depending on if a button has been clicked.
    """
    if self.state == "main_menu":
        if self.play_button.l_click:
            self.state = "difficulty_menu"
        elif self.about_button.l_click:
            self.state = "about_menu"
        elif self.credits_button.l_click:
            self.state = "credits_menu"
        elif self.quit_button.l_click:
            pygame.quit()
            sys.exit()
    elif self.state == "difficulty_menu":
        if self.easy_button.l_click:
            self.difficulty = "easy"
            self.state = "hidden"
        elif self.medium_button.l_click:
            self.difficulty = "medium"
            self.state = "hidden"
        elif self.hard_button.l_click:
            self.difficulty = "hard"
            self.state = "hidden"
        elif self.back_button.l_click:
            self.state = "main_menu"

1 个答案:

答案 0 :(得分:0)

我意识到自己做错了。在menu.update()中,如果l_click对于播放或后退按钮为true,则更改状态。然后,在game.py中,我正在检查状态条件。状态已经更改,因此程序无法将play_button.l_click或stop_button.l_click设置为False。我通过在名为no_click()的菜单中创建一个将所有button.l_clicks设置为False的新方法来解决此问题。我在game.py的每个状态条件下都调用了此方法。