Для многих программистов, использующих в работе Flash и PHP, тесная интеграция этих двух технологий остается нетривиальной задачей. В предыдущей статье («Мир ПК», №3/08, с. 58) были рассмотрены простые примеры применения возможностей библиотеки Ming из пакета PHP, позволяющей динамически формировать и передавать в браузер flash-объекты. Эта библиотека способна развеять страшный миф о том, что синтез PHP и Flash осуществим только с использованием XML в разных его ипостасях. Благодаря этому крохотному модулю и сама технология Flash может стать для рядового разработчика ближе и роднее.

Рассматриваемый программный интерфейс, предоставляющий объекты и функции, дает широкие возможности по интеграции веб-решений различных уровней. Библиотека инкапсулировала в себе весь необходимый для профессиональных решений графический интерфейс, и, кроме того, разработчики могут писать вставки на языке Action Script. Использование библиотеки Ming уже де-факто стало стандартным решением, и в Сети есть множество копий руководств по работе с этим интерфейсом. Однако углубленные систематизированные ресурсы на эту тему найти сложно. Видимо, дело в том, что данное решение лежит где-то посередине между PHP и Flash. На англоязычных сайтах готовые примеры найти гораздо проще, чем в Рунете. В общем, следует отметить, что приведенные тексты скрипта не претендуют на оригинальность, если сравнить их с ресурсами на таких сайтах, как hudzilla.org, php.happycodings.com, ysn.ru, ming.sourceforge.net/examples или thebook.com/php/swf.

Рассмотрим первый пример. Ming позволяет использовать вставки на языке Action Script, для чего предусмотрен специальный объект SWFAction. Строку со скриптом Action Script можно вставить непосредственно в конструктор этого объекта (листинг 1). Здесь в качестве реакции на нажатие кнопки предполагается загрузка в текущее окно браузера страницы сайта www.osp.ru.

 

Листинг 1

/* Пример 1. Кнопка */

//Функция подготовки формы для кнопки

function MakeActionBox($red, $green, $blue){

$shape = new SWFShape();

//Готовим фон

$shape->setLeftFill($shape->addFill($red, $green, $blue));

//Готовим рамку

$shape->setLine( 3, $red/2, $green/2, $blue/2);

$shape->drawLine(150,0);

$shape->drawLine(0,50);

$shape->drawLine(-150,0);

$shape->drawLine(0,-50);

return $shape;

}

//Создаем кнопку для обработки событий мыши

$button = new SWFButton();

//Задаем виды кнопок - реакции на мышь

$button->setUp(MakeActionBox(255, 100, 100));

$button->setOver(MakeActionBox(200, 200, 2000));

$button->setDown(MakeActionBox(100, 100, 150));

$button->setHit(MakeActionBox(0, 0, 0));

//Событие на нажатие кнопки,

//во втором аргументе ничего не указываем - хотим открывать в том же окне

