Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

4 курс (заочка) / Лекции / 1, 2 лекции МИС

.pdf
Скачиваний:
11
Добавлен:
30.10.2024
Размер:
4.69 Mб
Скачать

Например, для того чтобы записать в качестве значения строкового элемента строку со словом, заключенным в кавычки, необходимо просто заменить его соответствующей ссылкой на сущность:

<text name="txt1" value="Понятие "высота" …"/>

Заменять все зарезервированные символы ссылками на сущности неудобно, особенно если это большой текст или скрипт на JavaScript. Поэтому в XML введен специальный раздел CDATA, позволяющий использовать зарезервированные символы в содержимом элементов:

Пример

<script><![CDATA[

for(var j=0; j<20; j++) s+=' ';

]]></script>

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

Пример

<?xml version="1.0" encoding="UTF-8"?>

<RMT>

<include src="classes.xml"/>

<scene>

<include src="commonpart.xml"/>

</scene>

</RMT>

Включаемые XML-файлы должны иметь следующий формат:

Пример

<?xml version="1.0" encoding="UTF-8"?>

<!-- файл commonpart.xml -->

<RMT>

181

<image src="back.png"/>

</RMT>

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

Событийная модель

Объекты сцены и некоторые глобальные объекты могут порождать различные события. Эти события могут порождаться:

1.системными событиями мыши;

2.системными событиями клавиатуры;

3.уведомлениями об изменении состояния динамических объектов;

4.уведомлениями об истечении некоторого промежутка времени;

5.уведомлениями об изменении свойств;

6.скриптами на JavaScript;

7.другими системными событиями.

Системные события

Системные сообщения от мыши порождают события видимых двухмерных объектов (базовый тип Visible), «кнопок» (базовый тип Button) и трехмерных объектов (базовый тип 3DObject). Системные сообщения от клавиатуры порождают события «кнопок» (базовый тип Button). Уведомления об изменении состояния динамических объектов порождают, соответственно, события динамических объектов (базовый тип Continuous). Уведомления об истечении некоторого промежутка времени могут порождать события объекта Sequencer. Уведомления об изменении свойств порождают события изменения свойств. Скрипты могут порождать как предопределенные события объектов любого типа, так и события, определенные разработчиком сценария. Некоторые системные события после обработки программой-реализатором могут порождать события подобъектов глобального объекта Player.

Чтобы включить в сцену обработчик какого-либо события, необходимо вставить в нужное место элемент script и указать это событие в параметре event. Например, чтобы скрыть изображение, когда в его зоне будет нажата левая кнопка мыши, необходимо вставить следующий элемент script:

182

Пример

<image name="img1" src="img1.png">

<script event="onPress">

hide();

</script>

</image>

При включении элемента script в описание другого элемента JavaScript выполняется в контексте этого элемента. Элемент script можно не включать в описание элемента, порождающего событие:

Пример

<image name="img1" src="img1.png"/>

<script event="img1.onPress">

img1.hide();

</script>

При обработке событий мыши можно использовать свойства xMouse и yMouse, которые доступны только для чтения и имеют значения координат мыши относительно координат самого объекта.

Большинство видимых двухмерных объектов могут быть «кнопками» (унаследованы от супертипа Button). По умолчанию активной зоной объекта является прямоугольник, в который вписывается объект (x, y, width, height). Для изображений с прозрачностью активной зоной является вся видимая часть изображения. Для композиций

– все активные зоны входящих в нее видимых элементов. Активную зону объекта можно переопределить с помощью свойства hitArea. Активная зона может быть задана либо прямоугольной, либо в форме многоугольника. Активная зона прямоугольной формы задается путем присвоения свойству hitArea строкового значения в формате "[x, y, ширина, высота]", где x и y – координаты верхнего левого угла зоны относительно координат объекта. Активная зона в форме многоугольника задается в формате "{(x1, y1), (x2, y2), … (xn, yn)}", где xm и ym – координаты вершин многоугольника относительно координат объекта.

183

Пример

<image name="img1" src="img1.png"

hitArea="{(0,0), (30,0), (0,30)}"/>

Чтобы объект стал «кнопкой», необходимо задать хотя бы один обработчик «кнопочных» событий:

onPress

нажата кнопка мыши на активной зоне объекта;

onRelease

кнопка мыши отпущена на активной зоне объекта;

onReleaseOutside

кнопка мыши отпущена вне активной зоны объекта;

onRollOver

указатель мыши «наехал» на активную зону;

onRollOut

указатель мыши «съехал» с активной зоны.

При наведении указателя мыши на активную зону курсор будет меняться соответствующим образом. Отменить изменение вида курсора можно при помощи установки свойству useHandCursor значения false.

Существует специальный объект Button, который не имеет видимого представления, но является «кнопкой». Активная зона этого объекта должна быть определена через свойство hitArea.

Пример

<button name="btn1" hitArea="[20,20,300,200]"/>

<script event="btn1.onPress">

img1.hide();

</script>

События изменения свойств объектов

Обработчики, которые вызываются при изменении свойств объектов, задаются так же, как и обработчики событий, но вместо атрибута event указывается атрибут watch:

Пример

<image name="img1" src="img1.png"/>

<image name="img2" src="img2.png" visible="false"/>

<script watch="img1.visible">

184

if(img1.visible)

img2.hide();

else

img2.show();

</script>

В данном примере изображение img2 показывается, когда скрывается изображение img1 и наоборот.

События, создаваемые пользователем

При создании сценариев иногда возникает необходимость завести событие, которое не определено, например, когда композиция используется в качестве вспомогательного объекта. Такие пользовательские события определяются атрибутом userEvent, значение которого задается в открывающем тэге XML-описания объекта, порождающего данные события.

Пример

<composition name="controller" userEvents="evStepChanged evFinish"> <script>

this.step = 0;

function gotoNextStep(){ step++;

if(step == 5) fireEvent("evFinish");

else

fireEvent("evStepChanged");

}

</script>

</composition>

185

Здесь у композиции controller задается два пользовательских события evStepChanged и evFinish. Они порождаются в методе gotoNextStep, и для них может быть задано любое количество обработчиков в любом элементе сцены, в котором можно задавать обработку событий и из которого можно задать «абсолютный» или относительный путь к композиции controller:

Пример

<script event="scene.controller.evStepChanged">

</script>

Примеры использования

Особенности кроссплатформенной разработки

Кроссплатформенным называется программное обеспечение, полноценно функционирующее в среде двух и более операционных систем. Программное обеспечение, разрабатываемое на базе OST, предназначается для использования в операционных системах Windows и Linux. Требования кроссплатформенной преемственности привносят формальные ограничения в технологию процесса разработки ресурсов. Так, например, одно из различий состоит в том, что в операционной системе Linux при задании имени файла или директории имеет значение регистр, в котором набраны символы. Это означает, что DATA, Data и data – три разных объекта файловой системы. Есть различие и в использовании символа − разделителя адресной строки файла: в Windows используется обратный слэш «\», в Linux – прямой «/». Особое внимание следует обратить на подбор шрифтов: одноименные шрифты, используемые на разных платформах, как правило, при выводе на экран будут иметь визуальные различия.

Принципы построения сцен, задание динамики и интерактивности

Для объединения объектов сцены в одну структурную единицу существует специальный элемент – «композиция» (Composition). Идеологически композиция была введена для того, чтобы объединять видимые двухмерные медиа-объекты так, чтобы с ними можно было работать как с одним видимым двухмерным объектом. Поэтому, тип Composition унаследовал от базового типа Visible его свойства, методы и события действуют практически так же, как, например, у изображения (Image). Исключение составляют только свойства width и height. Они доступны только для чтения и выдают размер прямоугольной области, в которую вписываются все видимые элементы композиции.

186

Сцена (scene) представляет собой такую же композицию видимых двухмерных объектов, как и объект типа Composition, но сцена не может входить в другие композиции. Сцена является композицией верхнего уровня и в каждый момент времени у пользователя может быть только одна загруженная и работающая сцена.

