Flash - статьи

         

Практика: точки, системы координат, синхронизация etc.


Теперь откроем наш Flash и попробуем что-то там рисовать, в том числе аттракторы. Не будем слишком упираться в красоту, хотя, конечно, не без этого. Для начала: что может рисовать Flash? Ответ: ничего, кроме прямых. Вы в шоке? А как же, по-вашему, должна работать векторная графика? Короче, в нашем распоряжении только два метода: moveTo для перемещения в точку растра объекта MovieClip и lineTo для рисования прямой от текущей точки до другой, которая, соответственно,становится текущей. Кто помнит, все это напоминает первобытные функции рисования в Turbo Pascal или убогую "черепашку" с плоттером в клюве.

Даже рисование точки — уже кое-какая проблема, поскольку если нарисовать прямую из точки до самой себя, то ничего не будет нарисовано. Хотите нарисовать точку — нарисуйте маленький квадратик, или линию, или крестик — так будет лучше всем. Главное — вы можете рисовать отрезок дробной длины, так что крестик 0,1 на 0,1 эффективно закончится пикселем на экране.

Два возможных решения не проходят через цензуру. Первое — рисовать маленький квадратик, закрашенный с помощью BeginFill и EndFill в некоторый цвет, но с прозрачной рамкой. Работает, но по производительности — полный сакс.

Второй метод — клонировать объект типа "точка". Это вообще не работает, потому что на одном фильме может лежать только 255 объектов, каждый на своем слое. Так что много точек таким методом вы не нарисуете. Помещение символа в тот же слой будет удалять предыдущий символ. Если вы помните, как программировались старые игровые приставки, то там тоже в одной строке сканирования не могло разместиться более восьми спрайтов.

Кроме рисования точек нам понадобится преобразование координат из предметной области в условные пиксели рабочей поверхности. Это задача для школьников старших классов, так что не стану на ней останавливаться. Замечу только, что не делаю поверхность рисования динамически растягиваемой, размер подложки постоянный — 1200 х 800. Любое масштабирование объекта MovieClip можно и нужно выполнять (и так оно и будет) средствами Flash, причем с такими чудесами техники, как антиалиасинг. Не будем улучшать совершенное.

Вот как выглядит рисование простейшей системы координат

width=1200; height=800;
dx=20; dy=4;
kx=width/dx; ky=height/dy;
originX=width/20; originY=height/2;
cx=originX/kx; cy=originY/ky;


function x(x1) { return originX+x1*kx; }
function y(y1) { return originY-y1*ky; }
function mv(x1,y1) { moveTo(x(x1),y(y1)) }
function li(x1,y1) { lineTo(x(x1),y(y1)) }
function dt(x1,y1,dcl) {
   var xx=x(x1); var yy=y(y1);
   lineStyle( 1, dcl, 100 );
   moveTo(xx,yy);
   lineTo(xx+.1,yy+.1);
}
lineStyle( 1, 0x0, 35 );
moveTo(0,0); lineTo(0,height-1);
lineTo(width-1,height-1); lineTo(width-1,0);
lineTo(0,0); moveTo(0,originY); lineTo(width-1,originY);
moveTo(originX,0); lineTo(originX,height-1);


Код находится в отдельном файле coord.as и включается в первый кадр командой #include "coord.as". Имена функций нарочно имеют минимальную длину — моя фантазия подсказывает мне, что при рисовании удобно упаковывать побольше элементов в одну строку.

Теперь, чтобы проверить фишку, попробуем что-нибудь нарисовать. Построим тот же косинус… оба-на! For на 1000 итераций не работает! А все оттого, что мы беремся рисовать много точек в одном кадре — оно-то рисует, но кино не может обработать другие кадры, и все валится с ругательствами. Обходим: помещаем куски кода в разных кадрах:

1 #include "coord.as"
   i=-3;
2 dt(i,Math.cos(i),0x0); i+=0.1;
3 if (i<=3) { GotoAndPlay(2); } else { Stop(); }


Чтоб дела шли быстрее, можно fps фильма разогнать до 120-ти. Теперь все работает как часы, точечки рисуются. А вдруг можно еще упаковаться? Без проблем: во втором кадре копируем строку — то есть по входу в кадр рисуются две точки сразу. Можно записать "оптимизатор" во втором кадре таким вот образом:

cnt=0;
while ((i<=3)&&(cnt<=100)) {
   dt(i,Math.cos(i),0x0);
   i+=0.01;
   cnt++;
}




В результате наши расчеты не мешают воспроизведению остальной анимации, если таковая вдруг появится. Самый простой пример такой анимации — поле динамического текста, привязанное к переменной. Этот текст будет обновляться не чаще, чем мы будем переходить от кадра к кадру, так что это нужно периодически делать, если мы хотим отображать "бегущие счетчики", например, отрисованных точек.

Переходим к более сложным вопросам ActiveScript.


Содержание раздела