Обработчики событий Pygame мешают друг другу?

Я делаю средство запуска игр на 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, а затем, если этого не произошло, продолжайте и прослушивайте, чтобы увидеть, была ли нажата ссылка.

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

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

Спасибо.

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

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
0
184
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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

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

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

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
         ...

Эй, это сильно очистило код, и это тоже сработало! В итоге мне пришлось перенастроить способ обработки местоположения моего объекта, но все сработало отлично, спасибо!

Endvisible 08.04.2019 03:33

Другие вопросы по теме