Как мне приостановить весь скрипт на определенное время в javascript? Это вообще возможно?

#javascript #wait

#javascript #подождите

Вопрос:

Мне нужно приостановить мой скрипт, чтобы разрешить ожидание между событиями в моей игре. Если бы кто-нибудь мог объяснить, как я мог бы это сделать, простыми словами (потому что я новичок), я был бы очень признателен. Заранее спасибо!

Комментарии:

1. Всей вашей игре нужен «игровой цикл», который не «приостанавливается», а просто перестает что-то делать. Посмотрите «пошаговое задание». …… Было бы неплохо поместить весь код (в ваш вопрос) в контекст.

2. Когда дело доходит до «приостановки» скрипта javascript, подумайте об этом — если бы вы каким-то образом полностью «приостановили» скрипт, как бы вы смогли «отменить приостановку» скрипта, если скрипт был полностью приостановлен? В то время как, если вы просто используете setTimeout , вместо того, чтобы «приостанавливать» код, вы просто откладываете код, что, безусловно, то, что вы ищете здесь.

3. @cannicide — в некоторых языках, таких как python, есть функция time.sleep(), которая заставит все приостанавливаться на определенное время.

4. См. @Petro ниже для концепции «игрового цикла» и «пошагового задания». «Пауза» не будет запускать обновление, по крайней мере, те части, которые влияют на активную игру. Меню все еще может запускаться во время паузы, например, с условиями if .

5. Вам может понадобиться переменная, которая, если для нее установлено значение true, препятствует продвижению вперед. Затем вы можете использовать setTimeout, чтобы установить значение ist равным false и, таким образом, снова запустить свою игру. Это еще несколько операторов If, но вы можете контролировать, что должно быть приостановлено, а что нет.

Ответ №1:

В идеале вам нужен цикл для управления временем в вашей игре для «пауз», которые были бы просто итерациями цикла. Подумайте о FPS в игре и о том, как каждый цикл будет рисовать что-то новое.

Вот очень простой пример:

 function update(progress) {
  // Update the state of the world for the elapsed time since last render
}

function draw() {
  // Draw the state of the world
}

function loop(timestamp) {
  var progress = timestamp - lastRender

  //you would call your functions here when the game is "running":
  update(progress)
  draw()

  lastRender = timestamp
  window.requestAnimationFrame(loop)
}
var lastRender = 0
window.requestAnimationFrame(loop)
 

Ответ №2:

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

Учебное пособие по setInterval

setTimeout вызовет функцию только один раз по истечении заданного времени.

Учебное пособие по setTimeout

Ответ №3:

setTimeout — это правильный путь.

Пример использования:

 console.log('before')
setTimeout(function() {
  console.log('after - 500ms later')
}, 500)
console.log('still before') 

setTimeout не приостанавливает javascript, это невозможно сделать. Вместо этого он запланирует вызов функции в какой-то момент в будущем. Вот почему, когда вы запускаете фрагмент кода, вы увидите, что «до» и «еще до» регистрируются одновременно. Только содержимое функции, переданное в setTimeout(), произойдет после предоставленной задержки.

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