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

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

Перейти к: навигация, поиск
Эта страница страница помечена как находящиеся в процессе перевода с: 13 января 2013.


О статье
Переводчик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 порта, дефолтное значение порта во время создания нового нода, описание порта и читаемое человеком имя порта. Снова рекомендуется выбирать имя порта правильно, т.к. смена его позднее сломает ФГ, использующие этот нод.