Основные понятия

Официальные руководства по любому языку начинаются с обзора — «overview». В нем описыва-ется история языка, его назначение и, главное, раскрываются все ключевые понятия и основополагающие концепции. Обзор необходим, чтобы читатель, приступая к изучению частных вопросов, имел пусть примитивный, но целостный взгляд на язык. Кроме того, практически невозможно описать язык полностью последовательно, не используя в примерах еще не рассмотренных элементов: слишком тесно переплетаются многие понятия (особенно это актуально в случае Action-Script, структуру которого вряд ли можно назвать стройной).

ЕСМА-262 как основа ActionScript
Впервые язык сценариев появился в четвертой версии Flash (до этого в программе имелось всего несколько скриптовых команд, предназначенных для управления временной шкалой и создания кнопок). Был он достаточно нелепым и относительно слабым, поэтому и жить ему пришлось не очень долго. Разработчики компании Macromedia, создавая Flash 5, приняли решение ввести в свое детище действительно полноценный язык сценариев, в котором бы существовали объекты и классы, типы данных и операторы — в общем, все те элементы, к использованию которых привыкли профессиональные программисты.


Однако они не стали проектировать его с чистого листа. Чтобы облегчить освоение ActionScript специалистами, имеющими опыт программирования для Web, было решено сделать его предельно похожим на JavaScript — скриптовый язык, предназначенный для написания выполняющихся в браузере сценариев. Насколько правильным было это решение, судить сложно, так как Web-скрипты и ActionScript выполняют все-таки достаточно разные роли.

Так или иначе, но в основу изучаемого нами языка был положен стандарт ЕСМА-262 (ECMAScript), базирующийся, в частности, на JavaScript.

История стандарта ECMAScript берет свое начало со второго поколения браузера Navigator компании Netscape, в котором появился скриптовый язык — прародитель современного JavaScript.

Новая технология оказалась весьма эффективной, поэтому вскоре она была внедрена и в браузер компании Microsoft Internet Explorer версии 3.0 в форме языка JScript. Будучи ярыми конкурентами, Microsoft и Netscape спешили дополнить свои версии языка все новыми и новыми возможностями, что в конечном итоге привело к появлению проблемы совместимости браузеров. Решить их можно было, стандартизировав JavaScript. Работа над выработкой стандарта для Web-скриптов была начата в 1996 г.


под эгидой Европейской ассоциации производителей компьютеров (ЕСМА), аббревиатура которой вошла в его название. Первое его издание было утверждено генеральной ассамблеей ЕСМА в июне 1997 г.

В настоящий момент действует уже третья версия стандарта ЕСМА-262 (цифра в названии взята из его официального номера как международного стандарта — ISO/IEC 16262), Она была принята в декабре 1999 г. Работа над ECMAScript продолжается, так что вполне можно ожидать появления его новых версий уже в ближайшее время.

Существует неофициальная версия ECMAScript четвертого поколения от компании Netscape. ActionScript весьма далек от соответствия ей, хотя очень многие идеи ActionScript 2.0 взяты из нее.

Что представляет собой язык ECMAScript? Это объектно-ориентированный язык, рассчитанный на то, чтобы служить основой для Web-скриптов. Он носит достаточно обобщенный характер, и в спецификации ЕСМА-262 вы не найдете ни одного слова о том, как, например, отображать нуж-ный текст в строке состояния браузера. Тут описываются только ключевые понятия языка без детализации того, что при помощи них можно реализовать.

Изучить ActionScript с помощью спецификации ECMAScript вряд ли удастся.


Из нее можно почерпнуть сведения только относительно «фундамента» языка, понимание которого хоть и важно для практики, но далеко не первостепенно. Тем более, что ActionScript имеет достаточно много несоответствий ЕСМА-262. Это связано как с тем, что разработчикам приходится экономить в размере проигрывателя и обеспечивать обратную совместимость, так и с тем, что ActionScript попросту не относится к профилю ECMAScript — скриптовым языкам браузеров. Однако, когда вы изучите ActionScript хотя бы на среднем уровне, вам будет достаточно интересно ознакомиться с ЕСМА-262, чтобы понять глубинную сущность хорошо известных понятий.

До определенной степени ActionScript совместим с JavaScript. Так, если созданная вами программа содержит только элементы, описание которых имеется в ЕСМА-262, то она одинаково успешно может быть выполнена как во Flash-плейере, так и в браузере. Изложение многих фундаментальных вопросов ActionScript в этой книге ведется в соответствии с тем, как они поясняются стандартом ЕСМА-262. По этой причине терминология и рубрикация не всегда соответствует той, которая приведена в официальном словаре ActionScript. Это необходимо, чтобы разговор наш был максимально последовательным и технически точным. Отклонения ActionScript от ЕСМА-262, представляющие теоретический интерес, мы будем обязательно обсуждать.

Скачать спецификацию ECMAScript в формате pdf-книги вы можете по адресу:

