Создаем логическую энтитю

Создание Logical Entity

Для начала мы создадим логическую энтить которая будет выполнять простейшую работу. Эта энтитя хранит значение и увеличивает его каждый раз когда получает ввод (input) от другой энтити. Когда счетчик достигнет заданного нами значения, энтития сгенерирует вывод (output) позволяющий оповестить другие энтити об этом условии.

1) Создаем файл используя код из ..dllssdksdk_logicalentity.cpp и добавляем его к проекту server

2 ) Добавляем определение класса

class CMyLogicalEntity : public CLogicalEntity
{
public:
       DECLARE_CLASS( CMyLogicalEntity, CLogicalEntity );
};

Мы наследуем нашу новую энтитю от класса CLogicalEntity. Этот класс энтити которая находится на стороне сервера и не будет передавать данные на сторону клиента. Также мы будем использовать вспомогательный макрос DECLARE_CLASS который скрывает от нас некоторые рутинные действия. Унаследовав CMyLogicalEntity от CLogicalEntity мы используем его как базовый класс (BaseClass). Это будет важно позднее для обращения к функциональности которую несет CLogicalEntity от которого мы унаследовали класс.

3) Связываем класс с именем энтити

Затем мы связываем класс CMyLogicalEntity с уникальным именем класса (classname) энтити которое сможет идентифицироваться движком.

LINK_ENTITY_TO_CLASS( my_logical_entity, CMyLogicalEntity );

Здесь для класса CMyLogicalEntity объявляется его имя класса (classname) как "my_logical_entity". Это имя которое Хаммер будет использовать для ссылки на тип энтити а также будет определяться как остальные энтити будут искать и находить наш тип энтити. имя_класса (classname) отличается от имени назначения (targetname) энтити, которое является строкой которая идентифицирует одну энтитю или группу энтитей. classname указывает на все энтити данного типа, тогда как targetname может связывать несколько разных типов энтитей (например у вас может быть энтитя с именем класса env_splash которая принадлежит группе энтитей, у каждой из которых targetname равен splash_group).


4) Добавляем переменные-члены

int     m_nThreshold;  // Count at which to fire our output
int     m_nCounter;    // Internal counter

Здесь мы описали две целые переменные которые будут в дальшейшем использоваться в счетчике.


5) Объявляем описание данных для энтити

 . . .

public:
       DECLARE_CLASS( CMyLogicalEntity, CBaseEntity );
       DECLARE_DATADESC();

 . . .

LINK_ENTITY_TO_CLASS( my_logical_entity, CMyLogicalEntity );
BEGIN_DATADESC( CMyLogicalEntity )

DEFINE_FIELD( m_nCounter, FIELD_INTEGER ),
DEFINE_KEYFIELD( m_nThreshold, FIELD_INTEGER, "threshold" ),

END_DATADESC()

Макрос DECLARE_DATADESC должен включаться в код для того чтобы компилятор мог знать что мы добавляем описание таблицы данных (data description table) ниже в имплементации класса. Описание данных содержит различные определения для переменных и специальных функций для этого класса. Поэтому, m_nCounter описывается для сохранения/загрузки функциональности, и m_nThreshold описывается для того чтобы сообщить игре об использовании значения с именем "threshold" (конечного значение) для связи этой переменной с значением ключа в энтите в Хаммере.


6) Создаем событие вывода (output event)

COutputEvent   m_OnThreshold;
DEFINE_OUTPUT( m_OnThreshold, "OnThreshold" ),

Это событие будет включаться при встрече описанного конечного значения.


7) Создаем функцию ввода (input function)

void InputTick( inputdata_t &inputData );

void CMyLogicalEntity::InputTick( inputdata_t &inputData )
{
       // Increment our counter
       m_nCounter++;

       // See if we've met or crossed our threshold value
       if ( m_nCounter >= m_nThreshold )
       {
              // Fire an output event
              m_OnThreshold.FireOutput( inputData.pActivator, this );
             
              // Reset our counter
              m_nCounter = 0;
       }
}

Эта функция просто увеличивает счетчик и генерирует вывод и ввод когда значение счетчика достигает конечного значения, как это указано в свойстве энтити в Хамере. Данная функция не извлекает никаких значений из Хаммера.


8) Создаем запись в FGD файле

@PointClass base(Targetname) = my_logical_entity : "Tutorial logical entity."
[
       threshold(integer) : "Threshold" : 1 : "Threshold value."
       input Tick(void) : "Adds one tick to the entity's count."
       output OnThreshold(void) : "Threshold was hit."
]

Для использования энтити в Хаммере, мы должны создать запись в FGD файле. Хаммер будет использовать эти данные для того точбы понять различные значения ключей и функции которые предоставляет энтитя. Для этого мы описываем значение "threshold" которе связали с переменной класса m_nThreshold, функцию ввода Tick и функцию вывода OnThreshold.


9) Компиляция и запуск

Компилируем код и запускаем карту sdk_entity_logical. Стоя на платформе что прямо перед вами когда запускается карта, выйдите из нее, станьте обратно. Свет включиться. Повторите шаги и свет выключиться. Хотя мы могли реализовать данную функциональность более простым путем используя энтитю типа logic_counter, данный урок может служить неплохой отправной точкой в создании логических энтитей.


Источник: Source Inside

CMT (CS Mapping Tutorials) - © 2006-2011+. Created by VM
[ Script Execution time: 0.0044 ]