Часть 2

Готовой работающей программой называют код,

содержащий пока еще не обнаруженные ошибки.


Из компьютерных афоризмов

Язык ActionScript

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

Благодаря ActionScript стало возможным разрабатывать на Flash наряду с анимацией игры и полноценные сайты. Функции, предоставляемые Flash без использования ActionScript, подобны возвышающейся над водой вершине айсберга, девять десятых которого скрыты в глубине. Чтобы освоить Flash без ActionScript, достаточно и недели, а вот доскональное изучение возможностей программирования системы требует многих месяцев, а иногда и лет упорного труда.

Следует отметить характерные черты ActionScript:

  • Доступность. ActionScript (в определенных границах) способны легко понимать не только программисты.
  • Гибкость. Коды ActionScript можно набирать на кадрах анимации, кнопках и клипах, а также во внешних файлах. Это существенно упрощает разработку. Например, если какое-либо действие должно произойти, тогда когда будет нажата определенная кнопка, то задающий это действие код можно поместить на саму кнопку, при активации которой оно будет совершено.
  • Компактность. Flash-плеер создавался таким, чтобы можно было быстро загружаться даже при низкой пропускной способности соединения. Команда разработчиков Flash, прежде чем добавить в него новую функцию, непрестанно повторяла мантру: «А насколько увеличится код проигрывателя?» И язык ActionScript не стал исключением из этого правила. В него не были включены очень многие чрезвычайно полезные возможности, так как это повлекло бы недопустимое увеличение размера проигрывателя. Кроме того, не поддерживаются динамическая компиляция кода и регулярные выражения.
  • Совместимость. ActionScript — полноценный сценарный язык. Он во многом повторяет JavaScript, фактически служащий стандартом для сценариев, выполняющихся в Интернете на стороне клиента. Это связано с тем, что они подчиняются одному и тому же стандарту ECMAScript, разработанному Европейской Ассоциацией производителей компьютеров (ECMA, European Computer Manufacturers? Association). Так что, если вы знаете JavaScript, вам не составит труда перейти на ActionScript, а изучив программирование во Flash, легче будет осваивать универсальные языки.
Действия FutureSplash: в 1995 г. их было всего 14; сейчас ActionScript — сложный и многогранный язык сценариев, который очень и очень непросто освоить досконально

В определенной степени ActionScript совместим с JavaScript. Так, если созданная вами программа содержит только те элементы, описание которых имеется в спецификации ECMA-262, то она одинаково успешно может быть выполнена как во Flash-плеере, так и в браузере. Правда, во Flash MX 2004 возможна типизация переменных, аргументов функций и возвращаемых функциями значений, что является отклонением от ECMA-262, приводящим к полной несовместимости с JavaScript. Однако использование строгой типизации не есть обязательное требование.

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

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

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

Чтобы создать экземпляр встроенного класса, проще говоря объект, нужно использовать оператор new и функцию-конструктор, с помощью которой он будет инициализирован:

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

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

trace(_root._visible); // Выводит ?true? — объект _root видимый

Свойства бывают встроенными и пользовательскими. Никаких принципиальных отличий между ними не существует.

