Для многих программистов, использующих в работе 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]).
Листинг 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.