DizzyAge по-русски http://dizzyage.flybb.ru/ |
|
Отложенные функции http://dizzyage.flybb.ru/topic10.html |
Страница 1 из 1 |
Автор: | Titus [ 13 ноя 2012, 03:23 ] |
Заголовок сообщения: | Отложенные функции |
Итак, новинка - возможность запускать отложенные функции. Для начала добавляем в файл 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(). Однако, т.к. отложенная функция может вызваться в любой момент, в независимости от игровой ситуации (кроме нахождения в меню), отложенными функциями следует пользоваться с большой аккуратностью, чтобы не испортить ход игры. |
Автор: | osa [ 13 ноя 2012, 12:06 ] |
Заголовок сообщения: | Re: Отложенные функции |
TimeFuncSet(TM_FIRSTFUNC, 5*36); т.е. TimeFuncSet(1, 5*36); а вся обработка в одном месте? |
Автор: | Titus [ 13 ноя 2012, 15:11 ] |
Заголовок сообщения: | Re: Отложенные функции |
osa писал(а): TimeFuncSet(TM_FIRSTFUNC, 5*36); т.е. TimeFuncSet(1, 5*36); а вся обработка в одном месте? Да. |
Автор: | osa [ 14 ноя 2012, 18:05 ] |
Заголовок сообщения: | Re: Отложенные функции |
ок, пасиба:) |
Автор: | osa [ 01 дек 2012, 00:23 ] |
Заголовок сообщения: | Re: Отложенные функции |
обработчик с переменными ставить ДО вызывающей обработчик функции |
Страница 1 из 1 | Часовой пояс: UTC + 4 часа |
Powered by phpBB® Forum Software © phpBB Group http://www.phpbb.com/ |