Форум Pawn-Wiki.Ru - Воплоти мечту в реальность!: Работа с таймерами (SetTimer,SetTimerEx) - Форум Pawn-Wiki.Ru - Воплоти мечту в реальность!

Перейти к содержимому

  • (2 Страниц) +
  • 1
  • 2
  • Вы не можете создать новую тему
  • Вы не можете ответить в тему

[ Урок ]
Работа с таймерами (SetTimer,SetTimerEx) SetTimer, SetTimerEx
Оценка: ***** 2 Голосов

#1
Пользователь офлайн   Romzes 

  • © Pawn-Wiki.Ru
  • Вставить ник
  • Цитировать
  • Раскрыть информацию
Итак доброго времени суток, в этом уроке я расскажу как работать с таймерами. И поскольку таймеров 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 параметр.



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

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

9

Сказали спасибо 2:

#2
Пользователь офлайн   SwipoStyle 

  • Благодетель
  • Вставить ник
  • Цитировать
  • Раскрыть информацию
Я не очень понял, пожалуйста можете сделать мне простую систему зарплаты. Каждые 30 минут всем игрокам давалось 5к и писалось в чат: "За игру на сервере вы получили зарплату".
0

#3
Пользователь офлайн   Romzes 

  • © Pawn-Wiki.Ru
  • Вставить ник
  • Цитировать
  • Раскрыть информацию
Ну тут легко вот смотри...

Ковсем forward:
forward PayDay();


В OnGameModeInit:
SetTimer("PayDay",1800000,1); //ЗП каждые 30 минут


И создаем паблик:
public PayDay()
{
	for(new i = 0; i < MAX_PLAYERS; i++)
{
	GivePlayerMoney(i,5000);
SendClientMessage(i,0xFFFFFFAA, "За игру на сервере вы получили зарплату 5к.");
}
	return 1;
}



Вот и все.
8

Сказали спасибо 1:
Luiji 

#4
Пользователь офлайн   Erick 

  • Эксперт
  • Вставить ник
  • Цитировать
  • Раскрыть информацию
Sprite, ты вчера из скайпа вышел, я же сделал пай дай.. Мне подсказали я мучался и сделал :D
А за урок огромный +
0

#5
Пользователь офлайн   Erick 

  • Эксперт
  • Вставить ник
  • Цитировать
  • Раскрыть информацию
Только в этом тиммере зп каждые 30 минут по времени я посмотрел, а что бы был час "3600000"
0

#6
Пользователь офлайн   Erick 

  • Эксперт
  • Вставить ник
  • Цитировать
  • Раскрыть информацию
Я, пожалуй посложнее вопрос задам: Как сделать, что бы была проверка на время игры, тоесть если не поиграл ровно час не выдавалась зп..?
0

#7
Пользователь офлайн   SwipoStyle 

  • Благодетель
  • Вставить ник
  • Цитировать
  • Раскрыть информацию
Romzes the Best! Спасибо! +1
0

#8
Пользователь офлайн   LiMOH 

  • Эксперт
  • Вставить ник
  • Цитировать
  • Раскрыть информацию
Помог, спасибо) Плюс поставил.
0

#9
Пользователь офлайн   ananas888 

  • Новичок
  • Вставить ник
  • Цитировать
  • Раскрыть информацию
О_о спасибо!!))
0

#10
Пользователь офлайн   moskalukigor 

  • Новичок
  • Вставить ник
  • Цитировать
  • Раскрыть информацию
Отличный урок +
0

Поделиться темой:


  • (2 Страниц) +
  • 1
  • 2
  • Вы не можете создать новую тему
  • Вы не можете ответить в тему

1 человек читают эту тему
0 пользователей, 1 гостей, 0 скрытых пользователей