--- title: "🕐 Реализуем sleep() в GameMaker" date: 2022-12-06T23:28:06+03:00 draft: false tags: [gamedev, tips, gamemaker] --- ## Немного слов о sleep В [GameMaker](https://gamemaker.io/) отсутсвует функция **sleep();** Не помню, была ли она в ранних версиях, но в v2022.11, использование этой функции вызывает Debugger в браузере. ## Зачем мне sleep? У меня появилась необходимость в функции `sleep()`, когда я столкнулся с одним багов при экспорте проекта в HTML5. Баг был связан с генерацией рандомных чисел функццией `irandom_range()`; ## Разбираем код Имеется объект, допустим `oPwd`. В событии `Create` я создаю переменную `pwd`, которая вызывает функцию `password_generate()`; ```cpp // Create event pwd = password_generate(6); ``` Фукнкция `password_generate()` принимает в качестве аргумента длину пароля, который необходимо сгенерировать и возвращает его переменной. ```cpp function password_generate(_length) { var password = ""; for (var i = 0; i < _length; i += 1) { randomize(); var pwd_symbol = irandom_range(0, 9); password += string(pwd_symbol); } return password; } ``` Код достаточно просто, но он не работает должныи образом. При экспорте проекта в HTML5, пароль генерируется из одного числа. Например: `111111`, `999999`, `444444`. Если добавить (для теста) в код вызов функции `show_message()`, пароль генерируется, как и задумывалось, рандомный. ## Чиним баг генерации Первое решение, которое пришло мне в голову, это использовать вызов функции`sleep()`, чтобы хоть как-нибудь затормозить браузер и дать функции [`randomize()`](https://manual.yoyogames.com/GameMaker_Language/GML_Reference/Maths_And_Numbers/Number_Functions/randomise.htm) отработать правильно. В англоязычном интернете, особенно на Reddit и форуме GM много тем, про функцию `sleep()` и как её можно реализовать. Однако я подсмотрел рабочее, но не очень элегантное решение, это использовать оператор [`repeat`](https://manual.yoyogames.com/GameMaker_Language/GML_Overview/Language_Features/repeat.htm). ```cpp repeat () { ; ; ... } ``` При использовании оператора `repeat` блок кода повторяется столько раз, сколько указано в выражении. Я добавил `repeat` в свою функцию `password_generate()` и код получился таким: ```cpp function password_generate(_length) { var password = ""; for (var i = 0; i < _length; i += 1) { if (os_browser) { /* * Костыл специально для браузеров * Если не сделать "задержку", * то пароль будет состоять из одного числа */ repeat ((current_month+current_day+current_hour+current_minute+current_second)*1000) { randomize(); } } else { randomize(); } var pwd_symbol = irandom_range(0, 9); password += string(pwd_symbol); } return password; } ``` Решение вызывать фунцию `randomize()` несколько миллионов раз может быть и не самое умное, однако игра в браузере не лагает, CPU не нагружается, по этому решение имеет место быть. ## P.S. Если у тебя имеется идея по лучше, пожалуйста предлагай. Если я сам найду решение лучше, я обязательно оставлю здесь ссылку.