Создание нового нода

Материал из CryWiki Russia

Версия от 12:36, 7 февраля 2013; AndreyFilantrop (Обсуждение | вклад)
(разн.) ← Предыдущая | Текущая версия (разн.) | Следующая → (разн.)
Перейти к: навигация, поиск
О статье
ПереводчикAndreyFilantrop
СложностьСредняя
ТребованияMicrosoft Visual Studio 2010
Дата добавления13/01/13



Содержание

Создание нового нода

Статья описывает шаги по внедрению нового нода Flowgraph.

Базовый код

Рекомендуется реализовывать ноды, принадлежащие одинаковой группе в едином cpp файле. Обычно нет необходимости в заголовке, за исключением некоторых специальных нодов. Поместите cpp файл в файл проекта CryAction/Flow System Files/Nodes и в рамках структуры директории файловой системы в Code/CryEngine/CryAction/FlowSystem/Nodes.

В cpp файле добавьте класс используя следующий шаблон кода и замените «MyName» желаемым именем вашего ФГ [сокр. Флоуграф] нода. Замените «FlowNodeGroup» желаемым именем группы и создайте соответствующую подпапку в селекторе редактора нода, где этот тип нода будет располагаться:

#include "stdafx.h"
#include "FlowBaseNode.h"
 
class CFlowNode_MyName : public CFlowBaseNode
{
public:
  CFlowNode_MyName( SActivationInfo * pActInfo )
  {
  };
 
  virtual void GetConfiguration( SFlowNodeConfig& config )
  {
    static const SInputPortConfig in_config[] = {
      {0}
    };
    static const SOutputPortConfig out_config[] = {
      {0}
    };
    config.sDescription = _HELP( "A description of this flow node" );
    config.pInputPorts = in_config;
    config.pOutputPorts = out_config;
    config.nFlags = 0;
  }
 
  virtual void ProcessEvent( EFlowEvent event, SActivationInfo * pActInfo )
  {
     switch (event)
     {
     };
  }
};
 
REGISTER_FLOW_NODE("FlowNodeGroup:MyName", CFlowNode_MyName);


Добавление портов Output

ФГ ноды имеют как input (т.е. входящие ) так и output (исходящие) порты. Output порт может быть добавлен за счет изменения GetConfiguration функции, как видно на следующем примере:

class CFlowNode_MyName : public CFlowBaseNode
{
public:
  // ...
 
  virtual void GetConfiguration( SFlowNodeConfig& config )
  {
    static const SInputPortConfig in_config[] = {
      {0}
    };
    static const SOutputPortConfig out_config[] = {
      OutputPortConfig<int>("alertness", _HELP("useful help text")),
      {0}
    };
    config.sDescription = _HELP( "A description of this flow node" );
    config.pInputPorts = in_config;
    config.pOutputPorts = out_config;
    config.nFlags = 0;
  }
 
  // ...
};

OutputPortConfig является шаблонной вспомогательной функцией, которая полезна для заполнения маленькой структуры соответствующими данными. Могут быть определены разные типы, но в примере тип порта «int». Доступны следующие типы: SFlowSystemVoid, int, float, EntityId, Vec3, string, и bool. SFlowSystemVoid - это специальный тип, который представляет собой «no value» (нет значения). OutputPortConfig принимает три параметра: имя порта output, некоторый описательный вспомогательный текст показываемый в редакторе GUI и по желанию читаемый текст имени порта, который виден и читаем для человека. Убедитесь, что вы выбрали нормальное имя для порта, т.к. смена его в дальнейшем разрушит вам все ФГ, которые используют этот нод. Если вам нужно сменить отображаемое имя, используйте третий параметр.

Чтобы передать значение из порта, вы можете использовать функцию CFlowBaseNode::ActivateOutput( pActInfo, nPort, value ). Эта функция принимает pActInfo (обычно передается в ProcessEvent()) идентификатор порта (отсчет начинается нулевым значением с верху out_config), и значение того же типа, что и порт. Поэтому чтобы активировать нашу «alertness» значением 3 мы можем написать:

ActivateOutput( pActInfo, 0, 3 );


Добавление портов Input

