Форум программистов
 
Контакты: о проблемах с регистрацией, почтой и по другим вопросам пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail.

Вернуться   Форум программистов > разработка игр, графический дизайн и моделирование > Gamedev - cоздание игр: Unity, OpenGL, DirectX
Регистрация

Восстановить пароль
Повторная активизация e-mail


Донат для форума - использовать для поднятия настроения себе и модераторам

А ещё здесь можно купить рекламу за 25 тыс руб в месяц! ) пишите сюда - alarforum@yandex.ru

Ответ
 
Опции темы
Старый 14.07.2019, 18:18   #11
SaiLight
Форумчанин
 
Аватар для SaiLight
 
Регистрация: 10.01.2009
Сообщений: 128
Репутация: 165
По умолчанию

Всем снова привет. Долго я отсутствовал в этой теме, но разработка игры не прекратилась. Со времени последнего сообщения было внесено много изменений, а некоторые основополагающие моменты и вовсе были полностью переосмыслены. В основном, все изменения коснулись библиотеки графического интерфейса, именно над ней и велась работка в последние месяцы.

Серьезному структурному изменению подвергся механизм работы со сценами. Если раньше существовали такие понятия как 'Текущая сцена' и 'Главная сцена', то теперь они упразднены, и на смену им пришел механизм состояний. Состояние - это набор сцен, которые включаются при его активации. Необходимость реализации такого подхода обусловлена недостаточностью вывода единовременно только одной сцены для реализации всех игровых ситуаций. Например, когда надо одновременно вывести на экран игровой интерфейс и интерфейс меню паузы - при старом подходе с одной активной сценой при активации меню паузы пропадут все элементы интерфейса с игровой сцены.

Для сцен, которые необходимо отображать постоянно (ранее - 'Главная сцена', с отладочной информацией, консолью и т.д.), используется специальное свойство 'Всегда активна' - такие сцены не затрагиваются при смене состояний. Вот пример работы с состояниями:

Код:
manager.addState('first', ['scene1']);
manager.addState('second', ['scene2']);
manager.setState('first');
Ранее все сообщения между элементами интерфейса рассылались от родителя ко вложенным (в прямом порядке), что привело к проблемам с передачей сообщений ввода. Представим, что есть два перекрывающих друг друга элемента - obj1 и obj2. Второй элемент должен выводиться на экран после первого (перекрывать его). Однако, в случае с сообщением mouseDown такая последовательность обработки приведет к тому, что obj1 (который рисуется снизу) перехватит это сообщение, и оно не дойдет до верхнего obj2. Для избежания этой проблемы мы разделили все сообщения по методу рассылки на 'прямые' и 'обратные'. В примере выше, сообщение mouseDown должно обработаться в обратном порядке, а draw - в прямом.

uiManager

Раньше глобальное клавиатурное событие onKeyPress обрабатывалось при помощи главной (всегда активной) сцены; теперь, сообразуясь в вышеописанными изменениями в сценах, было принято решение вынести его обработку в Менеджер. В реакции на это событие можно, например, вызывать игровую консоль, которая может быть вызвана отовсюду (независимо от активной в данный момент сцены).

Добавлено событие onError для описания действий, которые необходимо выполнить при возникновении ошибки. В событии имеется дополнительный параметр, позволяющий пометить сообщение как критическое.

Убраны некоторые неиспользуемые функции.

uiElement

Значительные изменения коснулись модуля uiElement. Доработан механизм обработки элементов под фокусом и наведенных (hovered) элементов. Элемент, помеченный как focused, может быть только один - теперь это же условие относится и к hovered-элементу. При установке этих флагов элемент обращается к самому верхнему родителю с просьбой снять флаг focused/hovered с текущего отмеченного им элемента и затем устанавливает его себе. Если с фокусом такая ситуация видится полностью логичной, то в случае с наведением вносит некоторые ограничения, которые, однако, пока не мешают работе системы.

Некоторые классы запрещают элементам, основанным на них, принимать фокус - это реализовано при помощи скрытого поля FCanFocused и может быть полезно для реализации элементов, предназначенных непосредственно для визуального оформления и для группировки других элементов (панель).

Добавлены свойства offsetWidth и offsetHeight для реализации пиксельного отклонения от ширины и высоты (если эти значения заданы в процентах). Свойство offsetWidth, например, бывает полезно, когда надо растянуть элемент на всю ширину родителя с заданием отступов справа и слева.

Напомню, что ранее был реализован метод animate() для плавного изменения значений свойств типа Integer и Single. Теперь есть возможность анимировать текстовые свойства (если они содержат числовые значения). Это может быть полезно для анимации количества здоровья персонажа при нанесении ему урона. Также, метод animate() теперь принимает callBack-функцию в качестве последнего параметра - эта функция будет вызвана после окончания анимации. Помимо прочего, это можно использовать для реализации нескольких анимаций подряд, воспроизводящихся одна за другой.

