<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xml:base="http://www.flashist.ru" xmlns:dc="http://purl.org/dc/elements/1.1/">
<channel>
 <title>Чужое</title>
 <link>http://www.flashist.ru/taxonomy/term/83</link>
 <description>Представление таксономии с учетом глубины 0.</description>
 <language>ru</language>
<item>
 <title>Магия от Вострикова Михаила</title>
 <link>http://www.flashist.ru/lessons/magiya-ot-vostrikova-mikhaila</link>
 <description>&lt;p&gt;Сегодня в качестве урока выступит &lt;a href=&quot;http://www.noinimod.ru/51/?submitted=1#commentform&quot; class=&quot;bb-url&quot;&gt;найденная мною статья&lt;/a&gt; Михаила Вострикова, который, как я понял, работает в студии &lt;a href=&quot;http://dominion.ru/&quot; class=&quot;bb-url&quot;&gt;Dominion&lt;/a&gt;, у которой в свою очередь есть блог: &lt;a href=&quot;http://www.noinimod.ru&quot; class=&quot;bb-url&quot;&gt;http://www.noinimod.ru&lt;/a&gt; (прочитайте название блога задом-наперёд). А вот в этом блоге, я и нашёл статью Михаила Вострикова, в общем всё между собой связано, не иначе это заговор =)&lt;/p&gt;

&lt;p&gt;&lt;h3&gt;Магия&lt;/h3&gt;&lt;br /&gt;
Сегодня я, как автор, почти не буду участвовать в повествовательном процессе и передам брозды правления великому и могущему &lt;a href=&quot;http://ru.wikipedia.org/wiki/%D0%9A%D0%BE%D0%BF%D0%B8%D0%BF%D0%B0%D1%81%D1%82&quot; class=&quot;bb-url&quot;&gt;копипасту&lt;/a&gt; (и &lt;a href=&quot;http://lurkmore.ru/%D0%9A%D0%BE%D0%BF%D0%B8%D0%BF%D0%B0%D1%81%D1%82&quot; class=&quot;bb-url&quot;&gt;более весёлое определение&lt;/a&gt;).&lt;/p&gt;

&lt;p&gt;Итак, понеслась, ниже, почти до самого конца, будет текст Вострикова Михаила.&lt;/p&gt;

&lt;p&gt;&lt;h3&gt;Магический прототип &lt;/h3&gt;&lt;br /&gt;
Хочу рассказать про симпатичный эффект, который реализуется достаточно просто, а выглядит на пять с плюсом, особенно в связке с надлежащим окружением.&lt;/p&gt;

&lt;p&gt;Подобные эффекты обычно реализуют с помощью битмапа и комбинации фильтров на нем. Это не сложно, требуется немного фантазии и «игры» с параметрами фильтров. Но настоящие герои всегда идут в обход.&lt;/p&gt;

&lt;p&gt;Сразу объясню почему. Во-первых, подобный прототип будет использоваться в реальном проекте, где вся сцена динамически изменяется перед эффектом, и за ним будет находится много объектов. Во-вторых, требуется высокая скорость работы всей флешки. При размере сцены 1280×700 пикселей, метод с применением битмапов не имеет никаких шансов получить приемлемый FPS на среднем компьютере.&lt;/p&gt;

&lt;p&gt;Итак, задача: нужно получить светящийся шлейф от движущегося объекта, если быть точнее — от источника света. Источник может перемещаться по всей сцене, может менять свой размер, поэтому толщина шлейфа тоже должна меняться. Причем желательно, чтобы эффект мог работать как в девятой версии флеш-плеера, так и в более старых, минимально в шестой (с частичной потерей функциональности). AS3 использовать не будем — к этому есть свои предпосылки.&lt;/p&gt;

&lt;p&gt;Приступим к реализации. Сам шлейф будем рисовать программно, запоминая координаты движения объекта и используя функцию &lt;span style=&quot;font-weight:bold&quot;&gt;curveTo()&lt;/span&gt; для сглаживания траектории движения. Свечение, пожалуй, лучше сделать через &lt;span style=&quot;font-weight:bold&quot;&gt;GlowFilter()&lt;/span&gt; со средним качеством, так как симуляция свечения через многократное рисование шейпов будет медленнее. Будем писать прототип, так как он — истинное оружие пролетариата, как сказал Иван Дембицкий.&lt;/p&gt;

