Pygame: экран мерцает, когда я удерживаю мышь, но только указанную кнопку c - PullRequest
0 голосов
/ 15 февраля 2020

У меня есть несколько кнопок, находящихся в классе меню. Я хочу особо отметить кнопки воспроизведения и кнопку возврата. Кнопка воспроизведения отображается в состоянии «main_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 голосов
/ 15 февраля 2020

Я понял, что сделал не так. В menu.update (), если l_click имеет значение true для кнопки воспроизведения или возврата, я изменил состояние. Затем в game.py я проверяю состояние. Состояние уже изменилось, поэтому программе никогда не удавалось установить для play_button.l_click или stop_button.l_click значение False. Я исправил проблему, создав новый метод в меню no_click (), который установил для всех button.l_clicks значение False. Я вызывал этот метод в каждом состоянии состояния в game.py.

...