Документация/Уроки по программированию/Добавление дополнительных гуи контролов для выделенных объектов в редакторе карт
From NeoAxis Engine Wiki
| Language: | Status: | Approved |
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, мы увидим нашу кнопку:
Как убрать зависимость 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
Первый параметр здесь - это полное имя класса. Второй - имя сборки без расширения.