Я делаю средство запуска игр на 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. Я использовал псевдокод, чтобы дать некоторый контекст, но я уже подтвердил, что проблема заключается в коде, который я написал явно.
Переместите все обработку событий в основной цикл. Вы теряете события, потому что некоторые из них обрабатываются в одном цикле (и отбрасываются необработанные события) и аналогичным образом в другом цикле событий, но для других типов событий.
Распределение обработки событий по различным частям кода усложняет логику и отладку. В идеале хорошо работать с одним логическим элементом, обрабатываемым в одном месте. Поэтому, когда у вас есть проблема с пользовательским вводом, вам нужно отладить только раздел пользовательского ввода, а не эта функция, эта функция и эта-вещь-в-файле-там.
Конечно, если вам нужно увидеть, какая кнопка была нажата или что-то еще, напишите для этого функцию, а затем вызовите функцию (передав ей положение мыши) во время обработки события щелчка.
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
...
Эй, это сильно очистило код, и это тоже сработало! В итоге мне пришлось перенастроить способ обработки местоположения моего объекта, но все сработало отлично, спасибо!