http://www.ecma.ch/ecmal/STAND/ECMA-262.htm. Четвертое издание ECMAScript от Netscape располагается по адресу: http://www.mozilla.org/js/language/Edition4.pdf.

ActionScript как скриптовый язык Flash-плейера
Под скриптовым языком в общем случае понимается язык программирования, позволяющий динамически использовать инструменты (настраивать их или автоматизировать работу с ними) какой-то существующей системы. Зачастую скрипты выступают аналогом пользовательского интерфейса, дублируя возможности по манипулированию программой «вручную». Отчасти это относится и к ActionScript: например, качество отображения фильма можно задать как используя команды контекстного меню плейера, так и обратившись к специальному свойству quality. Впрочем, скриптовые команды могут и не и меть отображения и меню и на панелях инструментов программы. В случае ActionScript таким командам соответствует подавляющее большинство структур языка.

Одна из главных особенностей скриптового языка заключается в том, что с его помощью вы можете указать системе, что нужно сделать, не объясняя, как. Вы управляете готовыми объектами, воспринимая их как черные ящики. Вы знаете, за что каждый из них отвечает, но их реализация, то, как они работают, от вас скрыта. И в этом нет ничего плохого: вы же можете использовать компьютер, совершенно не разбираясь в транзисторах, Разработка игры при помощи одного из универсальных языков программирования потребовала бы от вас колоссальных познаний в области алгоритмов, технологий и аппаратных средств. Для ее реализации на Flash нам понадобится уметь рисовать и знать с десяток методов ActionScript. Однако это не означает, что внутренняя структура второй игры окажется проще первой. Нет, скорее даже наоборот. Просто вся черновая работа по низкоуровневому кодированию выполнена программистами Macromedia, изготовившими для вас простые и удобные инструменты. Использование этих инструментов не, требует особой
подготовки, поэтому ActionScript доступен и для непрофессионалов. Требование доступности лежит в основе и того факта, что ActionScript по сравнению с С или Java язык достаточно нестрогий.

Любой скриптовый язык понимается только той системой, для которой он был создан. ActionScript является «родным» языком скорее даже не для Flash, как можно было бы сразу подумать, а для Flash Player —скромной программы (она занимает всего 800 Кб), позволяющей просматривать swf-фильмы. Сам же Flash — это только среда разработки. Это подобно тому, как код JavaScriptможно написать и в Блокноте, хотя его «родной» программой является браузер. Создать swf-анимацию можно во многих программах (например, Adobe Illustrator), так как swf-формат является открытым еще с 1998 г. Однако просмотреть ее удастся, только установив Flash-плейер (Macromedia не желает сделать его код общедоступным из соображений сохранения единого стандарта для swf-файлов).

Каждой версии Flash соответствует свой плейер. Невозможно проиграть фильм, созданный в формате Flash MX 2004, при помощи Flash Player 5. Наоборот, плейер седьмого издания программы может просматривать swf-файлы всех версий. Обратная совместимость существует и в самом ActionScript: программы Flash 4 будут отлично работать и при интерпретации их в плейере Flash MX 2004. В тексте сценариев наряду с действующими элементами языка вы можете использовать и устаревшие (deprecated) «слова» (так, многие флешеры «старой закалки» предпочитают применять в качестве логического «И» оператор and (Flash 4, устарел во Flash 5), а не &&). Однако такую практику нельзя назвать хорошей, так как устаревшие элементы языка обычно менее эффективны, чем их более новые аналоги (иначе зачем их понадобилось бы заменять?).

Несмотря на малый размер плейера, возможности ActionScript огромны. Лучшим доказательством этого может служить объем данной книги — будучи представленной в виде текстового файла, она заняла бы куда больше дискового пространства, чем требуется для установки плейера. Остается только удивляться, как разработчикам из Macromedia удалось сделать Flash столь многогранной системой, будучи жестко ограниченными лимитом на размер плейера.

Интерпретатор ActionScript. Flash-ассемблер
Языки программирования по степени близости к машинному языку компьютера можно разделить на низкоуровневые и высокоуровневые. Первые, называемые также ассемблерами (от английского assembler — сборщик), оперируют понятиями, являющимися отображением реальных процессом, происходящих при вычислениях. «Слов» в ассемблере обычно немного, так как команд на уровне физических устройств мало. Программы на ассемблере достаточно громоздкие и весьма сложные для понимания. Однако за счет близости к машинному языку они выполняются гораздо быстрее кода на языке высокого уровня, поэтому их используют там, где принципиально важна производительность.

Языки высокого уровня появились позже ассемблера с целью упростить программирование, сделать его более абстрактным. Они оперируют понятиями, напрямую не связанными с протекающими на уровне физических устройств процессами, для реализации которых на ассемблере зачастую пришлось бы написать целую программу. Например, чтобы, создавая алгоритм на языке высокого уровня, сложить переменные а и b, достаточно набрать: а + b. На языке ассемблера для этого нужно добавить в стек первую переменную, прочитать ее значение, добавить в стек вторую переменную, прочитать ее значение, сложить значения в стеке. Пять шагов вместо одного!

