28 авг. 2007 г.

Реализация языков описания данных на основе языка Lua. Часть 2

Предыдущая часть

Содержание

Начнем с примера

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



Рис. 1. Структура элементов пользовательского интерфейса


Структура элементов интерфейса и их свойства представлены на рис. 1. Нужно отметить, что, хотя пример основан на реальных данных, при его реализации не ставилась цель продемонстрировать создание полнофункциональной системы описания пользовательского интерфейса. Основная цель примера – иллюстрация описываемого подхода к разработке форматов хранения данных. Полный код примера вместе со всеми необходимыми для сборки материалами можно найти на диске к журналу.


Рис. 2. Примерный вид главного меню


Прототип пользовательского интерфейса, который мы хотим описать, схематически представлен на рис. 2. Для каждого состояния всех элементов интерфейса (включая «задники» панелей) художник создает уникальное изображение.


Схему на рис. 2 можно описать при помощи XML примерно таким образом:

<gui_layout name="gamegui">
<panel name="mainmenu" modal="true" hidden="false">
<button name="newgame"/>
</panel>
<panel name="settings" modal="true" hidden="true">
<checkbox name="mute_all"/>
<checkbox name="mute_sfx"/>
<checkbox name="mute_speech"/>
<checkbox name="mute_music"/>
<button name="ok"/>
</panel>
</gui_layout>

Нужно обратить внимание на то, что в здесь отсутствует описание логики работы интерфейса – дана только его структура. В зависимости от реализации можно выбрать разные средства задания логики – вплоть до встраивания кода обработчиков событий на Lua непосредственно в данные на XML.

Схема на рис. 2 может быть представлена следующим образом:

Листинг 1
gui_layout “gamegui”
{
panel “mainmenu”
{
modal;
button ”newgame”;
button ”settings”;
button “exit”;
};
panel “settings”
{
modal;
hidden;
checkbox ”mute_all”;
checkbox ”mute_sfx”;
checkbox ”mute_speech”;
checkbox ”mute_music”;
button ”ok”;
button ”cancel”;
};
};

Преимущества в читаемости налицо – объем текста меньше примерно в два раза при том же объеме полезной информации. К тому же, приведенный выше текст – валидный код на Lua. Не просто описание данных – а именно код, набор вызовов функций. Остановимся на этом чуть подробнее.

Следующая часть

Комментариев нет: