Описание возможностей скриптового языка для мультимедиа продукта с модульной архитектурой.
Язык ML (multimedia language) позволяет описывать сцены, состоящие из мультимедиа элементов и их композиций, а также задавать сценам интерактивность и динамику.
Объектная модель
Объектная модель описывает состав, структуру и функциональность объектов, используемых в языке.
Ниже приведена классификация типов объектов языка:
· Глобальные
o Player – управление программой-визуализатором
o Mouse – управление обработкой событий мыши
o Key – управление обработкой событий клавиатуры
o Event – параметры событий
o scene – сцена
· Двухмерные медиа-объекты и другие объекты 2D-сцен
o Image – изображение
o Animation – растровая анимация
o Video – видео-фрагмент
o Text – текст
o Viewport – область отображения 3D-сцен
o Composition – двухмерная композиция
o Button – «горячая зона» (кнопка)
o Styles – стили текстовых объектов
o Input – ввод текста
o ActiveX – ActiveX-объект
o Flash – Flash-анимация
o Browser – HTML-браузер
o QuickTime – QuickTime-объект
· Трехмерные медиа-объекты и другие объекты3D-сцен
o Object3D – трехмерный объект
o Character – персонаж
o Scene3D – трехмерная сцена
o Group – группа 3D-объектов
o Light – освещение
o Camera – камера
o Motion – движение 3D-объекта или персонажа
o Path3D – путь движения 3D-объекта или персонажа
o Shadows – параметры теней 3D-объекта или персонажа
o Shadow – параметры тени 3D-объекта или персонажа
o Speech – реплика персонажа
o Movement – набор движений персонажа для ходьбы
o Visemes – набор выражений лица персонажа «виземы»
o Cloud – настройки «облачка» персонажа
o Hint – настройки подсказки
o Idles – набор «движений простоя» персонажа
o Idle – «движений простоя» персонажа
o Materials – набор материалов 3D-объекта и персонажа
o Material – настройки материала 3D-объекта или персонажа
o Map – карта для текстуры 3D-объекта или персонажа
· Звуковые медиа-объекты
o Audio – звуковой фрагмент
· Поддержка XML
o XML (XMLDocument, XMLElement, XMLText)
· Вспомогательные
o Sequencer – задание последовательности воспроизведения
o Plugin – программный plug-in
Объекты каждого типа могут содержать как свой собственный набор свойств и порождаемых событий, так и наборы свойств и событий, унаследованных от «супертипов»:
· Element – свойства, общие для всех объектов сцены
свойства:
§ name – имя объекта
§ parent – ссылка на родительский объект в иерархии сцены
§ class – ссылка на объект класса, от которого унаследован объект
§ target – полный «путь» к объекту в dot-нотации
§ userEvents – перечень пользовательских событий
· Loadable – свойства и события объектов с подгружаемым ресурсом
свойства:
§ src – указатель размещения ресурса
события:
§ onLoad – ресурс загружен
· Visible – свойства и события объектов двухмерной сцены
свойства:
§ x – координата X
§ y – координата Y
§ width – ширина
§ height – высота
§ depth – глубина
§ visible – флаг видимости
§ xMouse – относительная координата X указателя мыши
§ yMouse – относительная координата Y указателя мыши
события:
§ onMouseDown – нажата кнопка мыши
§ onMouseMove – переместился курсор мыши
§ onMouseUp – кнопка мыши отпущена
§ onRMouseDown – нажата правая кнопка мыши
§ onRMouseUp – правая кнопка мыши отпущена
§ onMouseWheel – повернуто колесо прокрутки мыши
методы:
§ getMediaSize – получить размер изображения ресурса
§ crop – оставить видимой прямоугольную область изображения
§ show – показать
§ hide – скрыть
· Button – свойства и события объектов, которые могут быть «кнопками»
свойства:
§ enabled – флаг активности
§ hitArea – активная зона
§ useHandCursor – изменять курсор при наведении на активную зону
§ modal – флаг модальности
события:
§ onPress – нажата кнопка мыши на активной зоне объекта
§ onRelease – кнопка мыши отпущена на активной зоне объекта
§ onReleaseOutside – кнопка мыши отпущена вне активной зоны объекта
§ onRollOver – указатель мыши попал на активную зону
§ onRollOut – указатель мыши вышел из активной зоны
§ onKeyDown – нажата клавиша клавиатуры
§ onKeyUp – отпущена клавиша клавиатуры
· Continuous - свойства и события объектов, имеющих продолжительность во времени
свойства:
§ playing – флаг воспроизведения
§ currentFrame – номер текущего кадра (0 – первый кадр)
§ length – общее количество кадров
§ currentPos – текущая позиция (в ms)
§ duration – продолжительность (в ms)
§ fps – скорость воспроизведения (кадров в секунду)
§ loop – флаг «зацикленности»
события:
§ onEnterFrame – показан очередной кадр
§ onPlayed – воспроизведение окончено
методы:
§ play – запустить на воспроизведение
§ stop – прервать воспроизведение
§ rewind – «перемотать» на начало
§ rewindAndPlay – «перемотать» на начало и запустить на воспроизведение
§ gotoAndPlay – переместить в определенную позицию и воспроизвести
§ gotoAndStop – переместить в определенную позицию
§ setCheckPoints – установить «контрольные точки»
· 3DObject - свойства и события трехмерных объектов
свойства:
§ position – положение 3D-объекта
§ scale – масштаб 3D-объекта
§ rotation – поворот 3D-объекта
§ visible – флаг видимости
§ intersections – массив пересекающихся с объектом других 3D объектов
события:
§ onMouseDown – нажата кнопка мыши
§ onMouseMove – переместился курсор мыши
§ onMouseUp – кнопка мыши отпущена
§ onPassed – заданный путь пройден
методы:
§ doMotion – выполнить движение
§ setMotion – установить в начальное положение движения
§ goPath – пойти по пути
Таблица наследования:
Супертип Тип | Element | Loadable | Visible | Button | Continuous | 3DObject |
Image | + | + | + | + | ||
Animation | + | + | + | + | + | |
Video | + | + | + | + | + | |
Text | + | + | + | + | ||
Viewport | + | + | + | |||
Composition | + | + | + | |||
Styles | + | + | ||||
Input | + | + | + | |||
Object3D | + | + | + | + | ||
Character | + | + | + | + | ||
Scene3D | + | |||||
Group | + | + | + | + | ||
Light | + | + | ||||
Camera | + | + | + | |||
Motion | + | + | ||||
Path3D | + | + | ||||
Shadows | + | |||||
Audio | + | + | + | |||
XML | + | + | ||||
Sequencer | + | + |
Свойства, события и методы, которые не наследуются от супертипов:
· Image
методы:
§ makeSnapshot – сделать снимок участка изображения видимого объекта
· Animation
· Video
свойства:
§ windowed – флаг создания под видео дочернего окна
· Text
свойства:
§ value – текст
§ style – ссылка на объект стилей
· Viewport
свойства:
§ camera – камера 3D-сцены, «через которую смотрим»
§ show_hints – флаг «показывать подсказки»
§ include – массив ссылок на 3D-объекты, которые надо показывать
§ exclude – массив ссылок на 3D-объекты, которые не надо показывать
методы:
§ getObjectIn – получить 3D-объект по двухмерным координатам
§ getProjection – получить проекционные координаты 3D-объекта или точки
· Composition
свойства:
§ final – флаг «композиция не является классом»
методы:
§ getBounds – получить координаты прямоугольной области, в которую
вписывается композиция
§ setTimeout – выполнить JS-скрипт через определенный промежуток времени
§ clearTimeout – отменить выполнение JS-скрипта через определенный промежуток времени
§ setInterval – выполнять JS-скрипт через равные промежутки времени
§ clearInterval – отменить выполнение JS-скрипта через равные промежутки времени
· Styles
свойства:
§ htmlTag – HTML-тэг, стиль которого задают остальные свойства
§ font – параметры шрифта
§ fontFamily – название шрифта
§ fontStyle – наклон шрифта
§ fontWeight – толщина шрифта
§ fontSize – размер шрифта
§ lineHeight – высота строки
§ textAlign – выравнивание текста
§ textIndent – отступ первой строки абзаца
§ textDecoration – декорирование текста
§ color – цвет
· Input
свойства:
§ value – текст
§ style – ссылка на объект стилей
· ActiveX
методы:
§ set – задать значение свойства ActiveX-объекта
§ get – получить значение свойства ActiveX-объекта
§ call – вызвать метод ActiveX-объекта
· Flash
· Browser
· QuickTime
· Object3D
свойства:
§ shadow – ссылка на объект Shadows
§ materials – свойства материалов
§ motion – первоначальное положение
· Character
свойства:
§ movement – ссылка на список движений для ходьбы/бега
§ visemes – ссылка на список визем
§ idles – ссылка на список движений в состоянии покоя
§ shadow – ссылка на объект Shadows
§ materials – свойства материалов
§ motion – первоначальное положение
методы:
§ say – произнести реплику
§ goTo – подойти к точке или объекту
§ turnTo – повернуться к точке или объекту
§ lookAt – посмотреть на точку или объект
· Scene3D
· Group
· Light
· Camera
свойства:
§ fov – FOV камеры
§ dest – точка, куда направлена камера
§ linkTo – ссылка на 3D-объект, к которому «привязана» камера
· Motion
§ inverse – обратное движение
§ duration – длительность движения
§ primary – флаг приоритетности движения
§ tracks – параметры трэков движения
· Audio
· XML
свойства:
§ XMLDocument – ссылка на XML-документ (DOM Level1)
· Sequencer
· Plugin
методы:
§ call – вызвать функцию plug-in-а
Синтаксис языка
Описание сцены представляется в XML-формате и содержит элементы, соответствующие типам языка.
Простейшая сцена, содержащая только одно изображение, размещенное по координатам 0,0, описывается следующим образом.
<?xml version="1.0" encoding="UTF-8"?>
<rmml>
<scene>
<image src=”back. png”/>
</scene>
</rmml>
Элементы двухмерной сцены могут объединяться в композиции:
<composition x=”120” y=”200”>
<image src=”underbut. png”/>
<animation x =”10” y=”5” src=”but. flc”/>
</composition>
При объединении элементов в композиции их координаты задаются относительно координат композиции. Элемент composition, как и scene может включать в себя следующие элементы: image, animation, video, text, styles, input, audio, sequencer, scene3d, viewport, xml, include, composition.
Все объекты трехмерных сцен описываются в элементе scene3d: object (объект Object3D), light, camera, group, motion, path3d, shadows. Элементы object могут группироваться элементом group.
Дополнительная инициализация объектов может быть задана путем включения в описание элемента тэгов script. Например, чтобы задать ширину изображения фонового изображения равной ширине клиентской части окна, необходимо добавить инициализирующий Java-script:
<scene>
<image name=”back” src=”back. png”/>
<script>
back._width=Player. window. clientWidth;
</script>
</scene>
Если текст на Java-script содержит символы, недопустимые в формате XML для использования в тексте элемента (<, >, /), необходимо заключить его в конструкцию CDATA:
<script><![CDATA[
for(var j=0; j<20; j++) s+=’ ‘;
]]></script>
Описание сцены можно для удобства разбивать на части и использовать элемент include для включения частей в сцену. При этом части должны представлять собой XML-файлы в формате, аналогичном формату описания основной сцены, за исключением того, что они не должны содержать элемент scene.
Принципы построения сцены
Основная сцена (глобальный объект scene) представляет собой композицию двухмерных объектов и их композиций, упорядоченных по глубине (свойство depth). Чем больше значение свойства depth, тем «дальше» от наблюдателя находится объект.
Трехмерные сцены отображаются в областях, задаваемых специальным двухмерным объектом (Viewport). Чтобы отобразить трехмерную сцену (Scene3D), необходимо в свойство camera объекта типа Viewport установить ссылку на объект типа Camera, содержащийся в объекте трехмерной сцены:
<viewport camera=”scn3d. cam1”>
<scene3d name=”scn3d”>
<camera name=”cam1” />
…
</scene3d>
Событийная модель
Объекты сцены могут порождать различные события. Если при возникновении события необходимо выполнить некоторый Java-script, в описание сцены включается элемент script и указать это событие в параметре event:
<image name=”img1” src=”img1.png”>
<script event=”onPress”>
hide();
</script>
</image>
При включении элемента script в описание другого элемента, Java-script выполняется в контексте этого элемента. Элемент script можно не включать в описание элемента, порождающего события:
<image name=”img1” src=”img1.png”/>
<script event=”img1.onPress”>
img1.hide();
</script>
Обработка событий от мыши
Все видимые объекты могут принимать и обрабатывать события от мыши (onMouseDown, onMouseMove и onMouseUp). При обработке этих событий можно использовать свойства xMouse и yMouse, которые доступны только по чтению и имеют значение координат мыши относительно координат самого объекта.
Все видимые двухмерные объекты могут быть «кнопками» (унаследованы от «супертипа» Button). По умолчанию активной зоной объекта является прямоугольник, в который вписывается объект (x, y, width, height). Активную зону объекта можно переопределить с помощью свойства hitArea. Активная зона может быть задана либо прямоугольной, либо в форме многоугольника. Активная зона прямоугольной формы задается путем присвоения свойству hitArea строкового значения в формате “[x, y, ширина, высота]”, где x и y – координаты верхнего левого угла зоны относительно координат объекта. Активная зона в форме многоугольника задается в формате “{(x1, y1), (x2, y2), … (xn, yn)}”, где xm и ym – координаты вершин многоугольника относительно координат объекта.
<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>
Динамическое создание объектов
Объекты сцен могут создаваться и уничтожаться динамически средствами Java-script:
var img2 = new Image;
img2.name = ”img2”;
img2.x = 40;
img2.y = 85;
img2.src = ”img2.png”;
img2.parent = this;
Объект включается в иерархию сцены и инициализируется при присвоении свойству parent ссылки на объект, который уже является частью сцены.
Управление последовательностью воспроизведения
Элемент sequencer позволяет управлять последовательностью воспроизведения. Он включает в себя последовательность тэгов script, которые выполняются последовательно один за другим во время воспроизведения. Скрипты sequencer-а отличается от скриптов других элементов тем, что, во-первых, они выполняются в контексте родительского элемента, а во-вторых, момент начала выполнения следующего скрипта зависит от результата выполнения предыдущего. Так как sequencer унаследован от прототипа Continuous, управление им осуществляется с помощью установки свойств playing, currentFrame и loop или командами play, stop, rewind и т. д. Значение свойства currentFrame соответствует порядковому номеру скрипта, начиная с нуля.
Результат выполнения скрипта трактуется следующим образом: если в результате получилось число, то выполнение следующего скрипта начинается через время, соответствующего этому числу миллисекунд. Если в результате получилось булеановское значение false, то sequencer переходит в состояние паузы и следующий скрипт будет выполняться только после установки свойства playing в значение true. В случае, если результатом выполнения скрипта является булеановское значение true, следующий скрипт выполняется немедленно. Строковый результат трактуется как событие, по происшествию которого будет выполнен следующий скрипт.
Например, смена одного изображения (img1) другим (img2) через 2 секунды задается следующим образом:
<sequencer playing=”true”>
<script>
2000; // ms
</script>
<script>
img1.show();
img2.show();
</script>
</sequencer>
Показ изображения (img) после окончания воспроизведения анимации (anim) можно задать так:
<sequencer playing=”true”>
<script>
anim. rewindAndPlay();
“anim. onPlayed”;
</script>
<script>
Img1.show();
</script>
</sequencer>
Управление программой-визуализатором
Управление работой программы-визуализатора осуществляется через глобальный объект Player. Объект содержит следующие свойства и методы:
· mode - режим работы программы-визуализатора
· module - свойства модуля
o meta - метаданные загруженного модуля
o src - ссылка на ресурс, содержащий описание сцены или модуля
· UI - композиция пользовательского интерфейса
· exit() - закончить работу программы-визуализатора
· minimize() – свернуть окно программы-визуализатора
Свойство mode доступно только по чтению и может принимать следующие значения:
· Player. MODE_LOADING - происходит загрузка сцены
· Player. MODE_NORMAL - «нормальный» режим
· Player. MODE_INIT - режим инициализации (по событиям синхронизации)
· Player. MODE_PLAY - режим воспроизведения (по событиям синхронизации)
· Player. MODE_PAUSE - режим ожидания
3D объекты
Трехмерные объекты (Object3D, Camera, Light) и их группы (Group) могут описываться только в 3D сцене.
<scene3d name=”scn3d”>
<object name=”obj1” src=”obj1/mesh. cfg” />
<group name=”grp1”>
<object name=”obj11” src=”obj11/obj11.cfg” />
<object name=”obj12” src=”obj12/obj12.cfg” />
</group>
<camera name=”cam1” src=”cam1.xml” />
<light name=”light1” src=”light1.lgx” />
</scene3d>
?? Shadows
?? Materials
Для преобразования двухмерных координат в трехмерные и обратно у объекта Viewport существует два специальных метода. Метод getObjectIn(x, y) позволяет получить 3D-объект по двухмерным координатам. Аргументы метода (x и y) - двухмерные координаты, задаваемые относительно координат объекта Viewport. Возвращаемый методом объект содержит следующие свойства:
· obj - ссылка на 3D-объект;
· x, y и z - координаты пересечения луча, исходящего параллельно направлению камеры, с ближайшим участком поверхности 3D-объекта.
Метод getProjection позволяет получить проекционные координаты 3D-объекта или точки в пространстве 3D-сцены. Аргументами метода могут быть координаты точки в пространстве (getProjection(x, y, z)), объект Position3D или любой 3D-объект. Возвращаемый методом объект содержит координаты проекции (свойства x и y). Если аргументом функции был 3D-объект, то возвращаемый объект содержит также двухмерные координаты прямоугольника (относительно координат объекта Viewport), в который вписывается изображение объекта (свойства left, right, top и bottom).
Персонажи
Поведение персонажей задается способом, несколько отличным от задания поведения других объектов 3D-сцены. Кроме обычного для 3D-объектов способа задания движений с помощью команд doMotion и goPath, у персонажа есть более специализированные команды – goTo и turnTo. При этом используются движения, заданные в элементе movement, ссылка на который указана в одноименном свойстве персонажа.
<character name="Person" movement="normal_move">
<movement name="normal_move" stepLength="100" rotSpeed="90">
<motion name="forward" src="goforward. CAF"/>
<motionname="backward" src="gobackward. CAF"/>
<motion name="step_left" src="lstrafe. CAF"/>
<motion name="step_right" src="rstrafe. CAF"/>
<motion name="lrotation" src="lrotate. CAF"/>
<motion name="rrotation" src="rrotate. CAF"/>
</movement>
</character>
Когда персонаж не идет и не выполняет никаких специальных движений, он может в произвольном порядке выполнять набор движений, заданных элементом idles:
<character name="Person" idles=”p_idles”>
<idles name="p_idles">
<idle name="idle1" motion="p_idle1" freq="10"/>
<idle name="idle2" motion="p_idle2" freq="15"/>
</idles>
</character>
Персонаж может произносить реплики с помощью команды say. Каждая реплика задается элементом speech. Во время произнесения реплики персонаж может двигать губами в соответствии с уровнем громкости звуков реплики. При этом используются виземы – относительные положения точек области рта персонажа для каждой из фонем (звуков, представляющих некоторый набор букв):
<character name="Person" visemes=” v_normal”>
<visemes name="v_normal" src="normal_lexs. fap"/>
</character>
Для отображения реплик в виде текста используется дочерний элемент персонажа – cloud и его дочерний элемент text:
<character name="Person">
<cloud name="cloud1" src="cloud. cfg" width="300">
<text name="text1" depth="-100" width="300"/>
</cloud>
</character>
«Облако» выводится, когда значение текстового объекта (value) не является пустой строкой (Person. cloud1.text1.value=”текст реплики”).
Для того, чтобы персонаж мог выполнить действие типа «посмотри на него», существует команда lookAt:
<character name="Person2">
</character>
<character name="Person">
<script>
lookAt(parent. Person2);
</script>
</character>
Классы
Использование классов позволяет реализовать механизм наследования. Все объекты, объявленные в сценарии до тэга scene, считаются описанием классов:
<image name=”cMyImage” src=”img. png”>
<script event=”onPress”>
hide();
</script>
</image>
<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”/>
<image name=”cMyImage” class=”cMyBaseImage”>
<script event=”onPress”>
hide();
</script>
</image>
<scene>
<image name=”img1” class=”cMyImage” x=”100” y=”120”/>
<image name=”img2” class=”cMyImage” x=”200” y=”120”/>
</scene>
При этом все свойства, методы и дочерние элементы классов cMyImage и cMyBaseImage будут унаследованы объектами img1 и img2.
Методы класса могут быть переопределены в унаследованных от него классах и объектах:
<image name=”cMyBaseImage”>
<script>
function moveRight(){
x += 10;
}
</script>
</image>
<image name=”cMyImage” class=”cMyBaseImage”>
<script>
function moveRight(){
x += 20;
}
</script>
</image>
<scene>
<image name=”img1” class=”cMyImage” x=”100” y=”120”/>
<script>
img1.moveRight();
</script>
</scene>
Если метод переопределен и необходимо вызвать его реализацию в базовом классе, что перед именем метода следует поставить имя базового класса и символ подчеркивания:
<image name=”cMyBaseImage”>
<script>
function moveRight(){
x += 10;
}
</script>
</image>
<image name=”cMyImage” class=”cMyBaseImage”>
<script>
function moveRight(){
cMyBaseImage_moveRight();
x += 20;
}
</script>
</image>
Ресурсные модули
П...
Принципы формирования путей к ресурсам
П…
[:][alias:1[alias2:]][/]path
getFullPath
Вычисление значений атрибутов
<define name=”const_name” value=”expr”/>
attr=”eval(expr)”


