shape1
shape2
shape3
shape4
shape7
shape8

Работа с таймерами (SetTimer,SetTimerEx)


Статус
Закрыто для дальнейших ответов.

sickdrift

Новичок
Пользователь
17.09.2015
34
0
0
27
Итак доброго времени суток, в этом уроке я расскажу как работать с таймерами. И поскольку таймеров 2 вида, урок поделен на две части.

Предисловие

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

А теперь докажем, что это работает.

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 

 
Статус
Закрыто для дальнейших ответов.