Ru/Authoring a Brush Entity: Difference between revisions
m (otherlang2'd) |
(правка машинного перевода) |
||
Line 1: | Line 1: | ||
{{otherlang2 | {{otherlang2 | ||
|title=Ваша первая Entity | |||
|en=Authoring_a_Brush_Entity | |en=Authoring_a_Brush_Entity | ||
}} | }} | ||
Нашим последним примером было [[Authoring a Model Entity:ru|создание Entity-модели]]. В этой же статье мы будем использовать архитектуру мира (или <i>брашей</i>), для представления нашей entity, как она сталкивается и перемещается по миру. Также рассмотрим функцию "touch", доступную для всех entity. Это позволит нам создать объект, двигающийся при прикосновении игрока. | |||
=Создаем | =Создаем .cpp файл для новой entity= | ||
[[Image:Add existing item.gif|Добавляем исходный файл в проект server.dll по правому щелчку.]] | [[Image:Add existing item.gif|Добавляем исходный файл в проект server.dll по правому щелчку.]] | ||
* | * Создадим файл, называемый <code>sdk_brushentity.cpp</code>. | ||
* | * Скопируем [[Brush 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. | ||
=Рассмотрение кода= | =Рассмотрение кода= | ||
==Создание | ==Создание класса== | ||
<pre> | <pre> | ||
class CMyBrushEntity : public CBaseToggle | class CMyBrushEntity : public CBaseToggle | ||
Line 27: | Line 28: | ||
</pre> | </pre> | ||
Мы наследуем нашу | Мы наследуем нашу entity от класса CBaseToggle. Он предоставляет некоторые базовые функции для помощи в движении брашевой модели по миру. | ||
==Определяем описание данных== | ==Определяем описание данных== | ||
Line 42: | Line 43: | ||
</pre> | </pre> | ||
Мы объявляем touch-функию которую потом будем использовать. Смотрите документ о | Мы объявляем touch-функию которую потом будем использовать. Смотрите документ о [[Data Descriptions:ru|таблице описания данных]] для дополнительной информации. | ||
==Создаем Spawn | ==Создаем Spawn функцию== | ||
<pre> | <pre> | ||
void CMyBrushEntity::Spawn( void ) | void CMyBrushEntity::Spawn( void ) | ||
Line 54: | Line 55: | ||
SetSolid( SOLID_VPHYSICS ); | SetSolid( SOLID_VPHYSICS ); | ||
// Мы должны | // Мы должны отталкивать вещи с нашего пути | ||
SetMoveType( MOVETYPE_PUSH ); | SetMoveType( MOVETYPE_PUSH ); | ||
// Используем нашу модель brush | // Используем нашу модель brush | ||
SetModel( STRING( GetModelName() ) ); | SetModel( STRING( GetModelName() ) ); | ||
// Создаем | // Создаем физический корпус объекта | ||
CreateVPhysics(); | CreateVPhysics(); | ||
} | } | ||
</pre> | </pre> | ||
Первым делом в этом блоке мы установим touch-функцию | Первым делом в этом блоке мы установим touch-функцию, указывающую на <i>BrushTouch()</i> в которой разместим наш код движения. Затем мы должны сообщить entity использовать <code>SOLID_VPHYSICS</code>, создающую коллизию для объекта. Установим использование <code>MOVETYPE_PUSH</code> что означает позволить двигать энтити втречающиеся на нашем пути, вместо обычной блокировки. | ||
В этом примере мы используем <code>SetModel()</code> с именем модели из редактора. В связи с этим | В этом примере мы используем <code>SetModel()</code> с именем модели из редактора. В связи с этим entity использует ту брашевую модель, которая определена на карте. | ||
<pre> | <pre> | ||
Line 78: | Line 79: | ||
</pre> | </pre> | ||
Напоследок, вызываем <code>CreateVPhysics()</code> для установки отражения | Напоследок, вызываем <code>CreateVPhysics()</code> для установки отражения коллизии. Это то, что создает отталкивание с физическими объектами мира. Без этого браш бужет пролетать сквозь эти объекты. | ||
==Создаем BrushTouch() функцию== | ==Создаем BrushTouch() функцию== | ||
Entity должна оповестить нас когда она была дотронута через функцию <code>BrushTouch()</code>. Затем мы принимаем это уведомление, мы должны сообщить энтити двигаться в сторону от энтити которая дотронулась до нее. Для этого, мы нуждаемся в информации о событиях связанных с дотрагиванием. Эта информация предоставляется структурой trace_t</code>, возвращаемая функцией <code>GetTouchTrace()</code>. Она возвращает текущее трассирование коллизии вызвавшее сообщение. | |||
<pre> | <pre> |
Revision as of 05:15, 5 April 2012
Template:Otherlang2 Нашим последним примером было создание Entity-модели. В этой же статье мы будем использовать архитектуру мира (или брашей), для представления нашей entity, как она сталкивается и перемещается по миру. Также рассмотрим функцию "touch", доступную для всех entity. Это позволит нам создать объект, двигающийся при прикосновении игрока.
Создаем .cpp файл для новой entity
- Создадим файл, называемый
sdk_brushentity.cpp
. - Скопируем этот код и вставим его в наш новый файл.
- В последнею очередь добавляем этот файл в ваш проект server.dll. Если вы открыли
game_sdk.sln
solution, тогда вы можете щелкнуть правой кнопкой на проекте hl в окне Solution Explorer и выбрать Add, затем Add Existing Item.
Рассмотрение кода
Создание класса
class CMyBrushEntity : public CBaseToggle { public: DECLARE_CLASS( CMyBrushEntity, CBaseToggle ); DECLARE_DATADESC(); void Spawn( void ); bool CreateVPhysics( void ); void BrushTouch( CBaseEntity *pOther ); };
Мы наследуем нашу entity от класса CBaseToggle. Он предоставляет некоторые базовые функции для помощи в движении брашевой модели по миру.
Определяем описание данных
LINK_ENTITY_TO_CLASS( my_brush_entity, CMyBrushEntity ); // Начинаем описание наших данных для класса BEGIN_DATADESC( CMyBrushEntity ) // Описываем функцию которая будет touch функцией DEFINE_ENTITYFUNC( BrushTouch ), END_DATADESC()
Мы объявляем touch-функию которую потом будем использовать. Смотрите документ о таблице описания данных для дополнительной информации.
Создаем Spawn функцию
void CMyBrushEntity::Spawn( void ) { // Мы не можем перехватывать соприкасания из других энтитей SetTouch( &CMyBrushEntity::BrushTouch ); // Мы должны сталкиваться с физикой SetSolid( SOLID_VPHYSICS ); // Мы должны отталкивать вещи с нашего пути SetMoveType( MOVETYPE_PUSH ); // Используем нашу модель brush SetModel( STRING( GetModelName() ) ); // Создаем физический корпус объекта CreateVPhysics(); }
Первым делом в этом блоке мы установим touch-функцию, указывающую на BrushTouch() в которой разместим наш код движения. Затем мы должны сообщить entity использовать SOLID_VPHYSICS
, создающую коллизию для объекта. Установим использование MOVETYPE_PUSH
что означает позволить двигать энтити втречающиеся на нашем пути, вместо обычной блокировки.
В этом примере мы используем SetModel()
с именем модели из редактора. В связи с этим entity использует ту брашевую модель, которая определена на карте.
bool CMyBrushEntity::CreateVPhysics( void ) { // Для столкновения с объектами физики VPhysicsInitShadow( false, false ); return true; }
Напоследок, вызываем CreateVPhysics()
для установки отражения коллизии. Это то, что создает отталкивание с физическими объектами мира. Без этого браш бужет пролетать сквозь эти объекты.
Создаем BrushTouch() функцию
Entity должна оповестить нас когда она была дотронута через функцию BrushTouch()
. Затем мы принимаем это уведомление, мы должны сообщить энтити двигаться в сторону от энтити которая дотронулась до нее. Для этого, мы нуждаемся в информации о событиях связанных с дотрагиванием. Эта информация предоставляется структурой trace_t, возвращаемая функцией GetTouchTrace()
. Она возвращает текущее трассирование коллизии вызвавшее сообщение.
void CMyBrushEntity::BrushTouch( CBaseEntity *pOther ) { // Получаем информацию о коллизии const trace_t &tr = GetTouchTrace(); // Мы должны переместить прочь от удара вдоль нашей поверхности Vector vecPushDir = tr.plane.normal; vecPushDir.Negate(); vecPushDir.z = 0.0f; // Перемещаем медленно в этом направление LinearMove( GetAbsOrigin() + ( vecPushDir * 64.0f ), 32.0f ); }
Первым делом мы извлекаем нормаль поверхности которая была дотронута. Для этого, нужна одна из плоскостей браш-энтити. Мы вычитаем это значение для указания относительного направления столкновения, затем убираем Z компоненту направления для сохранения паралельности к полу.
Напоследок, используем функцию LinearMove()
заставляющая двигаться браш в направлении с заданной скоростью. Функция LinearMove()
имплементируется классом CBaseToggle
и заботится о рутинной работе связанной с тем как обеспечивается движение брашевой модели.
Создаем запись в FGD файле
Для использования энтити в Хаммере, мы должны создать запись в FGD файле. Хаммер будет использовать эти данные для того чтобы понять различные ключевые значения и функции которые предоставляет энтитя. Смотрите документ FGD формата для дополнительной информации о FGD файлах.
Запись FGD позволяет вам привезать энтити к браше.
@SolidClass base(Targetname) = my_brush_entity : "Tutorial brush entity." [ ]
Если ваш .FGD не пустой, убедитесь что добавили строку @include "base.fgd", которая даст вам некоторые нужные функции Хаммера. (При полном преобразование. Мод основанный на существующем содержимом, включайте соответствующие FGD файлы; на пример для HL2 мода, включите halflife2.fgd
вместо base.fgd
.)