продолжить цикл, если стрелки не нажаты в Pygame - PullRequest
2 голосов
/ 16 июня 2011

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

def speed(self, key):
    # Figure out if it was an arrow key. If so
    # adjust speed

    n = 'go'
    while n == 'go':
        if key == pygame.K_LEFT:
            x_speed=-5
            y_speed=0
            return x_speed, y_speed
            n = 'stop'
        if key == pygame.K_RIGHT:
            x_speed = 5
            y_speed = 0
            return x_speed, y_speed
            n = 'stop'
        if key == pygame.K_UP:
            y_speed = -5
            x_speed = 0
            return x_speed, y_speed
            n = 'stop'
        if key == pygame.K_DOWN:
            y_speed = 5
            x_speed = 0
            return x_speed, y_speed
            n = 'stop'
        else:
            continue

Ответы [ 2 ]

5 голосов
/ 16 июня 2011

Я никогда не использовал pygame в своей жизни и не написал ни одного слова на python, но вот мое предположение:

def speed(self, key):
    # Figure out if it was an arrow key. If so
    # adjust speed
    if key == pygame.K_LEFT:
        x_speed=-5
        y_speed=0
        return x_speed, y_speed

    if key == pygame.K_RIGHT:
        x_speed = 5
        y_speed = 0
        return x_speed, y_speed

    if key == pygame.K_UP:
        y_speed = -5
        x_speed = 0
        return x_speed, y_speed

    if key == pygame.K_DOWN:
        y_speed = 5
        x_speed = 0
        return x_speed, y_speed

Причина, по которой ваш код не работает, заключается в том, что когда клавиша со стрелкой не нажата, вы эффективно делаете это:

n = "go"
while n == "go":
    continue

Извинения за синтаксические ошибки, а также, если я ошибаюсь, ell.

2 голосов
/ 16 июня 2011

Соблюдение следующих критериев:

  • Цикл закончится только тогда, когда key - стрелка, потому что только return операторов и n = 'stop' операторов происходят, когда keyявляется клавишей со стрелкой.

  • Значение key никогда не изменится внутри цикла, потому что единственное объявление key находится в определении speed()

Мы определяем: если мы вызываем speed () без стрелки key, цикл никогда не закончится.Когда вы запускаете бесконечный цикл в основном потоке выполнения программы, он имеет привычку замораживать все и есть вкусные циклы ЦП.

Решение состоит в том, чтобы реализовать вашу логику асинхронно.Если вы нажмете клавишу, она должна наблюдать за состоянием системы, изменить все, что нужно для запуска действий, а затем быстро вернуться, чтобы не замедлять работу программы.Бесконечный цикл while не является чем-то близким к оптимальному в середине вашей логики обнаружения ключа.

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