Итак, новинка - возможность запускать отложенные функции.
Для начала добавляем в файл def.gs следующие строки:
В данном случае мы вводим три новых игровых переменных с номерами 100, 101, 102 (или любые другие свободные для вашей игры номера глобальных игровых переменных). Эти переменные нам необходимы не только для реализации механизма запускоа отложенных функций, но и для корректного сохранения состояния в файле отгрузок.Код:#def G_TICKS 100 // Счетчик игрового времени #def G_TFUNC 101 // Идентификатор отложенной функции #def G_TVALUE 102 // Время вызова отложенной функции
Переменная G_TICKS - это дополнительный таймер, приращиваемый каждый игровой фрейм (1/36 секунды для стандартных настроек). Этот счетчик инкрементируется в хендлере HandlerGameUpdate(), который вызывается только во время игрового процесса, тогда как в режиме меню он не вызывается, и счетчик, как нам и требуется, не инкрементируется.
Переменная G_TFUNC содержит ID (по простому - номер) отложенной функции. Почему номер, а не имя? Все потому, что стандартный файл отгрузок не умеет сохранять строковые величины, и для упрощения каждой отложенной функции присваевается уникальный номер.
Переменная G_TVALUE - это время вызыва отложенной функции.
Далее, добавляем в файл handlers.gs в функцию HandlerGameUpdate() после строк:
следующий фрагмент:Код:// update some particluar object(s) that need to be updated no matter in what room we are // ...
Далее, в файл utils.gs добавляем функцию:Код:TValue = GameGet(G_TVALUE); // Получить время вызова отложенной функции if (TValue) // Если время = 0, то нет отложенных функций { if (TValue <= GameGet(G_TICKS)) // Если текущее время достигло времени вызова функции, то CallTimeFunc(); // вызвать обработчик отложенных функций } GameSet(G_TICKS, GameGet(G_TICKS) + 1); // Прирастить счетчик игрового времени
Ну и, наконец, добавим в игру простой пример.Код:///////////////////////////////////////////////////////////////////////////////// // // Store time function delay and ID // ///////////////////////////////////////////////////////////////////////////////// func TimeFuncSet(fid, fdelay) { GameSet(G_TFUNC, fid); // Сохранить ID отложенной функции в переменной G_TFUNC GameSet(G_TVALUE, GameGet(G_TICKS) + fdelay); // Сохранить время вызыва отложенной функции в переменной G_TVALUE }
В требуемое место игры в файле game.gs сперва добавляем первый запрос отложенной функции:
А так же добавляем в тот же файл game.gs обработчик отложенных функций:Код:TimeFuncSet(TM_FIRSTFUNC, 5*36); // Запросить функцию TM_FIRSTFUNC через 5 секунд
Как видно из примера, сперва запрашивается отложенная функция TM_FIRSTFUNC через интервал 5 секунд. В этой функции игрока подбрасывает наверх и звучит звук, а так же сразу запрашивается следующая отложенная функция TM_SECONDFINC через интервал 10 секунц. В этой функции у игрока убавляется 30 единиц энергии и так же звучит звук, после чего отложенные функции отключаются.Код:///////////////////////////////////////////////////////////////////////////////// // // Time Functions (non-latent) // ///////////////////////////////////////////////////////////////////////////////// #def TM_FIRSTFUNC 1 #def TM_SECONDFUNC 2 // ... etc func CallTimeFunc() { TFunc = GameGet(G_TFUNC); // Получить ID вызываемой функции if (TFunc == 1) // TM_FIRSTFUNC { println("First Time Call"); // [отладочная информация] CM_EnterJump(0, 10); // Прыжок вверх SamplePlay(1); // Включить звук №1 TimeFuncSet(TM_SECONDFUNC, 10*36); // Запросить функцию TM_SECONDFUNC через 10 секунд return; // Выход } if (TFunc == 2) // TM_SECONDFINC { println("Second Time Call"); // [отладочная информация] PlayerSet(P_LIFE,PlayerGet(P_LIFE)-30); // Отнять у Диззи 30 единиц энергии SamplePlay(2); // Включить звук №2 GameSet(G_TVALUE, 0); // Отключить запрос временных функций return; // Выход } // ... etc GameSet(G_TVALUE, 0); // Отключить запрос временных функций // (заглушка для неправильных ID функций) }
Замечание: поскольку, обработчик отложенных функций не фоновой (non-latent), то из него НЕ ДОЛЖНЫ вызываться фоновые (latent) функции. При желании вызвать фоновые функции, следует пользоваться конструкцией ScrRequest(). Однако, т.к. отложенная функция может вызваться в любой момент, в независимости от игровой ситуации (кроме нахождения в меню), отложенными функциями следует пользоваться с большой аккуратностью, чтобы не испортить ход игры.
Так же статья опубликована на DizziAge-форуме




Ответить с цитированием