Осталось рассмотреть еще один важный аспект создания роликов Flash, интеграцию с внешней средой. В языке ActionScript имеется оператор fscommand, предназначенный для передачи команд во внешнюю среду.
Какие это могут быть команды? Ясно, что ответ на этот вопрос целиком зависит от того, в какой среде выполняется ролик Flash. Именно поэтому вопрос, рассматриваемый в данном разделе, настолько многогранен, что для детального его изучения требуются многие часы и дни упорной работы. Мы постараемся лишь кратко изложить основные сведения по этому вопросу.
Оператор fscommand передает во внешнюю среду два параметра. Обычно первый из них является командой, а второй - ее аргументом. Проще всего дело обстоит, если ролик исполняется как проектор. Поскольку проектор - это исполняемый файл, внешней средой для него является операционная система. Для проекторов определено шесть стандартных команд, с помощью которых они могут общаться с операционной системой. Прежде всего, это команда quit. С ее помощью проектор дает операционной системе команду закрыть себя. Эта команда обычно располагается в конце ролика (в последнем кадре):
fscommand ("quit");
Как видите, в этом случае даже не потребовался второй параметр.
Второй распространенный случай - это команда exec. С ее помощью операционной системе передается командная строка. Например, если в проекторе для Windows встретится код
fscommand ("exec","calc.exe");
то при проигрывании соответствующего кадра запустится системный калькулятор! Как видите, это позволяет запускать из ролика Flash любые программы (но не пугайтесь, повторим на всякий случай, что это возможно только в проекторе). В общем, все, что можно выполнить с помощью системной команды Run в операционной системе Windows, доступно и из проектора с помощью оператора fscommand.
Интересно, что если надо исполнить системную команду, состоящую из нескольких "слов" (с пробелами), то разделителем между этими словами должен быть не пробел, а символ табуляции. Его можно вставить с помощью специальной комбинации \t. Например, если мы хотим из ролика Flash выполнить команду
dir c:\
то посредством оператора fscommand эту команду нужно передать так:
fscommand ("exec","command.com\t/c\tdir\tc:\\");
Символ \ (обратная косая черта) в языке ActionScript является префиксом для указания специального символа, так что для его ввода необходимо повторить его дважды, что мы и видим в конце данной строки.
Если попытаться вместо специальной комбинации \t ввести обычный пробел, ничего не получается - операционной системе передается только команда command.com, запускающая интерпретатор командной строки, а все остальное игнорируется.
Для передачи инструкций операционной системе используются еще четыре команды, каждая из которых может принимать в качестве параметра значения true или false.
Однако проекторы - это не самое частое применение роликов Flash. Чаще всего все-таки эти ролики встраиваются в страницы HTML и воспроизводятся в браузере. При этом применение вышеописанных команд бессмысленно, однако для флэшера открываются другие, весьма широкие возможности. Речь идет об интеграции сценариев ActionScript со сценариями веб-страницы (JavaScript и VBScript).
С помощью оператора fscommand можно вызывать функции JavaScript и VBScript. Для этого, правда, они должны быть специальным образом определены. Дело в том, что, если использовать в ролике с именем MyMovie оператор fscommand, он вызовет из внешней среды функцию с определенным именем. В браузере Netscape это функция JavaScript с именем MyMovie_DoFSCommand, а в программе Internet Explorer - функция MyMovie_FSCommand. Эти функции надо определить заранее.
Поскольку оператор fscommand передает два параметра, функция должна принимать два аргумента. Их можно использовать как угодно, но по традиции первый аргумент обычно представляет имя команды, а второй - ее параметр.
Итак, в программе Netscape оператор fscommand вызывает одну функцию, а в Internet Explorer - другую (и это даже функции на разных языках). Чтобы страничка была совместима с обоими браузерами, придется писать две разных функции. Правда, при этом проще не дублировать один и тот же код, а вызвать из функции VBScript функцию JavaScript с помощью оператора call.
Рассмотрим несложный пример. Пусть имеется ролик, из которого надо вызвать стандартное диалоговое окно предупреждения (alert) и изменить содержимое строки состояния. Заметим, что в реальной работе ради таких мелочей "городить огород" не имеет смысла, однако в качестве примера этот случай вполне подходит. Таким образом, надо создать две команды, например al для вызова окна предупреждения и stat для изменения строки состояния. Внутри ролика поместим эти команды в разных местах.
fscommand ("al","ВНИМАНИЕ!!!");
...
fscommand ("stat","Видите, что происходит?");
Теперь осталось средствами сценариев JavaScript / VBScript обеспечить выполнение этих команд. Вначале напишем функцию MyMovie_DoFSCommand (она вызывается в браузере Netscape):
<SCRIPT LANGUAGE="JavaScript">
function MyMovie_DoFSCommand(cmd,arg) {
if (cmd=="stat") window.status=arg;
else if (cmd=="al") alert (arg);
}
</SCRIPT>
Как видите, схема реализации "разных команд" традиционно весьма проста. Мы сравниваем значение первого аргумента (cmd) с установленным нами же синтаксисом команды и в случае совпадения выполняем нужное действие. Так, в нашем примере, если значение первого аргумента равно stat, то мы делаем свойство window.status равным значению второго аргумента. Если же оно равно al, мы вызываем функцию alert.
Теперь нужно написать функцию на языке VBScript, которая должна вызваться в браузере Internet Explorer. Две строчки этого примера можно, конечно, и просто переписать на другом языке. Однако, функция может быть и очень длинной, так что лучше сразу научиться вызывать из этой функции уже написанную нами функцию на языке JavaScript:
<SCRIPT LANGUAGE=VBScript>
Sub MyMovie_FSCommand(ByVal cmd,ByVal arg)
call MyMovie_DoFSCommand (cmd,arg)
end sub
</SCRIPT>
Но это еще не все. Чтобы функции вызывались правильно, нужно еще не ошибиться в параметрах тегов <OBJECT> и <EMBED>, которые загружают в браузер ролик MyMovie.swf. Вот как должен выглядеть этот код:
<OBJECT classid="clsid:D27CDB6E-AE6D-1lcf-96В8-444553540000"
codebase="http://download.macromedia.com/pub/shockwave/cabs/
flash/swflash.cab#version=5,0,0,0" ID=MyMovie WIDTH=550
HEIGHT=400>
<PARAM NAME=movie VALUE="MyMovie.swf>
<PARAM NAME=quality VALUE=high>
<PARAM NAME=bgcolor VALUE=#FFFFFF>
<EMBED src="MyMovie.swf" quality=high bgcolor=#FFFFFF WIDTH=550
HEIGHT=400 swLiveConnect=true NAME=MyMovie
TYPE="application/x-shockwave-flash" PLUGINSPAGE="http:/
/www.macromedia.com/shockwave/download/
index.cgi?Pl_Prod_Version=ShockwaveFlash"></EMBED>
</OBJECT>
Что здесь добавилось по сравнению с кодом HTML, рассмотренным в предыдущем разделе? Обратите внимание на то, что в теге <EMBED> появился важный атрибут NAME=. Заметьте, что значение этого атрибута (в нашем примере MyMovie) обязательно совпадает с первой частью имен наших функций JavaScript / VBScript. Точно таким же должно быть и значение атрибута ID= тега <OBJECT>. Кроме того, в теге <EMBED> необходимо указать атрибут SWLIVECONNECT=TRUE.
Если теперь просмотреть страницу в браузере, то в момент выполнения оператора fscommand в ролике совершаются действия, определенные с помощью функции на языке JavaScript. Обращаться из ролика к сценариям веб-страницы подобным образом можно в любой ситуации.
Вы спросите: а возможно ли обратное действие - из сценария веб-страницы обратиться к ролику? Оказывается, и это возможно. Существуют специальные методы JavaScript, с помощью которых можно обратиться к ролику. Например, если в ролике с названием YourMovie написать:
vrb = 746;
то на веб-странице в коде JavaScript можно написать что-то вроде:
var a = YourMovie.GetVariable("vrb");
При этом переменной a присваивается значение 746. Вот какие методы для обращения к ролику доступны в сценарии JavaScript.
Необходимо добавить, что в методах TGetProperty. TGetPropertyAsNumber и TSetProperty используются не привычные обозначения свойств, а их числовые эквиваленты. Вот они:
0 - _x;
1 - _y;
2 - _xscale;
3 - _yscale;
4 - _currentframe;
5 - _totalframes;
6 - _alpha;
7 - _visible;
8 - _width;
9 - _height;
10 - _rotation;
11 - _target;
12 - _framesloaded;
13 - _name;
14 - _droptarget;
15 - _url;
16 - _highquality;
17 - _focusrect;
18 - _soundbuftime;
Так, например, чтобы получить значение свойства _droptarget мувика Clip1, находящегося в ролике Movie1, в сценарии JavaScript, нужно написать следующий код.
var a = Movie1.TGetproperty("_root.Clip1",14);
Для иллюстрации сказанного давайте рассмотрим небольшой пример. Пусть у нас есть ролик, загруженный в браузер. Попробуем создать в браузере кнопки, управляющие ходом воспроизведения, с помощью обычных средств HTML.
Откройте новый ролик, создайте в нем какую-либо простую анимацию (вполне подойдет уже несколько раз описанная в этой книге вращающаяся стрелка). Сохраните файл разработки под именем exp.fla. Экспортируйте полученный ролик под именем exp.swf.
Теперь создадим файл HTML. Вначале напишем функции JavaScript для остановки, начала воспроизведения и возвращения ролика на первый кадр. Чтобы не путаться, назовем ролик по имени файла - ехр. функция остановки ролика выглядит очень просто:
function sss() {
ехр.StopPlay ();
}
Аналогично должны выглядеть функции возвращения на первый кадр и начала воспроизведения. Теперь поместим в файл HTML сам ролик, не забыв в теге <OBJECT> указать атрибут ID="ехр", а в теге <EMBED> - атрибут NAME="exp". Кроме того, установим атрибут SWLIVECONNECT="true". Осталось создать три кнопки, при нажатии на которые должны вызываться наши функции. Это можно сделать следующим образом:
<BUTTON onClick="sss();">STOP!</BUTTON>
При щелчке на этой кнопке с надписью "STOP!" вызывается функция sss(), содержащая метод остановки ролика. Таким же образом создадим кнопки с надписями "REWIND" и "PLAY". Потом можно добавить пару тегов для центрирования содержимого и более пристойного размещения кнопок.
Теперь посмотрим на весь созданный код HTML:
<HTML>
<HEAD>
<TITLE>Управление роликом с помощью JavaScript</TITLE>
<SCRIPT LANGUAGE=JavaScript>
function sss() {
exp.StopPlay ();
}
function rrr() {
exp.Rewind ();
}
function ppp() {
exp.Play ()
}
</SCRIPT>
</HEAD>
<BODY BGCOLOR="#FFFFFF">
<DIV ALIGN="center">
<OBJECT CLASSID="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"
CODEBASE="http://download.macromiedia.com/pub/shockwave/cabs/
flash/swflash.cab#version=5,0,0,0" ID="exp" WIDTH="550"
HEIGHT="400">
<PARAM NAME="movie" VALUE="exp.swf">
<PARAM NAME="quality" VALUE="high">
<PARAM NAME="bgcolor" VALUE="#FFFFFF">
<EMBED SRC="exp.swf" NAME="exp" SWLIVECONNECT="true"
QUALITY="high" BGCOLOR="#FFFFFF" WIDTH="550" HETGHT="400"
TYPE="application/x-shockwave-flash" PLUGINSPAGE="http:/
P1_Prod_Version=shockwaveFlash"></EMBED>
</OBJECT>
<BR>
<BUTTON onClick="sss();">STOP!</BUTTON>
<BUTTON onClick="rrr();">REWIND</BUTTON>
<BUTTON onClick="ppp();">PLAY</BUTTON>
</DIV>
</BODY>
</HTML>
Загрузите этот файл (он должен находиться в той же папке, что и ролик) в браузер. Вы увидите анимационный ролик, а под ним три кнопки "STOP!", "REWIND" и "PLAY". Нажимая на кнопки, убедитесь, что они управляют поведением ролика.
Таким образом, у нас есть возможность и обращаться из ролика к функциям JavaScript, и, наоборот, обращаться из сценария JavaScript к ролику. Более того, при этом доступна не только основная сцена, но и любой из вложенных мувиков.
Между прочим, это дает очень интересную возможность управлять одним роликом из другого, никак вроде бы с ним не связанного. Эти ролики могут "общаться" между собой через сценарий JavaScript. Действительно, если управляющий ролик вызовет функцию JavaScript, в которой содержится команда управления другим роликом, то фактически пользователь сможет управлять одним роликом из другого.
Например, предположим, что мы решили кнопки управления в предыдущем примере разместить в отдельном ролике. Зачем могут понадобиться два отдельных ролика вместо одного - это самостоятельный вопрос. Можно, например, представить ситуацию, когда управляемый ролик находится в одной части веб-страницы, а управляющий - в другой. Между ними может располагаться большой фрагмент текста. Если объединить управляющие и управляемые элементы в один ролик, то в него придется добавить и текст. Это неоправданно увеличит размер ролика (в несколько раз) и создаст дополнительные проблемы с "читабельностью" мелкого шрифта.
Итак, уберем из предыдущего примера кнопки и создадим вместо них ролик upr.swf, в котором расположены три кнопки, одна из них с таким кодом:
on (release) {
fscommand("sss");
}
другая с таким:
on (release) {
fscommand("ppp");
}
и третья с кодом
on (release) {
fscommand("ppp");
}
Затем поместим ролик upr.swf на страницу в дополнение к ролику exp.swf:
<OBJECT CLASSID="clsid:D27CDE6E-AE6D-11cf-96B8-444553540000"
CODEBASE="http://download.macromedia.com/pub/shockwave/cabs/
flash/swflash.cab#version=5,0,0,0" ID="upr" WIDTH="550"
HEIGHT="400">
<PARAM NAME="movie" VALUE="upr.swf">
<PARAM NAME="quality" VALUE="high">
<PARAM NAME="bgcolor" VALUE="#FFFFFF">
<EMBED SRC="upr.swf" NAME="upr" SWLIVECONNECT="true"
QUAUTY="high" BGCOLOR="#FFFFFF" WIDTH="550" HEIGHT="400"
TYPE="application/x-shockwave-flash" PLUGINSPAGE="http:/
P1_Prod_Version=ShockwaveFlash"></EMBED>
</OBJECT>
Теперь переработаем сценарий JavaScript следующим образом:
<SCRIPT LANGUAGE=JavaScript>
function upr_DoFSComroand(cmd) {
if (cmd="sss") exp.StopPlay ();
else if (cmd=="rrr") exp.Rewind ();
else if (cmd=="ppp") exp.Play ();
}
</SCRIPT>
Добавим код VBScript для браузера Internet Explorer:
<SCRIPT LANGUAGE=VBScript>
on srror resume next
Sub upr_FSCommand(ByVal cmd)
call upr_DoFSCommand(cmd);
end sub
</SCRIPT>
Все! Страницу можно загрузить в браузер и убедиться, что кнопки одного ролика прекрасно управляют анимацией другого.
На этой достаточно интересной и многогранной теме мы и закончим наше повествование о замечательной программе Flash. Надеемся, что на основе полученных знаний вы теперь сможете создавать свои собственные интересные разработки.
Примеры, приведенные в этой книге, достаточно просты, но они наглядно демонстрируют приемы программирования на языке ActionScript. А на основе простых элементов можно создавать все более и более сложные композиции. Только не забывайте о том, что оформление никогда не должно заслонять собой содержание вашего творения, будь то веб-страница или просто локальная презентация. Если оформление подчинить содержанию, сразу исчезнет множество проблем, и работа пойдет веселей и удачней.
[ предыдущая страница ] [ следующая страница ] [ содержание ]