Ru/Authoring a Logical Entity: Difference between revisions

From Valve Developer Community
< Ru
Jump to navigation Jump to search
m (link fix)
mNo edit summary
Line 1: Line 1:
Для начала мы создадим логическую энтить которая будет выполнять простейшую работу. Эта энтитя хранит значение и увеличивает его каждый раз когда получает ввод (input) от другой энтити. Когда счетчик достигнет заданного нами значения, энтития сгенерирует вывод (output) позволяющий оповестить другие энтити об этом условии.
Для начала мы создадим логическую энтити которая будет выполнять простейшую работу. Она будет хранит значение и увеличивать его каждый раз когда получает ввод (input) от другой энтити. Когда счетчик достигает заданного нами значения, энтити сгенерирует вывод (output) позволяющий оповестить другие энтити об этом условии.


=Создаем CPP файл для новой энтити=
=Создаем CPP файл для новой энтити=
[[Image:Add existing item.gif|Добавляем исходный файл в проект server.dll по правому щелчку.]]
[[Image:Add existing item.gif|Добавляем исходный файл в проект server.dll по правому щелчку.]]


* Создаем файл называемый <code>sdk_logicalentity.cpp</code>. Этот файл должен быть внутри пакпки dlls которая находить в папке с вашим исходным кодом. Например, если вы установили код в <code>C:\MyMod\src</code>, тогда вы должны создать файл называемый <code>C:\MyMod\src\dlls\sdk_logicalentity.cpp</code>.
* Создаем файл называемый <code>sdk_logicalentity.cpp</code>. Этот файл должен быть внутри пакпки dlls, которая, в свою очередь,  находится в папке с вашим исходным кодом. Например, если вы установили код в <code>C:\MyMod\src</code>, то вы должны создать файл из <code>C:\MyMod\src\dlls\sdk_logicalentity.cpp</code>.
* Далее копируем [[Logical Entity Code |этот код]] и вставляем его в новый файл.
* Далее копируем [[Logical Entity Code |этот код]] и вставляем его в новый файл.
* В последнею очередь добавляем этот файл в ваш проект server.dll. Если вы открыли <code>game_sdk.sln</code> solution, тогда вы можете щелкнуть правой кнопкой на проекте hl в окне Solution Explorer и выбрать Add, затем Add Existing Item.
* В последнею очередь добавляем этот файл в ваш проект server.dll. Если вы открыли <code>game_sdk.sln</code> solution, тогда вы можете щелкнуть правой кнопкой на проекте hl в окне Solution Explorer и выбрать Add, затем Add Existing Item.
Line 19: Line 19:
</pre>
</pre>


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


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


Затем мы связываем класс <code>CMyLogicalEntity</code> с  фактической энтитей <code>classname</code> на котрую сможет ссылаться движок.
Затем мы связываем класс <code>CMyLogicalEntity</code> с  фактической энтитей <code>classname</code> на которую сможет ссылаться движок.


<pre>
<pre>
Line 29: Line 29:
</pre>
</pre>


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






==Добавляем переменные члены класа==
==Добавляем переменные в класс==


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


==Объявляем описание данных для энтити==
==Используем описание данных энтити==
<pre>
<pre>
  . . .
  . . .
Line 71: Line 71:
</pre>
</pre>


Это событие будет включаться при встрече описанного конечного значения. Для доп-ой информации смотрите [[Entity Input and Outputs|энтити ввода-вывода]].
Это событие будет включаться при встрече описанного конечного значения. Для доп-ой информации смотрите [[Entity Input and Outputs|вводы и выводы энтитей]].


