DizzyAge по-русски

Русскоязычный форум для любителей игр на движке DizzyAge
Текущее время: 25 сен 2020, 20:57

Часовой пояс: UTC + 4 часа




Начать новую тему Ответить на тему  [ Сообщений: 5 ] 
Автор Сообщение
 Заголовок сообщения: Отложенные функции
СообщениеДобавлено: 13 ноя 2012, 03:23 
Не в сети
Site Admin

Зарегистрирован: 15 окт 2012, 00:51
Сообщения: 3712
Итак, новинка - возможность запускать отложенные функции.

Для начала добавляем в файл 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(). Однако, т.к. отложенная функция может вызваться в любой момент, в независимости от игровой ситуации (кроме нахождения в меню), отложенными функциями следует пользоваться с большой аккуратностью, чтобы не испортить ход игры.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Отложенные функции
СообщениеДобавлено: 13 ноя 2012, 12:06 
Не в сети

Зарегистрирован: 16 окт 2012, 14:03
Сообщения: 12
TimeFuncSet(TM_FIRSTFUNC, 5*36);

т.е. TimeFuncSet(1, 5*36); а вся обработка в одном месте?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Отложенные функции
СообщениеДобавлено: 13 ноя 2012, 15:11 
Не в сети
Site Admin

Зарегистрирован: 15 окт 2012, 00:51
Сообщения: 3712
osa писал(а):
TimeFuncSet(TM_FIRSTFUNC, 5*36);

т.е. TimeFuncSet(1, 5*36); а вся обработка в одном месте?

Да.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Отложенные функции
СообщениеДобавлено: 14 ноя 2012, 18:05 
Не в сети

Зарегистрирован: 16 окт 2012, 14:03
Сообщения: 12
ок, пасиба:)


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Отложенные функции
СообщениеДобавлено: 01 дек 2012, 00:23 
Не в сети

Зарегистрирован: 16 окт 2012, 14:03
Сообщения: 12
обработчик с переменными ставить ДО вызывающей обработчик функции


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 5 ] 

Часовой пояс: UTC + 4 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 0


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения

Найти:
Перейти:  

Powered by Forumenko © 2006–2014
Русская поддержка phpBB