Pygame Python окно перестает отвечать - PullRequest
0 голосов
/ 02 октября 2018

Добрый день.Я использую Pygame с Python 3.6.5.Вот мой код:

if event.type == pygame.KEYDOWN:
                if pygame.key == pygame.K_UP:
                    my_change = -15

my += my_change

pygame.display.update()
clock.tick(24)

Моя проблема в том, что когда я добавляю

running = True
while running: 

в начало этого кода, а затем запускаю его, мое окно просто перестает отвечать, даже еслиЯ добавил всего лишь 2 строки кода!

PS: У меня нет кода, который мог бы вырваться из этого пока .Может ли это быть одной из возможных причин этого?Впоследствии я делаю отступ в коде, поэтому он выполняется только в течение короткого периода времени.Кроме того: Это все на самом деле в моем цикле основной игры. Также: Мой спрайт, Супер Марио, просто падает сквозь мою землю.

Любая помощь или идеи по этому вопросу и / или как решить эту проблему?

Спасибо !!!

Ответы [ 2 ]

0 голосов
/ 02 октября 2018

Я думаю, что это проблема с вашими циклами.

В цикле pygame:

while True:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            pygame.quit()
    pygame.display.update()

Как вы можете видеть, это бесконечный цикл.Тогда проблема возникает здесь:

running = True
while running:
    if event.type == pygame.KEYDOWN:
        if pygame.key == pygame.K_UP:
            my_change = -15

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

Помните, что обновление в pygame должно идти только в одной операции.Так как эта операция будет повторяться для каждого цикла в основном игровом цикле.Попробуйте пересмотреть свой код с учетом этого.Как сейчас, ваш код не будет работать независимо от того, как мы его упорядочим.

Совет: Для движения персонажа создайте класс для обработки вашего персонажа и добавьте функцию для его обновления, чтобы обновить его позицию.Наиболее распространенный подход на мой взгляд.

Возможное исправление: Переместите на выполнение за пределы цикла событий.Затем добавьте запуск в качестве еще одной проверки в событии keydown.

running = True
while True:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            pygame.quit()

        if running and event.type == pygame.KEYDOWN:
            if pygame.key == pygame.K_UP:
                my_change = -15
    my += my_change
    pygame.display.update()
0 голосов
/ 02 октября 2018

Попробуйте добавить for event in pygame.event.get(): перед вашим

if event.type == pygame.KEYDOWN:
                if pygame.key == pygame.K_UP:
                    my_change = -15

, чтобы оно стало:

running = True
while running:
    for event in pygame.event.get():
         if event.type == pygame.KEYDOWN:
                if pygame.key == pygame.K_UP:
                    my_change = -15

Согласно Документации Pygame , "Pygame обрабатывает все своиобмен сообщениями о событиях через очередь событий. Подпрограммы в этом модуле помогают вам управлять этой очередью событий. Входная очередь сильно зависит от модуля отображения pygame. Если отображение не было инициализировано и режим видео не установлен, очередь событий не будетдействительно работает. "

При вызове" pygame.event.get () "," он получит все сообщения и удалит их из очереди. Если указан тип или последовательность типов, то только эти сообщения будутудалено из очереди.

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

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