Итак, новинка - возможность запускать отложенные функции.
Для начала добавляем в файл def.gs следующие строки:
Код:
#def G_TICKS 100 // Счетчик игрового времени
#def G_TFUNC 101 // Идентификатор отложенной функции
#def G_TVALUE 102 // Время вызова отложенной функции
В данном случае мы вводим три новых игровых переменных с номерами 100, 101, 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
// ...
следующий фрагмент:
Код:
TValue = GameGet(G_TVALUE); // Получить время вызова отложенной функции
if (TValue) // Если время = 0, то нет отложенных функций
{
if (TValue <= GameGet(G_TICKS)) // Если текущее время достигло времени вызова функции, то
CallTimeFunc(); // вызвать обработчик отложенных функций
}
GameSet(G_TICKS, GameGet(G_TICKS) + 1); // Прирастить счетчик игрового времени
Далее, в файл utils.gs добавляем функцию:
Код:
/////////////////////////////////////////////////////////////////////////////////
//
// 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 сперва добавляем первый запрос отложенной функции:
Код:
TimeFuncSet(TM_FIRSTFUNC, 5*36); // Запросить функцию TM_FIRSTFUNC через 5 секунд
А так же добавляем в тот же файл game.gs обработчик отложенных функций:
Код:
/////////////////////////////////////////////////////////////////////////////////
//
// 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 функций)
}
Как видно из примера, сперва запрашивается отложенная функция TM_FIRSTFUNC через интервал 5 секунд. В этой функции игрока подбрасывает наверх и звучит звук, а так же сразу запрашивается следующая отложенная функция TM_SECONDFINC через интервал 10 секунд. В этой функции у игрока убавляется 30 единиц энергии и так же звучит звук, после чего отложенные функции отключаются.
Замечание: поскольку, обработчик отложенных функций не фоновой (non-latent), то из него НЕ ДОЛЖНЫ вызываться фоновые (latent) функции. При желании вызвать фоновые функции, следует пользоваться конструкцией ScrRequest(). Однако, т.к. отложенная функция может вызваться в любой момент, в независимости от игровой ситуации (кроме нахождения в меню), отложенными функциями следует пользоваться с большой аккуратностью, чтобы не испортить ход игры.