[ предыдущая страница ] [ следующая страница ] [ содержание ]

7.10. Взаимодействие с внешними программными компонентами

Осталось рассмотреть еще один важный аспект создания роликов Flash, интеграцию с внешней средой. В языке ActionScript имеется оператор fscommand, предназначенный для передачи команд во внешнюю среду.

Какие это могут быть команды? Ясно, что ответ на этот вопрос целиком зависит от того, в какой среде выполняется ролик Flash. Именно поэтому вопрос, рассматриваемый в данном разделе, настолько многогранен, что для детального его изучения требуются многие часы и дни упорной работы. Мы постараемся лишь кратко изложить основные сведения по этому вопросу.

7.10.1. Взаимодействие с операционной системой

Оператор 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.

7.10.2. Интеграция со сценариями Web-страницы

Однако проекторы - это не самое частое применение роликов 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. Обращаться из ролика к сценариям веб-страницы подобным образом можно в любой ситуации.

7.10.3. Управление роликом из веб-страницы

Вы спросите: а возможно ли обратное действие - из сценария веб-страницы обратиться к ролику? Оказывается, и это возможно. Существуют специальные методы 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>&nbsp;
<BUTTON onClick="rrr();">REWIND</BUTTON>&nbsp;
<BUTTON onClick="ppp();">PLAY</BUTTON>
</DIV>
</BODY>
</HTML>

Загрузите этот файл (он должен находиться в той же папке, что и ролик) в браузер. Вы увидите анимационный ролик, а под ним три кнопки "STOP!", "REWIND" и "PLAY". Нажимая на кнопки, убедитесь, что они управляют поведением ролика.

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

7.10.4. Взаимодействие роликов

Между прочим, это дает очень интересную возможность управлять одним роликом из другого, никак вроде бы с ним не связанного. Эти ролики могут "общаться" между собой через сценарий 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. А на основе простых элементов можно создавать все более и более сложные композиции. Только не забывайте о том, что оформление никогда не должно заслонять собой содержание вашего творения, будь то веб-страница или просто локальная презентация. Если оформление подчинить содержанию, сразу исчезнет множество проблем, и работа пойдет веселей и удачней.

[ предыдущая страница ] [ следующая страница ] [ содержание ]
Hosted by uCoz