Языки высокого уровня далеки от машинных языков, поэтому программы, написанные на них, не могут быть выполнены компьютером непосредственно. Перед исполнением они должны быть переведены в понятную для машины форму, для чего производится их трансляция либо на язык ассемблера, либо сразу в машинный код. В зависимости от того, когда это делается, языки программирования делятся на интерпретируемые и компилируемые. Упрощая, можно сказать, что в случае компилируемых языков перевод программы в понятную для машины форму осуществляется сразу же по завершении ее создания. Программа же на интерпретируемом языке транслируется в машинные коды лишь при ее выполнении. Делается это следующим образом. Каждой команде интерпретируемого языка в коде интерпретатора соответствует подпрограмма, созданная с использованием поддерживаемых аппаратной частью компьютера средств. Когда эта команда встречается в коде, связанная с ней подпрограмма запускается и необходимые действия выполняются. Так как особенности реализации интерпретируемых языков скрыты, кажется, что имеющиеся в них команды проделываются напрямую компьютером. Поэтому соответствующие интерпретаторы называют виртуальными компьютерами (или, чаще, виртуальными машинами). Не будет ошибкой называть Flash-плейер виртуальной машиной ActionScript.Обычно универсальные языки программирования являются компилируемыми, а скриптовые языки — интерпретируемыми (хотя есть и исключения, например Java).

ActionScript является языком интерпретируемым. Однако его интерпретатор слишком ограничен необходимостью экономить в весе проигрывателя и производительностью компьютеров, чтобы он был способен понимать код в том виде, в котором вы его создаете. Уж очень много слов содержит ActionScript (около 500), чтобы значение каждого из них могло быть правильно истолковано заприемлемое время программой в несколько сот килобайт. Поэтому при экспорте swf-файла коды ActionScript переводятся в более простую для понимания компьютером форму байт-кодов или Flash-ассемблера. При этом подобно тому, как сложная речь может быть записана всего тремя десятками букв, все понятия языка описываются при помощи небольшого количества команд низкого уровня.

// Программа на ActionScript
var a = 3; // Создается переменная а со значением 3
var b = 2; // Создается переменная b со значением 2
var с = (а + b); // Создается переменная с, равная сумме а и b
trace (с); // Значение с выводится на панель Output
// Программа после трансляции во Flash-ассемблер
constants 'a', 'b', 'с' // Прописываются имена использующихся переменных
push 'a', 3 //В стек добавляются имя переменной и 5й значение
varequals // Команда создает переменную
push 'b', 2 // Две нижележащие строки аналогичны двум предыдущим
varequals
push 'с', 'а' // Б стек добавляются имена двух переменных: с и а
getVariable // Читается значение переменной а - первого слагаемого
push 'b' //В стек добавляется имя переменной b — второго слагаемого
getVariable // Читается значение переменной b
add // а и b складываются
varequals // Создается переменная с
push 'с' // Имя переменной добавляется в стек
getVariable // Читается значение переменной с
trace // Значение с выводится в окно Output
end // Выполнение программы завершается

Ничего общего с реальным машинным ассемблером Flash-ассемблер не имеет. Он является просто удобной для восприятия плейером формой ActionScript.

Особой роли на практике байт-коды не играют. Однако иметь представление о Flash-ассемблере нужно, так как, обратившись к транслированной в него программе, можно много узнать о внутренней структуре ActionScript. Например, можно выяснить, имеются ли какие-то различия при провозглашении переменной с использованием слова var и без него. В этой книге мы будем использовать байт-коды при необходимости узнать, как реализована та или иная структура.

Генерируемый транслятором Flash ассемблер является несколько избыточным. Если важна скорость вычислений, его стоит оптимизировать, удалив все лишние команды. Служит для этого специальная утилита Flasm.

Получить текст ActionScript-программы на Flash-ассемблере можно, обратившись к специальным программам — декомпиляторам, например Action Script Viewer от компании Manitu Group. Эти программы позволяют восстанавливать из swf-фильмов некоторое подобие исходных Па-файлов. Используя их, можно изучить код понравившегося эффекта, получить доступ к графике и звуку.