Порт Input может быть добавлен таким же путем, как и «Output» порт за счет изменения GetConfiguration функции:

class CFlowNode_MyName : public CFlowBaseNode
{
public:
  // ...
 
  virtual void GetConfiguration( SFlowNodeConfig& config )
  {
    static const SInputPortConfig in_config[] = {
      InputPortConfig<int>("someInput", _HELP("useful help text")),
      {0}
    };
    static const SOutputPortConfig out_config[] = {
      {0}
    };
    config.sDescription = _HELP( "A description of this flow node" );
    config.pInputPorts = in_config;
    config.pOutputPorts = out_config;
    config.nFlags = 0;
  }
 
  // ...
};


InputPortConfig такая же шаблонная вспомогательная функция как и OutputPortConfig.

Такие же типы как и для output портов могут быть определены и для input портов. InputPortConfig принимает три или четыре параметра:

  • имя input порта, описание порта и читаемое человеком имя порта.
  • имя input порта, дефолтное значение порта во время создания нового нода, описание порта и читаемое человеком имя порта.

Снова рекомендуется выбирать имя порта правильно, т.к. смена его позднее сломает ФГ, использующие этот нод. Важно: не используйте символ нижнего подчеркивания «_» в именах портов за исключением случая, когда вы хотите указать, что некоторый определенный редактор свойств должен быть использован. Следующие префиксы в именах входных портов признаются и могут быть использованы:

Префикс

Тип редактора свойств

snd_

IVariable::DT_SOUND

sound_

IVariable::DT_SOUND

dialogline_

IVariable::DT_DIALOG

clr_

IVariable::DT_COLOR

color_

IVariable::DT_COLOR

tex_

IVariable::DT_TEXTURE

texture_

IVariable::DT_TEXTURE

obj_

IVariable::DT_OBJECT

object_

IVariable::DT_OBJECT

file_

IVariable::DT_FILE

text_

IVariable::DT_LOCAL_STRING

equip_

IVariable::DT_EQUIP

reverbpreset_

IVariable::DT_REVERBPRESET

aianchor_

IVariable::DT_AI_ANCHOR

aibehavior_

IVariable::DT_AI_BEHAVIOR

aicharacter_

IVariable::DT_AI_CHARACTER

aipfpropertieslist_

IVariable::DT_AI_PFPROPERTIESLIST

aiterritory_

IVariable::DT_AITERRITORY

aiwave_

IVariable::DT_AIWAVE

soclass_

IVariable::DT_SOCLASS

soclasses_

IVariable::DT_SOCLASSES

sostate_

IVariable::DT_SOSTATE

sostates_

IVariable::DT_SOSTATES

sopattern_

IVariable::DT_SOSTATEPATTERN

soaction_

IVariable::DT_SOACTION

sohelper_

IVariable::DT_SOHELPER

sonavhelper_

IVariable::DT_SONAVHELPER

soanimhelper_

IVariable::DT_SOANIMHELPER

soevent_

IVariable::DT_SOEVENT

gametoken_

IVariable::DT_GAMETOKEN

mat_

IVariable::DT_MATERIAL

seq_

IVariable::DT_SEQUENCE

mission_

IVariable::DT_MISSIONOBJ

anim_

IVariable::DT_USERITEMCB

animstate_

IVariable::DT_USERITEMCB

animstateEx_

IVariable::DT_USERITEMCB

bone_

IVariable::DT_USERITEMCB

attachment_

IVariable::DT_USERITEMCB

dialog_

IVariable::DT_USERITEMCB

matparamslot_

IVariable::DT_USERITEMCB

matparamname_

IVariable::DT_USERITEMCB

matparamcharatt_

IVariable::DT_USERITEMCB

В полной лицензионной версии редактора можно добавлять новые префиксы для дополнительных типов редактора свойств, модифицировать файл Sandbox/Editor/HyperGraph/FlowGraphVariables.cpp

Триггерные порты

Иногда полезно использовать триггерный сигнал как входящий или исходящий порт. Такие порты могут быть реализованы используя тип In/OutputPortConfig_Void или In/OutputPortConfig_AnyType и не bool.