==Создаем функцию ввода (input function)==
==Создаем функцию ввода (input function)==
Line 80: Line 80:
void CMyLogicalEntity::InputTick( inputdata_t &inputData )
void CMyLogicalEntity::InputTick( inputdata_t &inputData )
{
{
       // Увеличиваем наш счетчик
       // Увеличиваем наш счетчик.
       m_nCounter++;
       m_nCounter++;


       // Смотрим если мы сравнялись или пересекли пороговое значение
       // Проверяем, не превысили ли мы пороговое значение.
       if ( m_nCounter >= m_nThreshold )
       if ( m_nCounter >= m_nThreshold )
       {
       {
               // Вызываем событие output
               // Если превысили - вызываем событие output.
               m_OnThreshold.FireOutput( inputData.pActivator, this );
               m_OnThreshold.FireOutput( inputData.pActivator, this );
              
              
               // Сбрасываем счетчик
               // Сбрасываем счетчик на ноль.
               m_nCounter = 0;
               m_nCounter = 0;
       }
       }
Line 99: Line 99:
=Создаем запись в FGD файле=
=Создаем запись в FGD файле=


Для использования энтити в Хаммере, мы должны создать запись в FGD файле. Хаммер будет использовать эти данные для того чтобы понять различные ключевые значения и функции которые предоставляет энтитя. Смотрите [[FGD |документ FGD формата]] для дополнительной информации о FGD файлах.
Для использования энтити в Хаммере, мы должны создать запись в FGD файле. Смотрите [[FGD |документ FGD формата]] для дополнительной информации о FGD файлах.


Если вы ещё не создали .FGD файл для вашего мода, вы наверное это сейчас захотите сделать. Чтобы сделать это создайте пустой файл с расширением .FGD гденибудь на вашем жестком диске (лучше положить его в папку с вашим модом). Встасьте код внизу в этот файл. Перейдите в Хаммер и выберите Tools->Options и добавьте .FGD файл в секцию <code>Game Data files</code>. Диалог Game Configurations описан [[Hammer Game Configurations |в этом]] документе.
Если вы ещё не создали .FGD файл для вашего мода, вы наверное это сейчас захотите сделать. Чтобы сделать это создайте пустой файл с расширением .FGD гденибудь на вашем жестком диске (лучше положить его в папку с вашим модом). Вставьте код внизу в этот файл. Перейдите в Хаммер и выберите Tools->Options и добавьте .FGD файл в секцию <code>Game Data files</code>. Диалог Game Configurations описан [[Hammer Game Configurations |в этом]] документе.


Затем мы объявляем знвчение <i>"threshold"</i> связанное с переменной <code>m_nThreshold</code>, функцией ввода <code>Tick</code> и функцией вывода <code>OnThreshold</code>.
Затем мы объявляем знвчение <i>"threshold"</i> связанное с переменной <code>m_nThreshold</code>, функцией ввода <code>Tick</code> и функцией вывода <code>OnThreshold</code>.

Revision as of 07:40, 25 April 2008

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

Создаем CPP файл для новой энтити

Добавляем исходный файл в проект server.dll по правому щелчку.

  • Создаем файл называемый sdk_logicalentity.cpp. Этот файл должен быть внутри пакпки dlls, которая, в свою очередь, находится в папке с вашим исходным кодом. Например, если вы установили код в C:\MyMod\src, то вы должны создать файл из C:\MyMod\src\dlls\sdk_logicalentity.cpp.
  • Далее копируем этот код и вставляем его в новый файл.
  • В последнею очередь добавляем этот файл в ваш проект server.dll. Если вы открыли game_sdk.sln solution, тогда вы можете щелкнуть правой кнопкой на проекте hl в окне Solution Explorer и выбрать Add, затем Add Existing Item.

Рассмотрение кода

Определение класса

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

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

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

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

LINK_ENTITY_TO_CLASS( my_logical_entity, CMyLogicalEntity );

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


Добавляем переменные в класс

int     m_nThreshold;  // Пороговое значение срабатывания output
int     m_nCounter;    // Внутренний счетчик

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

Используем описание данных энтити

 . . .

public:
       DECLARE_CLASS( CMyLogicalEntity, CLogicalEntity);
       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" (конечного значение) для связи этой переменной с значением ключа в энтите в Хаммере.

Смотрите документ о таблице описания данных для дополнительной информации.

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

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

Это событие будет включаться при встрече описанного конечного значения. Для доп-ой информации смотрите вводы и выводы энтитей.

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

void InputTick( inputdata_t &inputData );

void CMyLogicalEntity::InputTick( inputdata_t &inputData )
{
       // Увеличиваем наш счетчик.
       m_nCounter++;

       // Проверяем, не превысили ли мы пороговое значение.
       if ( m_nCounter >= m_nThreshold )
       {
              // Если превысили - вызываем событие output.
              m_OnThreshold.FireOutput( inputData.pActivator, this );
             
              // Сбрасываем счетчик на ноль.
              m_nCounter = 0;
       }
}

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

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

Для использования энтити в Хаммере, мы должны создать запись в FGD файле. Смотрите документ FGD формата для дополнительной информации о FGD файлах.

Если вы ещё не создали .FGD файл для вашего мода, вы наверное это сейчас захотите сделать. Чтобы сделать это создайте пустой файл с расширением .FGD гденибудь на вашем жестком диске (лучше положить его в папку с вашим модом). Вставьте код внизу в этот файл. Перейдите в Хаммер и выберите Tools->Options и добавьте .FGD файл в секцию Game Data files. Диалог Game Configurations описан в этом документе.

Затем мы объявляем знвчение "threshold" связанное с переменной m_nThreshold, функцией ввода Tick и функцией вывода OnThreshold.

@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 не пустой, убедитесь что добавили строку @include "base.fgd", которая даст вам некоторые нужные функции Хаммера.

Template:Otherlang:ru Template:Otherlang:ru:en