Бесконечный цикл одним нажатием кнопки - PullRequest
1 голос
/ 04 мая 2019

Мне нужно запустить бесконечный цикл нажатием пробела (например) и завершить его нажатием пробела снова

@win.event
def on_draw():
    (some code of drawing)


@win.event
def on_key_press(symbol, modifiers):
    global x,y,z,t
    elif symbol == key.SPACE:
        t += 0.05
        x = ((1 - t) ** 3) * (-180) + 3 * t * ((1 - t) ** 2) * (100) + 3 * (t ** 2) * (1 - t) * (0) + (t ** 3) * (200)
        y = ((1 - t) ** 3) * 70 + 3 * t * ((1 - t) ** 2) * (140) + 3 * (t ** 2) * (1 - t) * (140) + (t ** 3) * (
        70)
        z = ((1 - t) ** 3) * 0 + 3 * t * ((1 - t) ** 2) * (100) + 3 * (t ** 2) * (1 - t) * (100) + (t ** 3) * (
        0)
        (here should be a function of endless moving (drawing) while Space haven't pressed again)

1 Ответ

1 голос
/ 04 мая 2019

Это не правильный выбор, чтобы сделать это.У вас уже есть петля, игровая петля.Используй это!

Создание 2 переменных состояния start_loop и run_loop:

start_loop = False
run_loop = False

Если нажата пробел , вам нужно решить, что делать.
Если цикл не работает (not run_loop), запустите цикл, установив start_loop = True. Если цикл работает, остановите цикл на run_loop = False.

def on_key_press(symbol, modifiers):

    if symbol == key.SPACE:
        if not run_loop:
            start_loop = True
        else:
            run_loop = False

В основном цикле выможно различить в трех корпусах.

  1. start_loop - это True.Выполните инициализацию и установите состояния для запуска цикла в следующем кадре (start_loop = False, run_loop = True)
  2. run_loop равно True.Выполните код в цикле
  3. регистр по умолчанию, который делает некоторые рисования
def on_draw():

    global x,y,z,t

    if start_loop:
        start_loop = False
        run_loop = True

        t += 0.05
        x = ((1 - t) ** 3) * (-180) + 3 * t * ((1 - t) ** 2) * (100) + 3 * (t ** 2) * (1 - t) * (0) + (t ** 3) * (200)
        y = ((1 - t) ** 3) * 70 + 3 * t * ((1 - t) ** 2) * (140) + 3 * (t ** 2) * (1 - t) * (140) + (t ** 3) * (70)
        z = ((1 - t) ** 3) * 0 + 3 * t * ((1 - t) ** 2) * (100) + 3 * (t ** 2) * (1 - t) * (100) + (t ** 3) * (0)

    elif run_loop:

        # this is the loop
        # [...] (here should be a function of endless moving (drawing) while Space haven't pressed again)
        pass

    else:

        # this is default
        # [...] (some code of drawing)

Конечно, вы должны добавить функцию расписания с помощью [schedule_interval], который запускает цикл в указанном интервале.

def run_loop(dt):
    on_draw()

pyglet.clock.schedule_interval(run_loop, 0.1) # run every tenth of a second
pyglet.app.run()
...