$button->addAction(new SWFAction(“getURL(‘http://www.osp.ru/’, ‘’);”), SWFBUTTON_MOUSEUP);

//Создаем объект для нового Flash-фильма

$movie = new SWFMovie();

$movie->setDimension(200,200);

//Добавляем в фильм кнопку

$displayitem = $movie->add($button);

$displayitem->moveTo(-50,10);

// header(“Content-type: application/x-shockwave-flash”);

// $movie->output();

?>

Кроме того, с помощью функции MakeActionBox добавлены реакции кнопки на все события от курсора мыши. В качестве заливки может быть также использован градиент или рисунок.

Второй пример посложнее: создается настоящая анимация (листинг 2). Сначала описывается заготовка $shp_circle, затем с помощью массива ob она тиражируется на 99 экземпляров, каждый из которых живет затем своей жизнью в соответствии с заданными математическими формулами, определяющими размер и траекторию движения объектов.

 

Листинг 2

/* Пример 2. Разлетающиеся шарики */

ming_setScale(20.00000000);

ming_useswfversion(6);

//Создаем фильм

$movie = new SWFMovie();

//Устанавливаем размер фильма

$
movie->setDimension(320,240);

//Задаем общий фон фильма

$
movie->setBackground(0, 0, 120 );

//Устанавливаем размер кадра анимации

//Передается числовое значение, равное числу кадров в секунду

$movie->setRate(31);

//Создаем форму

$shp_circle = new SWFShape();

//Указываем заливку

$shp_circle->setRightFill(150,90,255);

//Строим окружность

$shp_circle->drawCircle(2);

//Создаем объект, «фильм в фильме», который может иметь собственные

//объекты, анимацию и временную шкалу, независимые от главного flash-фильма

$spr_circle = new SWFSprite();

$f = $spr_circle->add($shp_circle);

//Перемещаем к следующему кадру анимации

$spr_circle->nextFrame();

$movie->addExport($spr_circle, “star”);

$movie->writeExports();

//Описание алгоритма движения фигур

$strAction = “

sx = 320; sy = 240;// screen size

mx = sx / 2;

my = sy / 2;

ob = [];

for(i=1;i<100;i++){

ob[i] = _root.attachMovie(‘star’,’s’+i,i+10);

ob[i].x = Math.random()*sx - mx;

ob[i].y = Math.random()*sy - my;

ob[i].z = Math.random()*15000 + 50;

};

_root.onEnterFrame = function(){

for(i=1;i<360;i++){

with(ob[i]){

z = z - 40;

if (z < 10){

x = Math.random()*sx - mx;

y = Math.random()*sy - my;

z = 210 + Math.rondom()*50;

};

ob[i]._xscale = 210 - (z * 0.1);

ob[i]._yscale = 210 - (z * 0.1);

ob[i]._x = mx*0.8 + mx*0.2*Math.sin(i) + (x * 1000 / z) ;

ob[i]._y = my*0.9 + my*0.1*Math.cos(i) + (y * 1000 / z);

};

};

};

“;

//Добавляем код в формате Action Script в фильм

$movie->add(new SWFAction( $strAction));

// header(‘Content-type: application/x-shockwave-flash’);

// $movie->output();

?>

Разлетающиеся шарикиТретий пример самый сложный и самый красивый. Для создания этого ролика (листинг 3) применен оригинальный прием, когда форма градиентной заливки дает эффект круглых огоньков. И здесь важную роль сыграл не задокументированный должным образом метод масштабирования заливки scaleTo (int $x [, int $y]).

Справочная информация об этой функции отсутствует, и можно лишь предположить, основываясь на опыте, что при использовании одного параметра производится одинаковое масштабирование по обеим осям. Попытайтесь сами потренироваться. Если выбрать значение большее, чем 0,04, то будет создан хорошо видимый квадрат, если меньшее — объект превратится в точку. Для получения разных цветов создается семь фреймов, и для каждого из них применяется удивительный метод multcolor ([int red [, int green [, int blue [, int a]]]]), трансформирующий цвет того элемента, для которого употреблен. Чтобы лучше понять этот метод, посмотрите документацию (
http://ru2.php.net/manual/ru/function.swfdisplayitem.multcolor.php). Далее в используемых вставках языка Action Script выясняется положение курсора мыши для привязки источника бенгальского огня и задаются правила перемещения и видимости каждого из огоньков.

Листинг 3

/* Пример 3. Бенгальский огонь */

/* Создание фильма */

$m = new SWFMovie();

/* Задаем размер фильма */

$m->setDimension(320, 240);

/* Задаем общий фон */

$m->setBackground(100, 0, 0);

$m->add(new SWFAction(

“ _quality = ‘LOW’; frames._visible = false; sparks = []; “));

/* Создаем градиент для заливки */

$g = new SWFGradient();

$g->addEntry(0, 0xff, 0xff, 0xff, 0xff);

$g->addEntry(0.1, 0xff, 0xff, 0xff, 0xff);

$g->addEntry(0.5, 0xff, 0xff, 0xff, 0x5f);

$g->addEntry(1.0, 0xff, 0xff, 0xff, 0);

/* Создаем форму и заливку в стиле радиального градиента*/$s = new SWFShape();

$f = $s->addFill($g, SWFFILL_RADIAL_GRADIENT);

/* Масштабируем */$

f->scaleTo(0.04);

/* Добавляем полученную заливку для формы */

$s->setRightFill($f);/* Выстраиваем контуры фигуры, эффект окружности достигается

заливкой с радиальным градиентом */

$s->movePenTo(-30, -30);

$s->drawLine(60, 0);

$s->drawLine(0, 60);

$s->drawLine(-60, 0);

$s->drawLine(0, -60);

// Добавляем новый спрайт («фильм в фильме»)

$p = new SWFSprite();

$p->add($s);

$p->nextFrame();

// Добавляем еще один спрайт для отображения одного из фреймов

// Каждый фрейм со своим цветом

$q = new SWFSprite();

$q->add(new SWFAction(“gotoFrame(random(7)+1); stop();”));

$i = $q->add($p);

/* Умножаем цвета элемента для каждого фрейма */$i->multColor(1.0, 1.0, 1.0);

//Переход на следующий фрейм анимации

$q->nextFrame();

$i->multColor(1.0, 0.5, 0.5);

$q->nextFrame();

$i->multColor(0.6, 1.0, 1.0);

$q->nextFrame();

$i->multColor(1.0, 0.0, 1.0);

$q->nextFrame();

$i->multColor(0.4, 0.4, 1.0);

$q->nextFrame();

$i->multColor(0.5, 0.8, 0.8);

$q->nextFrame();

$i->multColor(0.5, 0.5, 1.0);

$q->nextFrame();

// Задаем правила отображения

$p = new SWFSprite();

$i = $p->add($q);

$i->setName(‘frames’);

$p->add(new SWFAction(“

dx = _root.dx/3 + random(10)-5; dy = _root.dy/3;

x = _root._xmouse; y = _root._ymouse;

alpha = 100;

“));

 

$p->nextFrame();

$p->add(new SWFAction(“

this._x = x; this._y = y;

this._alpha = alpha;

x += dx;

y += dy;

dy += 3;

alpha -= 8;

“));

$p->nextFrame();

$p->add(new SWFAction(“prevFrame(); play();”));

$p->nextFrame();

$i = $m->add($p);

$i->setName(‘frames’);

$m->nextFrame();

$m->add(new SWFAction(“

dx = _xmouse - lastx; dy = _ymouse - lasty;

lastx = _xmouse; lasty = _ymouse;

if(++num == 11) num = 1;

if(sparks[num]) removeMovieClip(sparks[num]);

duplicateMovieClip(‘frames’, ‘char’+num, num);

sparks[num] = this[‘char’+num];

“));

$m->nextFrame();

$m->add(new SWFAction(“prevFrame(); play();”));

/* Выводим фильм в браузер */// header(‘Content-type: application/x-shockwave-flash’);

// $m->output();

?>

Бенгальский огоньВо всех приведенных примерах закомментированы последние две строки — это намек на то, что программисту вовсе не обязательно сразу же после создания выводить свое творение в браузер. Объект SWFMovie можно сохранить в виде файла на диске с помощью метода save (string filename).

Все три примера успешно выполнялись на компьютере с установленным ПО MS Windows XP, Apache 2.059, PHP 5.2.1, php_ming. dll версии 5.2.5.5. Пожалуй, из приведенных здесь материалов становится ясно, что, несмотря на всю простоту библиотеки Ming, для достижения значимых результатов с ее использованием, особенно при работе с динамическими данными, PHP-программисту все-таки придется столкнуться с языком Action Script.