Символы и экземпляры символов
Современные версии Flash выросли из маленькой (чуть более мегабайта) программы FutureSplash Animator, купленной в 1996 г. компанией Macromedia. Эта программа могла создавать весьма компактные векторные анимации за счет нескольких оригинальных решений. Одним из них были символы (symbols) — графические объекты, которые хранились в библиотеке и могли быть использованы многократно без заметного увеличения в размере конечного файла. Идея символов чем-то повторяла принципы передачи текстовой информации. Вы никогда не задумывались, почему тексты занимают так мало места, хотя буквы в них латаются достаточно сложными графическими объектами? Дело в том, что в текстовых файлах сохраняются не буквы, а лишь их порядковые номера — а подстановку визуальных образов осуществляет сам компьютер исходя из установленных на нем шрифтов. Экземпляры символов также являются не более чем ссылкой на объект в библиотеке. Размер Шрифта текста, его цвет и начертание можно легко изменить, Экземпляры символов во Flash также могут отличаться друг от друга и от родительского объекта в библиотеке. Правда, изменять можно лишь наиболее общие свойства — прозрачность, размер или угол поворота — но любое редактирование графической составляющей экземпляра невозможно без соответствующих корректив самого символа. Символы уже первых версий Flash имели собственную временную диаграмму. Это позволяло создавать анимации со сколь угодно большой степенью вложенности, что чрезвычайно удобно. Так, например, нарисовав клип с ногами, делающими один шаг, и поместив его затем в равномерно перемещающийся клип с изображением человека, можно создать полную иллюзию ходьбы. Символы достаточно независимы от основной временной шкалы, и их даже можно считать отдельными swf-фильмами, вложенными в фильм текущий.

В современных версиях Flash имеются три основных типа символов: MovieClip (Клип), Button (Кнопка), Graph (Графика). Все они являются ближайшими родственниками, так как прародитель у них один — символ FutureSplash. И если причины появления в системе клипов и кнопок достаточно очевидны, то зачем необходим тип Graph? Нет, он нужен не для хранения статичной графики, как принято писать в упрощенных курсах Flash. Символ Graph имеет такую же временную шкалу, как и MovieClip, поэтому на его базе могут создаваться и анимации. Их отличие гораздо тоньше и заключается в том, что MovieClip может работать с ActionScript, a Graph — нет. А так как проверка различного рода программных событий, которая проводится по умолчанию в случае клипов, требует затрат процессорных ресурсов и оперативной памяти, то хорошей практикой является сохранение всех символов, экземпляры которых не управляются сценариями ActionScript, в виде символов типа Graph.

Формально к символам относятся звуки, шрифты, изображения, видеоклипы, встроенные в фильм.

Создаются экземпляры символов чаще всего простым перетаскиванием их из библиотеки. В случае клипов для выполнения этой работы можно использовать специальный метод ActionScript attachMovie().

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

В ActionScript имеется значительное число методов и свойств, позволяющих управлять видом и поведением экземпляров клипов и кнопок. Чтобы их использовать, необходимо, набрав имя экземпляра, поставить точку. Оператор точки указывает интерпретатору, что нужно обратиться к внутренней структуре объекта. Точнее, точка является оператором доступа к методам и свойствам объекта (что это такое, мы поговорим ниже). Введя после точки нужный метод или свойство и определив требуемые параметры, вы получите желаемый результат.

Приведем пример. Нарисуйте круг и, переведя его в клип (), назовите полученный экземплярименем big_round. На тот же кадр, где находится экземпляр, «повесьте» следующий код:

big_round._xscale=1000;
big_round._yscale=1000;

Тестируйте фильм ( + ). Вы увидите, что нарисованный вами кружок увеличился в 10 раз.

Особым объектом является главная временная диаграмма фильма. Хотя на первый взгляд она кажется более «важным» и привилегированным элементом, чем расположенный на ней экземпляр клипа, на самом деле они очень близки. Главная диаграмма (или главный холст, как ее еще принято называть) является, по сути, обычным клипом. К ней применимы практически все методы, события и свойства класса MovieClip точно так же, как и к экземплярам клипов. Из отличий клипов L root (так обозначается в ActionScript главная временная шкала) можно назвать особенности системы координат, невозможность удаления или дублирования root, неприменимость к ней кнопочных событий.

Клипы являются ключевыми элементами фильмов Flash. Язык ActionScript был создан, прежде всего, как средство управления клипами. Тип movieclip — это особый, привилегированный тип данных, который достаточно сильно отличается от объектов данных, принадлежащих к «простым» типам вроде Object. Специфике и возможностям клипов мы посвятим целую главу. А на начальном этапе нам будет вполне достаточно приведенных в этом подразделе сведений и, главное, интуиции.

Переменные
Для чего было введено понятие переменной в математику? Очевидно, для того чтобы вычисления можно было проводить в общем виде, а полученный результат — формулу — применять в будущем для быстрого решения похожих задач. Переменная является своего рода контейнером, оперируя с которым совсем не обязательно задумываться о его содержимом. Похожее назначение имеют переменные и в программировании. Используя их, можно писать код, имеющий универсальный характер, динамически реагирующий на изменение параметров или свойств.

В ActionScript переменные создаются по следующей схеме:

var name = value,
где var — ключевое слово, объявляющее переменную (не является обязательным); name — ее имя; = — оператор присваивания; value — присваиваемое значение. Например:

var а="Новая переменная"; // Вот и готова новая переменная...