Координаты видимых объектов, входящих в композицию, задаются относительно координат этой композиции:

Пример

<composition x="120" y="200">

<image src="underbut.png"/>

<text x ="10" y="5" value="кнопка"/>

</composition>

Таким образом, можно перемещать всю композицию, включая все входящие в нее видимые объекты и дочерние композиции, меняя только свойства x и y материнской композиции. Все видимые двухмерные объекты сцены упорядочены по глубине. Для задания глубины объекта используется свойство depth. Чем больше значение свойства depth, тем «дальше» от наблюдателя находится объект. По умолчанию, значение свойства depth равно нулю. Для отдельных объектов сцены абсолютная глубина объекта вычисляется путем суммирования значений свойства depth у объекта и всех его родительских композиций.

Помимо видимых двухмерных объектов (Image, Animation, Video, Text, Viewport и т.д.) композиции могут содержать другие композиции и объекты типов Audio, Button,

Styles, Sequencer, Scene3d, Xml, а также скрипты (элемент Script).

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

Пример

<scene>

<image name="back" src="back.png"/>

<script>

back.width = Player.window.clientWidth;

187

</script>

</scene>

Необходимо отметить, что скрипты выполняются в контексте того объекта, дочерним элементом которого они описаны в XML-файле. Поэтому если инициализирующий скрипт описать внутри элемента Image, то скрипт немного изменится:

Пример

<image name="back" src="back.png">

<script>

width = Player.window.clientWidth;

</script>

</image>

В данном случае обращение к свойству width происходит непосредственно через его имя. Чтобы явно сослаться на объект, в контексте которого выполняется скрипт, можно использовать ключевое слово this:

this.width = Player.window.clientWidth;

Кроме своего основного назначения (объединения объектов) композиции могут использоваться как вспомогательный объект, у которого есть свои свойства, методы, события и обработчики событий:

Пример

<composition name="controller" userEvents="evStepChanged">

<script>

this.step = 0;

function gotoNextStep(){

step++;

fireEvent("evStepChanged");

}

</script>

</composition >

188

В сценариях иногда возникает необходимость создавать объекты динамически через JavaScript, в частности, когда количество объектов заранее не известно или их очень много. Для этого существуют JavaScript-классы для всех типов объектов. Как правило, название JavaScript-класса совпадает с названием типа объекта и начинается с заглавной латинской буквы. Например, чтобы создать изображение и включить его в состав дочерних элементов композиции, необходимо включить в композицию следующий скрипт:

Пример

<script>

var img2 = new Image(); img2.name = "img2"; img2.x = 40;

img2.y = 85;

img2.src = "img2.png"; img2.parent = this;

</script>

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

Для удаления объекта из сцены необходимо свойству parent присвоить значение null. Если в сцене не сохранилось других ссылок на объект, то он будет удален.

Использование классов в качестве шаблонов описания элементов языка

Использование классов позволяет реализовать механизм наследования. Все объекты, объявленные в сценарии до элемента scene, считаются описанием классов:

Пример

<image name="cMyImage" src="img.png">

<script event="onPress">

hide();

</script>

</image>

189

<scene>

<image name="img1" class="cMyImage" x="100" y="120"/>

<image name="img2" class="cMyImage" x="200" y="120"/>

</scene>

При этом все свойства, методы и дочерние элементы класса cMyImage будут унаследованы объектами img1 и img2.

Можно также объявлять классы сцен. Для этого необходимо у элемента scene установить атрибут final в значение false:

Пример

<scene name="cMyScene" final="false">

</scene>

<scene class="cMyScene">

</scene>

Если динамически создаваемый объект должен наследоваться от класса, то класс следует указывать до инициализации объекта, то есть до включения его в иерархию сцены присвоением свойства parent:

Пример

var img2 = new Image();

img2.name = "img2";

img2._class = "cMyImage";

img2.parent=this;

Класс может быть унаследован от другого класса:

Пример

<image name="cMyBaseImage" src="img.png"/>

190