Добавлен еще один метод для работы с анимацией - animateBack(), который принимает в качестве параметра отклонение от текущего значения свойства и затем анимирует свойство от нового значения к текущему. Вот пример кода, реализующего тряску панели при помощи метода animateBack() и callBack-функции для воспроизведения нескольких анимаций:

Код:
nowPanel.animateBack('y', 5, 100,
  procedure(element: TUiVisualElement)
  begin
    element.animateBack('y', -5, 100);
  end
);
Также, добавлен метод animateStop(), останавливающий все воспроизводящиеся в данный момент анимации.

В класс TUiVisualElement добавлено свойство opacity, для обработки которого введено новое сообщение msgParentChangeOpacity, инициирующее смену непрозрачности у всех вложенных элементов.

В класс TUiTextElement добавлена возможность указать цвета текста для определенных состояний элемента: normal, hovered, pressed, focused, disabled - все эти цвета можно задать в файле стилей при помощи специальных свойств. Также, в этот класс добавлено свойство autoWidth, которое позволяет автоматически определять его ширину при задании однострочного текста.

В класс TUiEdit добавлено свойство markerColor, определяющее цвет маркера.

Для вывода графических элементов, основанных на спрайтах, добавлен класс TUiBorderedElement, который задает и обрабатывает набор спрайтов для каждого состояния элемента, причем, механизм состояний реализован с учетом расширяемости - новые состояния и спрайты для них можно добавлять в унаследованных классах. Сам TUiBorderedElement заполняет область элемента, составляя его общее изображение из нескольких частей. Доступны следующие варианты построения элемента:
  • 9 частей - по краям область элемента заполняется рамкой, а внутри - центральным изображением
  • 3 части - левая, средняя и правая картинки при горизонтальном расположении; также, доступно вертикальное расположение
  • 1 часть - элемент полностью заполняется одним изображением

Для реализации автоматического заполнения области текстурой (с повторениями), в движок Perfect Engine добавлен специальный параметр, задающийся при загрузке текстуры. Таким образом, для вывода рамки в TUiBorderedElement, рисуется только один прямоугольник, заполненный повторяющейся (или растягивающейся) текстурой. Будет текстура повторяться или растягиваться - полностью зависит от параметра, переданного в движок при ее загрузке.

Изображение, выводимое в TUiBorderedElement, может быть тонировано при помощи параметра tone - технически, для этого используется специальный шейдерный фильтр движка:

Код:
if (FTone.a <> 0) then
  pe.addFilter('tone', FTone.r, FTone.g, FTone.b, FTone.a);
Добавлен модуль uiComposite для описания стандартных составных элементов. В данный момент этот модуль содержит класс TUiCheckBox, состоящий из кнопки и текста, при нажатии на который, также, переключается состояние компонента.

Последний раз редактировалось SaiLight; 14.07.2019 в 18:29.
SaiLight вне форума   Ответить с цитированием
Старый 14.07.2019, 18:19   #12
SaiLight
Форумчанин
 
Аватар для SaiLight
 
Регистрация: 10.01.2009
Сообщений: 128
Репутация: 165
По умолчанию

Структура файлов

Изменена структура файла разметки. Если раньше сцены создавались автоматически (при парсинге файла, если встречался элемент, привязанный к еще не существующей сцене), то теперь сцена участвует в разметке в качестве родителя для всех вложенных в нее элементов. Это позволяет создавать пустые сцены и, в общем, делает разметку более наглядной.

В дополнение к функции rgba() в стили добавлена новая функция hex(), которая переводит цвет из 16-ричного формата (используемого в Photoshop) в TRGBA.

Также, в процессе работы над этой библиотекой, было внесено много исправлений и изменений в сам графический движок. Некоторые из них описаны выше, а остальные изменения, думаю, удостоятся отдельного сообщения, когда движок будет доработан. Во вложении к этому сообщению я прикреплю тестовую программу, отображающую основные возможности библиотеки UI, а также, изменения, описанные выше. Тестовая программа представлена в двух разрешениях для наглядного отображения 'резиновости' библиотеки графического интерфейса.


Последний раз редактировалось SaiLight; 14.07.2019 в 18:30.
SaiLight вне форума   Ответить с цитированием
Ответ

Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Не разрешается отладка USB (Samsung Galaxy S4) Danila7 Java Мобильная разработка (Android) 1 18.09.2016 18:05
[Аркада] Galaxy Boom mini, Perfect Light SaiLight Gamedev - cоздание игр: Unity, OpenGL, DirectX 5 14.03.2016 21:19
проблемы с samsung galaxy ace II GT-I8160 (Android 4.1.2) Андрей201421 Мобильные ОС (Android, iOS, Windows Phone) 1 15.08.2014 20:06
Региональная блокировка Samsung galaxy SIII starsv Мобильные ОС (Android, iOS, Windows Phone) 4 24.02.2014 17:21
Galaxy Boom SaiLight Gamedev - cоздание игр: Unity, OpenGL, DirectX 17 24.12.2012 14:56


22:36.


Powered by vBulletin® Version 3.8.11
Copyright ©2000 - 2019, Jelsoft Enterprises Ltd.