Предисловие
Давайте для понимания узнаем, что же за зверь такой - таймер. Таймеры в игре это по сути функции которые ставят определенный паблик/функцию на какое то время до его исполнения. Т.е. таймер может работать только с пабликом/функцией. Паблик/функция в свою очередь исполняется после истечения времени установленного в таймере (измеряется в милисекундах). Также перед началом урока хочу предложить и обьяснить как легче всего вычислять время в таймере, а также в других функциях. Поскольку 1 секунда = 1000 милисекунд, а 1 минута = 60 секунд, сделаем логичный вывод, что - 1000*60 = 1 минута, а например 1000*60*4 = 4 минуты и т.д. Теперь можно начинать урок.
SetTimer
SetTimer - самая простая из двух функций таймеров. Она просто исполняет определенный паблик/функцию через некоторое время. Записывается в виде:
SetTimer("FuncName",time,repeating);
Где: "FuncName" - название паблика/функции на которую вы хотите поставить таймер(обязательно в кавычках " " ! ), time - время на которое вы хотите поставить таймер (например 1000*60*5 = 5 минут, это разбиралось в предисловии), repeating - будет ли таймер стартовать заново при исполнении (тогда для его остановки надо будет использовать KillTimer (об этом позже) ) поскольку аргумент принимает только boolean, его значения могут быть - false, true. Функция возвращает ID запущенного таймера (может использоватся в KillTimer).
Приведем пример работы с функцией:
forward TimerPublic();//сделаем паблик который будем ставить на таймер public OnGameModeInit() { SetTimer("TimerPublic",1000*60,true); return 1; } public TimerPublic() { SendClientMessageToAll(0xFFFFFFAA,"Таймер TimerPublic закончил свою работу"); return 1; }
таким образом каждую минуту (1000 милисекунд = 1 секунда, 60 секунд = 1 минута => 1000*60 = 1 минута) в общий чат будет выводится сообщение
Таймер TimerPublic закончил свою работу
поскольку значение аргумента repeating равно true (т.е. 1), то таймер не остановится пока не будет применена функция KillTimer. Выше я привел думаю всем знакомый простенький скрипт announce'а, т.е вывода в чат определенных сообщений через определенное время. Но что же делать если нам в каком-то случае надо остановить таймер, а в каком-то продолжить? Напишем код
new timerperem; forward TimerPublic(); public OnGameModeInit() { SetTimer("TimerPublic",1000*60,false); return 1; } public TimerPublic() { switch(timerperem) { case 0: { SetTimer("TimerPublic",1000*60,false); timeperem = 1; } case 1: { SendClientMessageToAll(0xFFFFFFAA,"Таймер TimerPublic сработал 2 раза и прекратил свою работу"); timeperem = 0; } } return 1; }
Т.е. мы сделали аргумент repeating равным false и поэтому в определенных обстоятельствах (при timeperem = 0) нам пришлось вручную продолжать таймер, но при timeperem = 1 убивать нам его не пришлось, так как таймер не начинает сам работать после окончания.
SetTimerEx
Но, что же нам делать если мы хотим не только поставить паблик на таймер, но и применить к нему определенные аргументы? В этом нам поможет SetTimerEx. Синтаксис функции таков:
SetTimerEx("FuncName",time,repeating,const format[], { Float,_}:...);
Первые три аргумента нам знакомы, однако что делаеть еще с двумя? Они то нам и нужны для того чтобы применить к паблику аргументы. const format[] это формат аргументах которые вы должны применить (кто пользуется sscanf тот знает), пишется в кавычках. Например "is" если наши аргументы - 1: integer , 2:string значения. Кто не понял примеры:
SetTimerEx("FuncName",1000*60,false,"i",1);//поскольку 1 - integer значение то напишем "i" SetTimerEx("FuncName",1000*60,false,"s","Лолико");//поскольку "Лолико" - string значение, пишем "s" SetTimerEx("FuncName",1000*60,false,"f",1.01);//поскольку 1.01 - float значение пишем - "f" //а теперь все вместе SetTimerEx("FuncName",1000*60,false,"fis",1.01,90,"Лолико"); SetTimerEx("FuncName",1000*60,false,"iis",2,3,"Лолико");
Вот полная таблица format аргумента:
i Stands for an integer parameter. Integer параметр. d Exactly the same as i. Тоже самое, что и "i" a Passes an array, the next parameter must be an integer ("i") with the array's size. s Stands for a string parameter. String параметр. f Stands for a float parameter. Float параметр. b Stands for a boolean parameter. Bool параметр.
А теперь докажем, что это работает.
forward TimerPublic(integ,const string[],Float:floatt); public OnGameModeInit() { SetTimerEx("TimerPublic",1000*60,false,"isf",90,"lolled",1.1); return 1; } public TimerPublic(integ,const string[],Float:floatt) { printf("integ:%i string:%s floatt:%f",integ,string,floatt); return 1; }
Таким образом через минуту после включения сервера в консоли появится сообщение
integ:90 string:lolled floatt:1.1
KillTimer
Данная функция используется если вам неожиданно понадобилось прервать работу таймера. Синтаксис совсем простой
KillTimer(timerid);
где timerid - ид таймера.
Для того чтобы получить ид таймера, нам надо проделать следующее
new timer; timer = SetTimer("FuncName",1000*60,false);
таким образом переменная timer будет равна ID таймера FuncName.
И соответственно, чтобы убить таймер надо написать
KillTimer(timer);
Вот и все. Урок закончен.
By REALman
Сообщение отредактировал Mike: 19 января 2012 - 14:09