Создание мультимедийных энциклопедий и тематических путеводителей на Flash зачастую требует внедрения совершенно новых идей и концепций. Однако все это вознаграждено сторицей — небывалым успехом у пользователей (http://www.pobediteli.ru)

Ключевое понятие объектно-ориентированного программирования — метод, который определяется как функция, связанная с объектом и используемая для выполнения какой-либо задачи или изменения свойства. Так, метод gotoAndPlay() класса MovieClip предназначен для перевода воспроизводящей головки на нужный кадр, метод setVolume() класса Sound — для изменения интенсивности звука. Будучи частью внутренней структуры объекта, методы, подобно свойствам, вызываются с использованием оператора точки. Однако любой метод — это функция, поэтому в нем должен присутствовать соответствующий оператор вызова — «()»:

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

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

Помимо методов объектов и классов в ActionScript имеются глобальные функции. Они, в отличие от обычных, «видны» из любой точки фильма и не могут быть изменены или удалены. Как правило, глобальные функции предназначены для выполнения каких-то наиболее общих задач.

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

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

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

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

Flash-визуализация результатов, выдаваемых поисковой машиной, способствует пониманию того, как они соотносятся друг с другом (http://kartoo.com)

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

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

Все, что было сказано выше, справедливо для классического ActionScript. Однако во Flash MX 2004 появилась альтернативная модификация ActionScript, получившая название ActionScript 2.0, которую характеризует модель ООП а-ля Java, а не JavaScript.

Искусное ActionScript-программирование позволяет создавать пользовательские интерфейсы в стиле популярных операционных систем (http://x-pressive.com)

Тем, кто владеет Java, такие структуры, как классы (class), интерфейсы (interfaces) и пакеты (packages), покажутся старыми знакомыми. В то же время далеко не все особенности ООП в Java присущи ActionScript 2.0, поскольку новая объектная модель — просто формализация старой, ActionScript 1.0, основанной на функциях-конструкторах и прототипах, т.е. имеются лишь внешние изменения. После компиляции стирается всякое различие между тем, на основе какой модели (старой или новой) был создан класс. Проще говоря, при трансляции классы превращаются в банальные функции-конструкторы и прототипы.

ActionScript 2.0 гораздо ближе к классическим объектно-ориентированным языкам, чем ActionScript 1.0. Однако в нем пока отсутствуют очень многие понятия, привычные для C++ или Java, а именно:

  • полиморфизм;
  • перекрытие операторов;
  • абстрактные классы;
  • классы, аналогичные по особенностям классам типа protected С++ (в ActionScript 2.0 есть только классы типа public и private);
  • константы;
  • проверка типов на этапе исполнения; пока типы контролируются лишь на этапе компиляции, что не очень надежно.

Компоненты

В современной среде Flash имеется очень удобный формат для сохранения готовых решений — это так называемые компоненты, т.е. обычные клипы, обладающие набором дополнительных возможностей, облегчающих его повторное использование. Главное отличие компонентов от простых клипов заключается в том, что их основные параметры можно задать не только с помощью кода ActionScript, но и вручную, используя специальное меню. Поэтому компоненты могут полноценно применять даже разработчики, в принципе не знающие сценарный язык среды Flash или владеющие им довольно слабо. Компоненты очень легко распространять благодаря форматам и утилитам, специально разработанным компанией Macromedia. Более того, их позволительно даже продавать!

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

Язык JSFL

JSFL (JavaScript Flash Language) — сценарный язык среды разработки Flash MX 2004, помогающий создавать собственные команды меню, инструменты, эффекты и различные расширения. Любое действие, вручную выполняемое в среде разработки, проделывается посредством JSFL. Вопреки распространенному заблуждению JSFL не является частью ActionScript. Более того, эти два языка связаны ничуть не в большей степени, чем, например, ActionScript и JavaScript. В программе Macromedia Flash MX 2004 сценарный язык — JSFL, а в Macromedia Flash Player — ActionScript.

Многие новые возможности среды разработки Flash MX 2004 были реализованы с помощью JSFL.

Flash и авторские права

ActionScript Viewer от Manitu Group. Самый популярный Flash-декомпилятор среди профессионалов. Дает возможность изучить структуру как временной диаграммы фильма, так и библиотеки. Восстанавливает исходный текст и в форме ActionScript 1.0, и в ActionScript 2.0. Можно просматривать объектный код в виде ассемблера или непосредственно байт-кода. Вместе с программой поставляется несколько бесплатных утилит вроде редактора для JSFL- или SOL-файлов (http://buraks.com/asv)

Одним из вопросов, наиболее часто задаваемых на форумах для «флэшеров», является следующий: «Можно ли воссоздать FLA-документ на основании SWF-фильма?» Ответить на него удается лишь отчасти. Это задача довольно сложная, потому что на основании скомпилированного приложения невозможно однозначно воссоздать текст соответствующей программы, написанной на языке высокого уровня. Дело в том, что любой компилятор проводит оптимизацию, выбрасывая все ненужные элементы. Лишь незначительная часть информации, записанной во FLA-файле, входит в SWF-фильм. Например, после компиляции исчезают сцены, слои, комментарии и неиспользующиеся символы. Чем-то компиляция фильма схожа с вычислением производной в математике: восстановить исходную функцию удается только с неопределенными коэффициентами.

Используя декомпилятор, можно изучить структуру и код SWF-фильма. Лучшие декомпиляторы просто безупречно восстанавливают исходный текст на основании байт-кода.

Строго говоря, все декомпиляторы немного нарушают закон. Дело в том, что у SWF-файла есть тег protect, при наличии которого доступ к содержимому фильма должен предоставляться только по паролю. Устанавливается этот тег при экспорте фильма. Однако на практике тег protect бесполезен, так как ни один из декомпиляторов не обращает на него никакого внимания. Вот и приходится разработчикам всячески изощряться, дабы уберечь свое детище от плагиата. Будем надеяться, что когда-нибудь ситуация изменится в лучшую сторону.

Flash — просто инструмент в ваших руках. Что вы сможете сделать с его помощью, зависит только от вас. Помните: машины не могут творить — они способны лишь очень быстро считать, да и то не всегда. Не ленитесь думать, фантазировать и, главное, учиться. Наберитесь решимости и попробуйте освоить замечательную программу Flash фирмы Macromedia. И мы уверены, вы никогда не пожалеете о потраченном на это времени.

Продолжение следует.

Полный вариант статьи см. на «Мир ПК-диске». В нем более детально рассказывается о языках ActionScript и JSFL, компонентах и вопросах декомпиляции Flash-приложений; там же — развернутое интервью с Иваном Дембицким.

Юрий Стрельченко (dot@omen.ru, yuri.strelchenko@gmail.com) — автор сотен статей, аналитических обзоров и заметок в компьютерных изданиях России и Белоруссии. Специализируется в области истории компьютерных наук. Постоянный автор статей для журнала «Мир ПК» и ведущий ряда разделов CD-приложения «Мир ПК-диск».

Дмитрий Гурский (diis_ignotis@tut.by) — программист и автор компьютерной литературы. Широкую известность в русскоязычном Flash-сообществе ему принес бестселлер «ActionScript 2.0: программирование во Flash MX 2004». Является автором книг «Flash MX 2004 и ActionScript 2.0: обучение на примерах», «Вычисления в Mathcad» и «Mathcad для студентов и школьников». Постоянный автор CD-приложения «Мир ПК-диск».


Интервью с Иваном Дембицким

Иван Дембицкий — ведущий Flash-технолог Студии Артемия Лебедева. Участвовал в создании различных проектов для таких компаний, как Samsung, Nokia, Microsoft, Hewlett-Packard, MTV и др. Один из самых известных русских Flash-разработчиков. Оказывает большую помощь начинающим «флэшерам». Является комодератором конференции ruFlash.

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

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

— Насколько велик спрос на Flash-программистов в рамках ИТ-рынка?

— Сейчас налицо явный дефицит специалистов, и ситуация для работодателей будет ухудшаться, поскольку спрос на Flash-продукцию только растет.

— Задачи каких типов являются наиболее трудоемкими при их Flash-реализации?

— Полное динамическое построение сцены на основе серверных данных. Некоторые игры также бывают довольно сложными в реализации.

— Оправдан ли набирающий силу подход к созданию сайтов исключительно на основе Flash?

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

— Какие отсутствующие сейчас возможности не мешало бы встроить во Flash и ActionScript?

— Недавно анонсировался новый Flash-плеер. Продемонстрированные возможности очень порадовали «флэшеров». Резко увеличилась производительность плеера. Из того, что не было показано, я больше всего жду возможности динамической загрузки shared-библиотек.

— Не могли бы вы дать несколько типовых рекомендаций начинающим «флэшерам»?

— Невозможно развиваться без общения. Советую заходить на форумы, подписаться на конференцию ruFlash http://vmstudio.com/ ruflash.php. Причем нужно не только задавать вопросы, но и не стесняться отвечать на чужие. Несомненно, это серьезно расширит кругозор.

— Какие книги вы можете посоветовать для начального и для углубленного изучения Macromedia Flash и ActionScript?

— Сначала подойдет любая толстая книга по ActionScript, но не советую изучать только одну. У разных авторов свои подходы и практика. У каждого из них можно почерпнуть много нового.


Полезные ссылки

  • http://macromedia.com. Официальный сайт компании Macromedia — разработчика Flash.
  • http://flasher.ru. Наиболее крупный русскоязычный ресурс, посвященный Flash.
  • http://vmstudio.com. Интересен переведенной на русский язык официальной документацией. Здесь же можно стать участником конференции ruFlash — самой популярной почтовой рассылки по Flash на русском языке.
  • http://flash-ripper.com. Единственный русскоязычный проект, практически каждый день предлагающий свежие новости из мира Flash. Представлены статьи, раскрывающие недокументированные возможности ActionScript, есть материалы, посвященные JSFL и вспомогательным утилитам.
  • http://flashguru.co.uk. Один из лучших сайтов для пользователей с высоким уровнем знания ActionScript.
  • http://flashkit.com. Крупнейший из порталов, посвященных Flash.
  • http://actionscript.org. Англоязычный портал, отданный теме ActionScript. По количеству статей и исходных файлов сопоставим с http://flashkit.com.
  • http://flashcomponents.net. Лучшее хранилище компонентов и готовых решений в Сети.

Продолжение. Начало см. в №7/05.