Документация/Уроки по программированию/Создание пользовательского гуи класса
From NeoAxis Engine Wiki
| Language: | Status: | Approved |
Contents |
Введение
Здесь будет рассмотрен пример создания нового гуи класса. Мы создадим новый класс, нарисуем в нем что-нибудь и далее разместим его в главном меню игры.
Создание класса
Для начала, нам нужно создать новый класс. Создадим новый класс на базе класса EControl из сборки UISystem.dll. EControl - это базовый класс для всех гуи классов движка.
Вы можете создать класс на базе любого другого гуи класса движка, например EButton. Здесь можно найти описание всех базовых гуи классов.
Для новых гуи классов рекомендуется использовать сборку GameCommon.dll. Данная сборка предназначена для различных низкоуровневых классов проекта. Если вы хотите использовать другую сборку, то нужно прописать её в \Data\Definitions\UISystem.config.
Итак, начнем.
Создадим новый файл EMyCustomControl.cs в сборке GameCommon.dll со следующим кодом и скомпилируем проект.
using System; using Engine.MathEx; using Engine.Renderer; using Engine.UISystem; public class EMyCustomControl : EControl { protected override void OnRenderUI( GuiRenderer renderer ) { base.OnRenderUI( renderer ); Rect screenRectangle = GetScreenRectangle(); //draw debug background renderer.AddQuad( screenRectangle, new ColorValue( 0, .5f, 0 ) ); } }
Размещение контрола в одном из окон игры
Теперь добавим наш новый контрол в главное меню игры.
Загрузим редактор ресурсов, найдем файл \Data\Gui\MainMenuWindow.gui и перейдем в режим редактирования.
Выделим окно, кликнув по рамке окна, или выберем его в окне Control Hierarchy.
Далее, с помощью правой кнопки мыши, откроем контекстное меню и выберем Create New Control.
В появившемся диалоге, выберем появившийся MyCustomControl и нажмем OK.
На экране появится зеленый прямоугольник. Это и есть наш контрол. Разместим контрол более красиво, передвинув и изменив его размер.
Рисование в классе
Нарисуем две линии и текст посередине контрола.
Рисование осуществляется с помощью класса GuiRenderer. Здесь вы можете найти его полное описание.
using System; using Engine.MathEx; using Engine.Renderer; using Engine.UISystem; public class EMyCustomControl : EControl { protected override void OnRenderUI( GuiRenderer renderer ) { base.OnRenderUI( renderer ); Rect screenRectangle = GetScreenRectangle(); //draw debug background renderer.AddQuad( screenRectangle, new ColorValue( 0, .5f, 0 ) ); //draw lines renderer.AddLine( screenRectangle.LeftTop, screenRectangle.RightBottom, new ColorValue( 1, 0, 0 ) ); renderer.AddLine( screenRectangle.RightTop, screenRectangle.LeftBottom, new ColorValue( 1, 0, 0 ) ); //draw text with default font Vec2 center = ( screenRectangle.Maximum + screenRectangle.Minimum ) / 2; renderer.AddText( "Galaxy is in danger", center, HorizontalAlign.Center, VerticalAlign.Center, new ColorValue( 1, 1, 0 ) ); } }
Добавление свойства в гуи редактор
Теперь добавим новое свойство в редактор ресурсов. Это свойство будет задавать цвет текста.
Благодаря, атрибуту [Serialize] свойство поддерживает сериализацию. Поддерживаются следующие типы:
- Simple types: bool, sbyte, byte, short, ushort, char, int, uint, long, ulong, float, double.
- Structures: Vec2, Vec3, Vec4, Bounds, Range, ColorValue, SphereDir, Rect, Vec2i, Vec3i, Recti, Degree, Radian.
- Strings.
- Enumerations.
- Texture type.
- Font type.
- EControl.ScaleValue.
using System; using Engine.MathEx; using Engine.Renderer; using Engine.UISystem; public class EMyCustomControl : EControl { ColorValue textColor = new ColorValue( 1, 1, 0 ); [Serialize] public ColorValue TextColor { get { return textColor; } set { textColor = value; } } protected override void OnRenderUI( GuiRenderer renderer ) { base.OnRenderUI( renderer ); Rect screenRectangle = GetScreenRectangle(); //draw debug background renderer.AddQuad( screenRectangle, new ColorValue( 0, .5f, 0 ) ); //draw lines renderer.AddLine( screenRectangle.LeftTop, screenRectangle.RightBottom, new ColorValue( 1, 0, 0 ) ); renderer.AddLine( screenRectangle.RightTop, screenRectangle.LeftBottom, new ColorValue( 1, 0, 0 ) ); //draw text with default font Vec2 center = ( screenRectangle.Maximum + screenRectangle.Minimum ) / 2; renderer.AddText( "Galaxy is in danger", center, HorizontalAlign.Center, VerticalAlign.Center, textColor ); } }
Поддержка свойства Control.ColorMultiplier
protected override void OnRenderUI( GuiRenderer renderer ) { base.OnRenderUI( renderer ); ColorValue color = textColor * GetTotalColorMultiplier(); ... }