• Страница 1 из 1
  • 1
Единый таймер
Дмитрий Дата: Вторник, 16.07.2013, 15:29 | Сообщение # 1 | Сообщить о нерабочей теме


Аватар для Дмитрий



Данный урок поможет вам научиться использовать минимальное количество таймеров в моде (в нашем случае 1), которые могут обрабатывать большинство операций со временем.

Например, вы используете в моде несколько таймеров: один для сохранения аккаунтов, который обновляется каждые 30 секунд, другой, например, для обновления склада с материалами, обновляется раз в 5 секунд, а третий отвечает за обновление часов на сервере и обновляется каждую секунду.

Допустим, Вы поставили 3 таймера в OnGameModeInit() и задали им нужный интервал:
Код
#define Время_Обновления_Часов 1*1000 //  1000 миллисекунд (1 сек)  
#define Время_Обновления_Склада 5*1000  //  5000 миллисекунд ( 5 сек )  
#define Время_Сохранения_Аккаунтов 30*1000  //  30000 миллисекунд ( 30 сек )   

forward Обновить_часы();  
forward Обновить_склад();  
forward Сохранить_аккаунты();  

public OnGameModeInit()   
{   
      // Установить таймеры с временем обновления, равным соответствующим define  
      SetTimer("Обновить_часы",Время_Обновления_Часов,true);   
      SetTimer("Обновить_склад",Время_Обновления_Склада,true);   
      SetTimer("Сохранить_аккаунты",Время_Сохранения_Аккаунтов,true);   
      return 1;   
}    

public Обновить_часы()  
{  
      // Обновление часов  
      return 1;  
}  

public Обновить_склад()  
{  
      // Обновление склада  
      return 1;  
}  

public Сохранить_аккаунты()  
{  
      // Сохранение аккаунтов  
      return 1;  
}  


Цитата
Три таймера будут создавать нагрузку на сервер, а ведь все это можно уместить в один таймер. Назовем его "Processor", зададим ему интервал в 1000 миллисекунд (значит в одну секунду) и включим при запуске мода.

Код
#define PROCESSOR_UPDATE 1000   // Время обновления в миллисекундах ( 1 сек )  
forward Processor();    
public OnGameModeInit()   
{   
      SetTimer("Processor",PROCESSOR_UPDATE,true); // Установка таймера на обновление, равному define PROCESSOR_UPDATE (1 сек)  
      return 1;   
}    

public Processor()   
{   
      // Заменяемый таймеры паблик  
      return 1;   
}  


Цитата
И теперь нацепим на паблик "процессор" функцию обновления часов.

Код
public Processor()   
{   
      // Заменяемый таймеры паблик  
      Обновить_часы();   
      return 1;   
}  


Функция "Обновить_часы()" будет вызываться раз в секунду, как и должно было быть.
Но как поступить с сохранением аккаунтов и обновлением склада? Ведь они имеют иной интервал обновления.
А мы сделаем так:

Цитата
1. Сначала создадим переменные для хранения :

Код
new Обновление_склада = 0;   
new Обновление_часов = 0;   
new Сохранение_аккаунтов = 0;  


Цитата
2. Заменим старые значения времени обновления склада, аккаунтов, часов на новые, переведенные из миллисекунд в секунды:

Код
#define Время_Обновления_Часов 1   
#define Время_Обновления_Склада 5   
#define Время_Сохранения_Аккаунтов 30


Цитата
3. В "Процессор", поверх старого, добавим новое содержание:

Код
public Processor()   
{   
     Обновление_склада ++;   
     Сохранение_аккаунтов ++;   
     Обновление_часов ++;   
     if(Обновление_часов >= Время_Обновления_Часов)   
     //Зачем мы обновляем часы, когда они сами могут обновляться с процессором?   
     //- Для удобного настраивания времени обновления через define   
     {   
           Обновление_часов = 0;   
           Обновить_часы();   
     }   
     if(Обновление_склада >= Время_Обновления_Склада)   
     {   
           Обновление_склада = 0;   
           Обновить_склад();   
     }   
     if(Сохранение_аккаунтов >= Время_Сохранения_Аккаунтов )   
     {   
           Сохранение_аккаунтов = 0;   
           Сохранить_аккаунты();   
     }   
     return 1;   
}  


Что мы делаем? Мы добавляем к переменным значение, которое в действительности является одной секундой, а когда значение переменной достигнет времени обновления, то мы вызовем необходимую функцию и обнулим переменную, тем самым запустив цикл заново.

Цитата
В итоге у нас получилось:

Код
// Голова  
#define PROCESSOR_UPDATE 1000   
#define Время_Обновления_Часов 1   
#define Время_Обновления_Склада 5   
#define Время_Сохранения_Аккаунтов 30    
new Обновление_склада = 0;   
new Обновление_часов = 0;   
new Сохранение_аккаунтов = 0;    

forward Обновить_часы();  
forward Обновить_склад();  
forward Сохранить_аккаунты();  

// Стандартная автовызываемая функция OnGameModeInit  
public OnGameModeInit()   
{   
     SetTimer("Processor",PROCESSOR_UPDATE,true);   
     return 1;   
}    

// Таймерозаменяющий паблик  
forward Processor();    
public Processor()   
{   
     Обновление_склада ++;   
     Сохранение_аккаунтов ++;   
     Обновление_часов ++;   
     if(Обновление_часов >= Время_Обновления_Часов)   
     {   
           Обновление_часов = 0;   
           Обновить_часы();   
     }   
     if(Обновление_склада >= Время_Обновления_Склада)   
     {   
           Обновление_склада = 0;   
           Обновить_склад();   
     }   
     if(Сохранение_аккаунтов >= Время_Сохранения_Аккаунтов )   
     {   
           Сохранение_аккаунтов = 0;   
           Сохранить_аккаунты();   
     }   
     return 1;   
}    

public Обновить_часы()  
{  
      // Обновление часов  
      return 1;  
}  

public Обновить_склад()  
{  
      // Обновление склада  
      return 1;  
}  

public Сохранить_аккаунты()  
{  
      // Сохранение аккаунтов  
      return 1;  
}  


Удачных разработок!

Автор урока: BRICS.
Прикрепления: 2383635.png (4.1 Kb)


From Russia With Love!
  • Страница 1 из 1
  • 1
Поиск: