Не точный метод таймера

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

wait pick random .01 to 3 secondsset ghost effect to 0reset timerrepeat 5wait .05 secondschange ghost effect by 20

и каждый раз, когда я запускаю это, я получаю разные времена. Это не может быть фактом, что я рандомизирую время ожидания, потому что reset timer метод после этого блока. Я провел несколько тестов и пришел к выводу, что 7 из 12 раз я получил 0,8 секунды, что я и пытаюсь получить. 3 из 12 раз я получил 0,7, а 2 из 12 раз я получил 0,6. Если есть какой-либо способ сделать таймер более точным или улучшить мой код, чтобы уменьшить задержку, это будет очень цениться.

1 ответ

Решение

Одним из общих решений было бы сделать функцию призрака спрайта "функцией", основанной на том, сколько времени прошло с момента запуска анимации. Это будет работать примерно так:

Когда клавиша пробела нажата, установите (запуск анимации) на таймер. Повторяйте до (таймер - запуск анимации)> 4: установите цветовой эффект на (200 / 4) * (таймер - запуск анимации 4: установите цветовой эффект на (200 / 4) * (таймер - запуск анимации">

Эта анимация анимирует изменение спрайта вокруг колеса цветового эффекта в течение четырех секунд. Будет очень ясно, как это работает, если мы пройдемся по нему шаг за шагом.

Мы хотим, чтобы наша анимация длилась четыре секунды. Но как мы можем сделать это так долго? Как видно из вашего сценария, просто использование "repeat (40): wait 0.1 секунд" не всегда приводит к ожиданию ровно четырех секунд. Вместо этого мы используем цикл "повторить до": "повторять до (таймер - запуск анимации) > 4".

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

Вот главный вопрос: как, учитывая текущее время анимации, мы можем решить, каким должен быть цветовой эффект? Оказывается, это не так сложно ответить, но нам нужно продумать это, так как это требует математики. Мы хотим перейти от 0 до 200 в течение 4 секунд. Вы можете записать это как показатель: 200 единиц за 4 секунды, то есть 200 / 4. Затем мы просто умножим эту скорость на то, как далеко мы пройдем анимацию: (200 / 4 * прогресс). Прогресс легко получить, опять же; мы просто повторно используем блоки "таймер - запуск анимации".

Вы верите, что я прав? Вот список с некоторыми цифрами, чтобы убедить вас (но на самом деле, вы должны попробовать этот скрипт самостоятельно!):

  • 0s: (таймер - запуск анимации) = 0, цветовой эффект = (200 / 4) * 0 = 0. Это начальная точка анимации, поэтому имеет смысл, чтобы цветовой эффект был равен нулю.
  • 1 с: (таймер - запуск анимации) = 1, цветовой эффект = (200 / 4) * 1 = 50.
  • 2s: (таймер - запуск анимации) = 1, цветовой эффект = (200/4) * 2 = 100. На полпути через 4-секундную длинную анимацию: так как мы переходим от 0 до 200, имеет смысл теперь быть на 100.
  • 3,5 с: (таймер - запуск анимации) = 3,5, цветовой эффект = (200/4) * 3,5 = 175.
  • 4s: (таймер - запуск анимации) = 4, цветовой эффект = (200/4) * 4 = 200. Теперь, когда мы в конце, мы полностью перешли на 200.

Чтобы попробовать это самостоятельно, я рекомендую реализовать некоторую "искусственную задержку". Это просто означает добавление блока "ожидания (случайные 0,1–0,3) секунды" для имитации задержки, которая может проявиться в очень сложном проекте или на медленном компьютере.

Поскольку мы просто имеем дело с базовой математической формулой, очень легко изменить числа, чтобы получить другой результат. Вот скрипт, который переходит от 0 до 100 за 2 секунды:

Когда нажата клавиша G, установите начало анимации на таймер. Повторяйте до (таймер - запуск анимации)> 2: установите побочный эффект на (100/2) * (таймер - запуск анимации 2: установите побочный эффект на (100/2) * (таймер - запуск анимации">

Но вот момент, когда вы можете найти "поймал" - посмотрите, что произойдет, если вы добавите искусственное отставание:

Кошка превращается в призрака... но не исчезает ВСЁ

Кошка превращается в призрака... но не исчезает ВСЁ! Хлоп! Итак, что вызвало это?

Вот проблема: анимация останавливается раньше (таймер - запуск анимации) ровно через 2 секунды. Таким образом, мы никогда не выполняем этот шаг 2 с, где побочный эффект будет равен 100 - и у нас останется спрайт, который не совсем призрачен.

К счастью, решение простое. Просто убедитесь, что вы дополнительно переключаетесь в конечное состояние после окончания анимации. Конечно, это просто означает присоединение соответствующего блока "set effect" сразу после цикла "repeat before":

Когда нажата клавиша G, установите (запуск анимации) на таймер. Повторяйте до (таймер - запуск анимации)> 2: установите побочный эффект на (100/2) * (таймер - запуск анимации). После цикла установите побочный эффект на 100 2: установите побочный эффект на (100/2) * (таймер - запуск анимации). После цикла установите побочный эффект на 100">

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


Кстати, когда вы тестировали эти сценарии для себя - не так ли? - Вы заметили, что это оживляет очень плавно? На самом деле он оживляет как можно более плавно. Он всегда будет анимироваться на верхней частоте кадров, которую может обработать компьютер пользователя, так как он запускает каждый скретч-кадр (нет блока "wait n секунд")! Кроме того, простая проверка вашего понимания - как вы можете повторно реализовать блок "glide (n) секунд до (x) (y)", используя это? Это определенно возможно!

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