В виде переменной может быть сохранен совершенно любой объект: число, строка, массив, функция, экземпляр клипа. Чтобы затем получить доступ к содержимому переменной, достаточно просто набрать ее имя:

trace(а); // Выводит: Новая переменная

Переопределение переменной осуществляется простым присваиванием ей нового значения. По этой причине важно следить, чтобы на одной временной шкале не имелось двух переменных с одинаковым именем.

a=3; // Переменная поменяла значение

Переменной можно присвоить и некоторое выражение. При ее вызове оно будет вычисляться, и непосредственно будет возвращаться не оно, а его значение.

a=3 + 5;trace(a); // Возвращает 8, а не 3+5

Переменные бывают локальными и глобальными. Первые «видны» только в границах данной временной шкалы или функции, вторые же доступны из любой области фильма.

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

var argl=0;
var cotl=Math.cos(argl)/Math.sin(argl);
var arg2=l;
var cot2=Math.cos(arg2)/Math.sin(arg2);
var arg3=2;
var cot3=Math.cos(arg3)/Math.sin(arg3);
trace(cotl); // Выводит: Infinity (бесконечность)
trace(cot2); // Выводит: 0.642092615934331
trace(cot3); // Выводит: -0.457657554360286

Гораздо лучше для решения таких задач применять функции — обособленные участки кода, которые могут быть выполнены многократно. Аналогично математике, функции в ActionScript имеют имя и могут принимать аргументы. Чтобы вызвать функцию, достаточно набрать ее имя, указав в скобках аргументов необходимые параметры:

function cot (arg) {
return Math.cos(arg) /Math.sin(arg);
}
trace(cot(0)); // Выводит: Infinity (бесконечность)
trace(cot(l)); // Выводит: 0.642092615934331
trace(cot(2)); // Выводит: -0.457657554360286
Задаются функции по следующей схеме:
function name (arguments){statements},

где function — ключевое слово, инициализирующее функцию; name — ее имя (не должно совпадать с существующими функциями или переменными); arguments — аргументы (прописываются через запятую в круглых скобках); statements — выражения, которые следует выполнить при вызове функции (они должны быть объединены в блок при помощи фигурных скобок). Завершать определение функции точкой с запятой не нужно.

Помимо приведенной, существует и другая форма задания функций, использующаяся в основном для создания обработчиков событий:

var cot=function(arg) {
return Math.cos(arg)/Math.sin(arg);
};
trace(cot(0)); // Выводит: Infinity (бесконечность)

функции — это чрезвычайно мощный инструмент, значительно облегчающий создание программ.

Можно утверждать, что нельзя написать неэлементарный алгоритм, не используя функций. Вес проекты, над которыми мы будем работать в рамках этой книги, будут содержать функции, поэтому практику их применения мы отработаем во всех тонкостях.

Условные предложения
В повседневной жизни наше поведение определяется теми или иными условиями. Если идет дождь — мы сидим дома, если светит солнце — идем гулять. Проверка всевозможных «если» важна и в программировании. Практически любой алгоритм требует анализа ряда условий и выполнения, исходя из них, различных действий. Такого рода проверка проводится при помощи специальных условных предложений. Наиболее важным условным предложением является if (английское «если»). Его задание подобно определению функций: вначале пишется ключевое слово, далее в круглых скобках дается условие, затем в блоке из фигурных скобок прописываются выражения, которые должны быть выполнены, если условие окажется истинным. Например:

