Обработчики событий Pygame мешают друг другу? - PullRequest
1 голос
/ 08 апреля 2019

Я делаю игровой лаунчер в Python 3.7 и использую библиотеку Pygame ("pg").Я создал класс для интерактивного текста («ссылки»), и у меня есть обработчик событий, который проверяет функцию pg.QUIT.

У меня установлен цикл while, который начинается с функции обработчика событий, которая проверяетдля pg.QUIT, а затем в цикле, у меня есть функция класса, которая прослушивает, нажата ли ссылка.

К сожалению, когда они оба могут работать в цикле, они мешаютдруг друга и некоторые входные данные игнорируются, например, pg.MOUSEBUTTONDOWN (что здесь важно).

Я попытался отключить обработчик событий (я только что прокомментировал строку, которая его вызывает), и это заставило его работать;каждый вход был зарегистрирован.Однако я не хочу проверять pg.QUIT внутри класса объектов, и я не хочу искать конкретные объекты в моем обработчике событий: я хочу хранить эти вещи отдельно.

код в моем классе выглядит следующим образом:

(Inside TextObject class)

def link():

    for e in pg.event.get():

        if e.type == pg.MOUSEBUTTONDOWN and {mouse is over link}:

            print('click!')

Код в моем обработчике событий выглядит следующим образом:

def handle():

    for e in pg.event.get():

        if e.type == pg.QUIT:

            running = False

Код в моем цикле while выглядит следующим образом:

while running:

    handle()

    {update screen and draw text}

    textObject.link()

    clock.tick(fps)

Я хочу, чтобы программа прослушивала pg.QUIT, а затем, если этого не произошло, двигайтесь дальше и слушайте, не нажата ли ссылка.

Когда я запускаю ее,программа только печатает "нажмите!"после того, как я нажал на ссылку около двадцати раз.Это кажется почти случайным.

Я предсказываю, что две функции мешают друг другу, и я мог бы исправить это с помощью какой-то совместной функции, но я бы действительно предпочел быдержите эти функции расплывчатыми без жесткого кодирования в некоторых текстовых координатах, понимаете?

Спасибо.

PS Я использовал псевдокод, чтобы дать некоторый контекст, но яУже подтвердили, что проблема заключается в коде, который я написал явно.

1 Ответ

2 голосов
/ 08 апреля 2019

Переместить все обработку событий в ваш основной цикл.Вы теряете события, потому что некоторые обрабатываются в одном цикле (и отбрасывают необработанные события), и аналогично в другом цикле событий, но для других типов событий.

Распределение обработки событий по различным частям кода усложняет логику и отладку.В идеале это хорошо работает, когда один логический элемент обрабатывается в одном месте.Поэтому, когда у вас есть проблемы с пользовательским вводом, вам нужно только отладить раздел пользовательского ввода - вместо this-function , that-function и this-вещь-в-файле-там-там .

Конечно, если вам нужно увидеть, какая кнопка была нажата или что-то еще, напишите функцию, чтобы сделать это, затем вызовите функцию (передав ейположение мыши) во время обработки события щелчка.

while running:
    # Handle user input
    for e in pg.event.get():

        if e.type == pg.QUIT:
            running = False

        elif e.type == pg.MOUSEBUTTONDOWN:
            if {mouse is over link}:
                print('click!')

     # Handle screen painting
         ...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...