&lt;p&gt;&lt;pre class=&quot;bb-code-block&quot;&gt;MovieClip.prototype.Magic = function (len, w, fColor, gColor, ptr) {
// на входе:
// len - количество сегметов шлейфа
// w - начальная толщина шлейфа в пикселах
// fColor - цвет шлейфа
// gColor - цвет свечения вокруг шлейфа (Glow)
// ptr - муви-клип, за которым будет строиться магический шлеф. Если не задан, то за мышью.
  w *= .5;
  // запомним старые координаты начала шлейфа, они нам пригодятся для расчета
  // вектора движения и перпендикуляра к нему
  var oldX = this._xmouse;
  var oldY = this._ymouse;
  // используем координаты мышки, а если задан муви-клип, то его координаты
  if (ptr == undefined) {
    oldX = ptr._x;
    oldY = ptr._y;
  }
  // примерним два фильтра к клипу, в который будет рисовать шлейф.
  // BlurFilter немного размоет края шлейфа, чтобы придать реалистичности
  this.filters = new Array(
    new flash.filters.BlurFilter(2, 2, 1),
    new flash.filters.GlowFilter (gColor, 1, 25, 25, 3, 2)
  );
  // в массиве crd будем хранить текущую и все предыдущии координаты шлейфа,
  // причем их кол-во не будет превышать длинный шлейфа len
  var crd = new Array();
  // на событие перерисовки кадра &quot;повесим&quot; функцию рассчета необходимых переменных и само рисование
  this.onEnterFrame = function() {
    // создадим пустой объект, в нем будем хранить координаты
    // и дополнительные данные каждого узла шлейфа
    var o = new Object();
    // используем координаты мышки, а если задан муви-клип, то его координаты
    if (ptr == undefined) {
      o.x = this._xmouse;
      o.y = this._ymouse;
    } else {
      o.x = ptr._x;
      o.y = ptr._y;
    }
    // рассчитаем угол, равный перпендикуляру к вектору движения, сохраним его в объекте
    o.a = Math.atan2(o.y-oldY, o.x-oldX)+Math.PI*.5;
    oldX = o.x;
    oldY = o.y;
    // поместим объект в массив и обрежем массив до максимальной длины шлейфа
    crd.push(o);
    if (crd.length&amp;gt;len) {
      crd.splice(0, 1);
    }
    // поместим длину массива координат во временную переменную, она немного ускорит
    // цикл перебора массива и будет использована несколько раз
    var l = crd.length;
    // рассчитаем координаты перпендикуляров в каждом узле (с конца шлейфа к его началу),
    // причем линейно будем увеличивать толщину шлейфа до максимальной (заданной через переменную w)
    for (var i = 0; i &amp;lt; l; i++) {
      // возьмем объект из массива
      var o = crd[i];
      // k = коэффициент толщины шлейфа
      var k = w*i⁄l;
      // косинус и синус вектора движения нам нужен для рассчета координат перпендикуляров
      var cs = k*Math.cos(o.a);
      var ss = k*Math.sin(o.a);
      // собственно сам рассчет, x0 и y0 - правая сторона шлейфа, x1 и y1 - левая
      o.x0 = o.x+cs;
      o.y0 = o.y+ss;
      o.x1 = o.x-cs;
      o.y1 = o.y-ss;
      // немного уменьшим координату, дабы получить эффект &quot;огня&quot; -
      // плавного смещения всего шлейфа вверх, это добавит динамики нашему эффекту
      o.y *= .997;
    }
    // начнем рисование, используя цвет заливки, заданный на входе прототипа
    this.clear();
    this.beginFill(fColor);
    // начнем рисование с правой стороны шлейфа (набор коодинат x0 и y0), передвинем текущую позицию
    // рисования в самый хвост
    this.moveTo(crd[0].x, crd[0].y);
    // переберем массив координат с первого до предпоследнего, соединим точки с помошью сплайна
    // (кривой Безье)
    // будем использовать &quot;классический&quot; метод рисования кривых, состоящих из нескольких сегментов
    for (var i = 1; i&amp;lt;(l-1); i++) {
      this.curveTo(crd[i].x0, crd[i].y0,
      (crd[i].x0+crd[i+1].x0)*.5,
      (crd[i].y0+crd[i+1].y0)*.5);
    }
    // завершим рисование правой стороны, проведя линию до начальной координаты шлейфа
    this.lineTo(crd[l-1].x, crd[l-1].y);
    // левую половину шлейфа нарисуем аналогично, только используя второй набор рассчитаных координат
    // x1 и y1
    // чтобы рисуемая форма была корректно залита флешем, начальная и конечная координаты у обоих
    // половин должны совпадать!
    this.moveTo(crd[0].x, crd[0].y);
    for (var i = 1; i&amp;lt;(l-1); i++) {
      this.curveTo(crd[i].x1, crd[i].y1,
      (crd[i].x1+crd[i+1].x1)*.5,
      (crd[i].y1+crd[i+1].y1)*.5);
    }
    this.lineTo(crd[l-1].x, crd[l-1].y);
    // завершим рисование, форма шлейфа готова
    this.endFill();
  };
};
// Осталась самая малость — создать пустой клип под шлейф и применить к нему прототип.
// var mc = this.createEmptyMovieClip(&quot;MagicMc&quot;, 0);
// mc.Magic(20, 8, 0xFF8080, 0xCC80CC);&lt;/pre&gt;&lt;/p&gt;

