Документация/Уроки по программированию/Добавление дополнительных гуи контролов для выделенных объектов в редакторе карт

From NeoAxis Engine Wiki

Jump to: navigation, search
Перейти на уровень выше
Свойства RTSGridPathFindSystem

Contents

Введение

При работе в редакторе карт, мы часто обращаемся к окну со свойствами объектов (окно Properties). Также, вы могли заметить, что для некоторых типов объектов под списком свойств могут находиться дополнительные кнопки, комбобоксы и другие контролы. Мы называем это дополнительной функциональностью к свойствам.

В этом уроке, мы расскажем вам о том, как создавать подобные расширения.

Описание

Здесь будет рассмотрен простой пример добавления одной кнопки. Смотрите свойства ландшафта как похожий пример.

Свойства ландшафта

Если вы обладатель Commercial License, то вы можете найти код террейна и код для добавления кнопки в исходных кодах сборок HeightmapTerrain.dll и HeightmapTerrain.Editor.dll.

Мы рассмотрим пример добавления кнопки к объекту водной поверхности (WaterPlane).

Добавление кода

Откроем в Visual Studio наш солюшен и перейдем к файлу WaterPlane.cs из сборки GameEntities.dll. Добавим следующий код.

Ссылки на пространста имен:

using System.Windows.Forms;
using Engine.MapSystem.Editor;

Основной код:

	public class WaterPlaneExtendedFunctionalityDescriptor : MapGeneralObjectExtendedFunctionalityDescriptor
	{
		public WaterPlaneExtendedFunctionalityDescriptor( Control parentControl, object owner )
			: base( parentControl, owner )
		{
			Button button;
 
			//Edit button
			button = new Button();
			parentControl.Controls.Add( button );
			button.Location = new System.Drawing.Point( 8, 8 );
			button.Size = new System.Drawing.Size( 75, 26 );
			button.Text = "My Button";
			button.UseVisualStyleBackColor = true;
			button.Click += buttonEditFind_Click;
		}
 
		void buttonEditFind_Click( object sender, EventArgs e )
		{
			MessageBox.Show( "Click!" );
		}
	}
Внимание! Если ваш класс сущности наследован от MapObject, то базовый класс для WaterPlaneExtendedFunctionalityDescriptor 
должен быть наследован от MapObjectExtendedFunctionalityDescriptor.

К классу WaterPlane добавим атрибут:

[ExtendedFunctionalityDescriptor( typeof( WaterPlaneExtendedFunctionalityDescriptor ) )]
public class WaterPlane : MapGeneralObject


Добавление ссылок на необходимые сборки

Для GameEntities.dll нужно добавить следующие ссылки на сборки:

  • System.Windows.Forms.dll. Системная сборка для создания WinForms приложений.
  • Ссылку на MapSystem.Editor.dll и Utils.Editor.dll.


Готово! Теперь скомпилируем проект и запустим редактор карт. Откроем какую-нибудь карту с водной поверхностью (например ConstructionsDemo). Выделив объект WaterPlane, мы увидим нашу кнопку:

ExtendedFunctionality03.jpg


Как убрать зависимость System.Windows.Forms.dll для GameEntities.dll

Вы могли заметить, что некоторые сборки в движке, имеют названия в виде {Name}.Editor.dll. Например к сборке MapSystem.dll прилагается также MapSystem.Editor.dll. Такие сборки нужны только для работы тулсета (редактор ресусов и редактор карт). В таких сборках хранится код необходимый только для работы редакторов. Вы можете спросить, зачем нужно выделять код в отдельную сборку? Это рекомендуется делать, чтобы избавиться от зависимости от System.Windows.Forms.dll в игровом коде. Это желательно сделать, если вы хотите минимизировать потребление ресурсов вашим приложением. Также Web Player не включает сборку System.Windows.Forms.dll и вы не сможете запустить приложение в браузере, если есть такая зависимость.


Ок! Теперь рассмотрим пример создания дополнительной сборки GameEntities.Editor.dll, в которой будет находиться код для добавления кнопки к свойствам рассмотренный ранее.

  • Создадим новый проект сборки GameEntities.Editor.dll. Настроим опции для компиляции.
  • Перенесем туда основной код:
namespace Engine.GameEntities.Editor
{
	public class WaterPlaneExtendedFunctionalityDescriptor : MapGeneralObjectExtendedFunctionalityDescriptor
	{
		public WaterPlaneExtendedFunctionalityDescriptor( Control parentControl, object owner )
			: base( parentControl, owner )
		{
			Button button;
 
			//Edit button
			button = new Button();
			parentControl.Controls.Add( button );
			button.Location = new System.Drawing.Point( 8, 8 );
			button.Size = new System.Drawing.Size( 75, 26 );
			button.Text = "My Button";
			button.UseVisualStyleBackColor = true;
			button.Click += buttonEditFind_Click;
		}
 
		void buttonEditFind_Click( object sender, EventArgs e )
		{
			MessageBox.Show( "Click!" );
		}
	}
}
  • Теперь поменяем параметры атрибута для класса WaterPlane:
[ExtendedFunctionalityDescriptor( "Engine.GameEntities.Editor.WaterPlaneExtendedFunctionalityDescriptor, GameEntities.Editor" )]
public class WaterPlane : MapGeneralObject

Первый параметр здесь - это полное имя класса. Второй - имя сборки без расширения.