var a=4;
var b=5;
if(a trace(a*b); // Выводит: 20 (условие а }

Если условие в круглых скобках предложения if окажется невыполненным, то код в блоке {} просто пропустится,

Для задания условий применяются специальные операторы сравнения: < (меньше), > (больше), ≤
(меньше или равно), ≥ (больше или равно), == (равно), != (не равно). Из них особенно внимательно стоит относиться к заданию оператора равенства: одна из самых распространенных ошибок связана с использованием вместо него оператора присваивания (= вместо ==).

Одновременно можно проверять несколько условий. Для этого нужно использовать оператор логического И (&&) — если должны выполниться все условия, или же оператор логического ИЛИ (||) — если верным должно оказаться хотя бы одно Условие. Например:

var a = 4;
var b = 5;
if (a trace(a*b); // Выводит: 20 (оказались верными все три
// условия — а меньше Ь, а и b являются числами)
}

Иногда необходимо выполнить одну группу действий, если некоторое условие выполняется, и другую, если оно ложно. В таких случаях наиболее рационально использовать предложение else (от английского «иначе»). Например:

var a = 5;
var b = 5;
if (a trace (a*b);
} else {
trace ("Error!!!");
} // Выводит: Error!!! (условие a
Предложению else обязательно должно предшествовать предложение if (точнее, else — это необязательная часть предложения else—if).

Завершать код условных предложений точкой с запятой не нужно.

Циклы
Циклы — это одни из ключевых элементов любого языка программирования. В общем случае они предназначены для множественного выполнения некоторой группы действий, заключенных в ихблок. В ActionScript существуют четыре вида циклических предложений: while, do—while, for и for—in.

Наиболее простой тип цикла — while. Его синтаксис:

while(условие){
выражения }

Как вы можете заметить, цикл while очень схож с предложением if с тем отличием, что последний «прокручивается» только один раз, a while — до тех пор, пока выполняется условие в его скобках.

Например, чтобы вывести в панель Output числа от 0 до 50, необходимо набрать следующий код:

var i=0; // Итератор или счетчик цикла.
while (i<=50) { // Проверочное условие. Если оно истинно — цикл
// продолжает работу.
trace (i); // Выводит: 0,1,2... 50
i++; // Модификация
}

Для изменения переменной цикла на единицу часто используются операторы инкрементирования и декрементирования: ++ и —. Они позволяют не только сокращать код программы, но и ускорять ее выполнение.

Очень важно следить за правильностью задания переменной условия, так как, например, забыв в приведенном примере прописать инкрементирование i, вы сделаете цикл бесконечным, что приведет к сбою в работе программы.

Самым распространенным на практике является цикл for. Его синтаксис:

for(инициализация; условие; модификация){
выражения
}

В принципе, цикл for является тем же while, но только с упрощенным синтаксисом. Поэтому, задавая переменную инициализации, нужно следовать всем правилам для «настоящих» переменных (в частности, использовать слово var). Модификация, вопреки распространенному мнению, может быть любой и не ограничивается инкрементированием и декрементированием;

var n=0;
for(var i=0; i<5; i+=0.1) {
trace(n); // Последней из выведенных цифр является 50
n++;
}

Частой ошибкой при использовании цикла for является то, что предложения в его заголовке разделяют запятыми, а не точками с запятой. Запомните эту тонкость и при проблеме с циклом в первую очередь проверяйте ее выполнение.

Массивы
В программировании часто приходится работать с большим количеством однотипных объектов, применяя к ним одинаковые операции. В таких случаях крайне удобно организовывать их в массивы.

Что такое массив? Это упорядоченное множество данных, каждый элемент которого имеет уникальный номер — индекс (или несколько индексов). Математический аналог массива — это матрица (прямоугольная таблица, содержащая группу объектов). В общем, никакой разницы между понятиями матрицы и массива нет. Просто первый термин распространен в науке, второй же в ос-новном в электронике и программировании.

Тем, кто не силен в математике, можно посоветовать представить массив как шкаф с ящиками. В каждом ящике может лежать любой предмет, и совсем не обязательно для его извлечения говорить; «Достань книгу «ActionScript» из шкафа». Достаточно сказать:

Принеси книгу, хранящуюся в третьем ящике», Очевидно, что во втором случае найти необходимый предмет будет легче, чем в первом.

Массив — это объект специального класса. Поэтому создать его можно, обратившись к оператору new:

var arr=new Array ();

Однако подобная запись используется редко, так как выполнить ту же задачу можно и проще. Для этого достаточно набрать пару квадратных скобок (задать литерал массива);

var arr=[];

Если вы точно знаете, сколько элементов будет содержать массив, то в скобках конструктора пропишите соответствующее число, При этом будет создан пустой массив нужной размерности:

var arr = new Аrrау(ЗЗ);

Заполнить массив можно сразу при его создании. Для этого в скобки функции конструктора (или в скобки литерала) следует ввести через запятую необходимые данные. В качестве последних могут выступать совершенно любые объекты: цифры, строки, клипы, функции и даже другие массивы. В этом отношении элементы массивов очень схожи с переменными (более того, массив можно понимать как совокупность переменных).

var arr=new Array(2,Math.random О, ["Прянет","Пока"]);
var arr1=[2,Math.random О, ["Привет","Пока"]];
trace(arr1); // Выводит: 2,0.328608815558255,Привет,Пока

Чтобы прочитать значение элемента, нужно написать имя массива и ввести квадратные скобки с порядковым номером интересующего «ящика». При этом следует учитывать, что отсчет элементов массива в ActionScript ведется с нуля. Это означает, что индексом первого элемента будет 0, второго — 1 и т. д. Эта особенность достаточно необычна для новичков, и ее необходимо твердо усвоить во избежание ошибок в дальнейшем.

аrr=[2,4,8,16];
trace(Arr[0]); // Выводит: 2
trace(Arr[3]); // Выводит: 8
trace(Arr[5]); // Выводит: undefined

При обращении к несуществующему элементу массива ActionScript возвращает системную константу undefined (не определен). Это очень удобно, так как во многих языках программирования в подобной ситуации произошел бы сбой или, что еще хуже, были бы возвращены данные, не принадлежащие массиву.

Заполнить массив возможно и вне конструктора, формируя каждый элемент по отдельности (при этом важно не забыть создать пустой массив). Для этого следует, обратившись к ячейке, просто присвоить ей нужное значение:

var arr=["Привет","Пока" ,"!!!"];
var arr1=[];
аrr1[0]="Привет";
аrr1[1]="Пока";
arr1[4]="!!!"trace(arr); // Выводит: Привет,Пока,!!!
trace(arrl) ; // Выводит: Привет, Пока, undefined, undefined, !!!

В том случае, если вы присвоите некоторую величину элементу, индекс которого больше текущей длины массива, то последний будет просто увеличен до необходимых размеров (см. пример выше).

Так как элементы массивов по свойствам схожи с переменными, то для того, чтобы изменить хранимую ячейкой величину, достаточно просто сделать переопределение:

var arr=["Привет","Пока","!!!"];
аrr[1]="Еще раз привет";
trace(arr); // Выводит: Привет,Еще раз привет,!!!

Объектная модель ActionScript
ActionScript, как и большинство современных языков, является объектно-ориентированным. Эта его особенность очень важна для практики, так как она позволяет решать многие важные задачи с минимальными усилиями. В этой книге мы уделим большое внимание объектноориентированному программированию во Flash. А пока рассмотрим лишь основные, необходимые для четкого понимания следующих глав вопросы.

Объектно-ориентированное программирование — это сравнительно молодая концепция, получившая широкое распространение только с середины 1980-х гг. с разработкой таких языков, как Smalltalk, C++ и Object Pascal. Ее появление было связано с необходимостью оптимизации процесса разработки программного обеспечения, которое к этому времени стало слишком сложным для традиционного подхода (который требовал, например, переработки всей программы при обнаружении ошибки водном из модулей). По сути объектно-ориентированный подход к программированию сводится к повышению интеллектуальности методов и средств общения с компьютером за счет придания им некоторых черт человеческого восприятия мира.

Основным понятием объектно-ориентированного программирования является объект. Объект — это унифицированное представление абстрактного понятия реального мира. Сложное определение? Забудьте его. В программировании важнее понимание того, что любой объект — это структура данных, являющаяся множеством свойств и методов (проще говоря, переменных и функций).

Несколько объектов, обладающих одинаковыми свойствами, образуют класс. Зачем необходимо вводить это понятие? Попробуем объяснить это на примере. Представьте, что вы создаете «осеннюю» заставку, на которой падают разные виды листьев. Они имеют различный вид, но их движение описывается одним и тем же законом. Было бы не совсем рационально создавать для каждого из листиков отдельный код. Гораздо лучше просто указать, что двигаться данный объект должен по принципам, описанным ранее для листьев всех типов. Для этого нарисованный графический объект должен быть зарегистрирован как экземпляр соответствующего класса. Подобный подход дает значительную экономию, как времени создания программы, так и ее размера. По сути, класс представляет собой шаблон, на основании которого задаются как собственные, так и наследуемые компоненты объекта.

В ActionScript имеются и встроенные объекты, и классы. Первые существуют в единственном экземпляре и являются не более чем удобной формой хранения объединенных одной тематикой функций и констант. В качестве примера можно привести объект Math, методами которого являются синус, косинус, корень и другие математические функции. В отличие от объектов, классы могут порождать экземпляры. Так, вы можете создать несколько отличных друг от друга клипов, которые будут наследовать все характерные для класса MovieClip методы и свойства — gotoAnd-Play(), _alpha, _width и т. д.Чтобы создать экземпляр встроенного класса (проще говоря — объект), нужно использовать оператор new и функцию-конструктор, с помощью которой он будет инициализирован:

var arr=new Array (); // Так создается новый массив

Исключение представляют классы MovieClip, ButtonVideo и TextField, объекты которых обычно создаются «вручную».

Еще одним важным понятием объектно-ориентирован но го программирования является свойство.

Свойства есть именованные контейнеры данных, связанные с объектом. Они являются, по сути, переменными и могут содержать данные любого вида: строки, числа, булевы величины, клипы, функции и др. Получить доступ к некоторому свойству можно, используя оператор точки (альтернативный оператор доступа к свойствам «[]» мы рассмотрим немного позже). Например:

trace (_rocc._visible); // Выводит "true" - кгмг, _root видимый

Точечный синтаксис является достаточно трудным для новичков. Чтобы его понять, представляйте объект в виде закрытого ящика с методами и свойствами. Оператор же точки позволяет открыть этот ящик, получить доступ к его внутренней структуре. Кстати, вложенный клип также является свойством клипа более высокого уровня, поэтому, чтобы управлять им, к нему нужно обратиться через точку.

Свойства могут быть встроенными и пользовательскими. Никаких принципиальных отличий между ними не существует. Примеры встроенных свойств: _rotation класса MovieClip — отвечает за угол поворота клипа; enabled класса Button — определяет, будет ли кнопка действующей; length класса Array— хранит длину массива и т. д.

Объекту может быть присвоено новое свойство. Например, чтобы указать, что некоторый клип mov создан программно, пишем:

mov.prog=true;
trace (mov.prog); // Выводит "true"

В ActionScript 2.0 классы разделились на динамические и статичные. Основное их отличие заключается в том, что объекту динамического класса можно присвоить новое свойство в процессе проигрывания фильма. Если же попытаться сделать это по отношению к объекту статичного класса, то при компиляции возникнет сбой. Большинство классов в ActionScript статичны. К динамическим относятся MovieClip, Button, TextField, Object, Array.

Ключевым понятием объектно-ориентированного программирования является метод. Методы — это функции, связанные с объектом и используемые для выполнения определенных задач или изменения свойств. Например, метод gotoAndPlay() класса MovieClip предназначен для перевода воспроизводящей головки на нужный кадр, метод setVolume() класса Sound — для изменения интенсивности звука. Являясь частью внутренней структуры объекта, методы, подобно свойствам, вызываются с использованием оператора точки. С другой стороны, любой метод — это функция, поэтому в нем должен присутствовать соответствующий оператор вызова (). Пример:

ball.gotoAndPlay(1); // Клип ball проиграется с первого кадра

В ActionScript метод объекта — это свойство, значением которого является некоторая функция.

Подобно свойствам, можно создавать и пользовательские методы. Как это делается, мы обсудим в одном из ближайших проектов.

Помимо методов объектов и классов, в ActionScript имеются глобальные функции. В отличие от функций обычных, они «видны* из любой точки фильма и не могут быть изменены или удалены.Обычно глобальные функции предназначены для выполнения каких-то наиболее общих задач. Например, уже знакомая нам trace() выводит значение переданного ей аргумента в панель Output, функция getURL() позволяет открывать в браузере нужную страницу и т. д. Некоторые функции дублируют методы клипов (в частности, существует как метод gotoAndPlay(), так и аналогичная ему функция). Впрочем, их наличие обусловлено не столько практической необходимостью, сколько требованием совместимости с более ранними версиями Flash.

Важной идеей объектно-ориентированного программирования является наследование. Так, если конструктору класса присущи некоторые методы и свойства, то они будут характерны и для всех его экземпляров. При этом каждый экземпляр может обладать индивидуальными атрибутами.

Класс может порождать другой класс, который будет наследовать все его методы и свойства. Наследуемые свойства и методы в ActionScript хранятся в особом свойстве конструктора класса, называемом прототипом (prototype). Если вы хотите, чтобы, например, некоторый метод move() был присущ всем объектам класса MovieClip, то вы не можете сохранить его непосредственно в конструкторе класса:

MovieClip.move=move; // Неверно!
// Наследования метода move происходить не будет

Метод должен быть сохранен в прототипе конструктора:

MovieClip.prototype.move=move; // Верно. Теперь метод move() стал
// "родным" для всех клипов

При обращении к свойству объекта интерпретатор в первую очередь проверяет, имеется ли компонент с таким именем у самого объекта. Если нужного свойства не обнаруживается, просматривается прототип конструктора класса, к которому относится объект. Если и там нет необходимого элемента, то изучается прототип прототипа — и так до тех пор, пока вся присущая объекту цепочка наследования не будет пройдена. Таким образом, объекту доступны методы и свойства, сохраненные или в нем, или в присущей ему цепочке прототипов.

Сохраняя свойства в прототипе, вы гарантируете, что связанные с ними объекты «иных будут существовать в единственном экземпляре, что немаловажно, если фильме их будет использовать большое количество объектов.

Во Flash MX 2004 объектно-ориентированное программирование приобрело форму, максимально приближенную к синтаксису объектно-ориентированного программировании таких языков, как Java или C++.

Свойства _root, _parent, Leveln и ключевое слово this
В ActionScript существует несколько лексем, которые приходится использовать особенно часто. К ним относятся три свойства, позволяющие осуществлять адресацию на временные диаграммы — _root,_parent, Leveln. Во многом для тех же целей существует и ключевое слово this — один из наиболее мощных инструментов программирования на ActionScript.

Свойство _root является указателем на главную временную диаграмму данного фильма. Так как главная диаграмма всегда находится в основании дерева вложенности клипов фильма, то это свойство важно для осуществления обращений к ним. Например, пусть на корневом поле фильма имеются два клипа — movl и mov2. Частью клипа mov2 является клип mov3.

Как, располагаясь «внутри» movl, узнать координату по X клипа mov3? А сделать это очень просто, написав полный адрес mov3:

trace(_root.mov2.mov3._x); // Абсолютная адресация

В приведенном примере была использована абсолютная адресация — точно указаны все объекты, которые предшествуют интересующему нас клипу. Однако такой подход нельзя назвать оптимальным, так как при изменении структуры фильма код придется также переписывать. Гораздо лучше использовать адресацию относительную. Для се задания служит свойство _parent.

Оцените статью: (0 голосов)
0 5 0

Статьи из раздела Action Script на эту тему:
Клипы (тип movieclip)
Кодировка символов. Уникод во Flash
Синтаксис ActionScript
Тип undefined
Числа (тип number)