&lt;p&gt;Работающий пример и архив с исходными файлами смотрите ниже.&lt;/p&gt;

&lt;p&gt;&lt;span id=&quot;flashtag_1012_container&quot;&gt;&lt;script type=&quot;text/javascript&quot;&gt;
swfobject.embedSWF(&#039;http://www.flashist.ru/files/help/magic_dominion/magic.swf&#039;, &#039;flashtag_1012&#039;, &#039;600&#039;, &#039;600&#039;, &#039;9&#039;, &#039;/sites/all/modules/flashtag/expressInstall.swf&#039;, {}, {bgcolor: &#039;#000000&#039;, menu: &#039;false&#039;}, {id: &#039;flashtag_1012&#039;});&lt;/script&gt;
&lt;div id=&quot;flashtag_1012&quot; class=&quot;flashtag flashtag_1012&quot;&gt;
&lt;p&gt;In order to view this page you need Flash Player 9+ support!&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://www.adobe.com/go/getflashplayer&quot;&gt;&lt;img src=&quot;http://www.adobe.com/images/shared/download_buttons/get_flash_player.gif&quot; alt=&quot;Get Adobe Flash player&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/span&gt;&lt;/p&gt;

&lt;p&gt;&lt;span style=&quot;font-weight:bold&quot;&gt;&lt;a href=&quot;http://www.flashist.ru/files/help/magic_dominion/magic.rar&quot; class=&quot;bb-url&quot;&gt;Исходник&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p&gt;&lt;h3&gt;P.S.:&lt;/h3&gt;&lt;br /&gt;
Не знаю, на сколько эта практика «копипастенния» приживётся на нашем сайте, к тому же, не факт, что все авторы статей будут рады такому копированию, благо «добро» от Михаила я получил, что уже хорошо.&lt;/p&gt;

&lt;p&gt;Кстати, обязательно взгляните на &lt;a href=&quot;http://www.noinimod.ru/2/&quot; class=&quot;bb-url&quot;&gt;урок Михаила о стёрке в Flash&lt;/a&gt;, совсем недавно он меня сильно выручил.&lt;/p&gt;</description>
 <comments>http://www.flashist.ru/lessons/magiya-ot-vostrikova-mikhaila#comments</comments>
 <category domain="http://www.flashist.ru/taxonomy/term/15">Исходники</category>
 <category domain="http://www.flashist.ru/taxonomy/term/16">Уроки</category>
 <category domain="http://www.flashist.ru/taxonomy/term/83">Чужое</category>
 <pubDate>Wed, 04 Mar 2009 03:44:56 +0300</pubDate>
 <dc:creator>admin</dc:creator>
 <guid isPermaLink="false">151 at http://www.flashist.ru</guid>
</item>
</channel>
</rss>
