Flash - статьи

Анимация

Теперь, когда вы уже знакомы с основными понятиями, необходимыми нам для создания анимации, можно приступать к рассмотрению непосредственно предмета данной статьи.
В начале статьи мы определили, что существует два метода анимации - покадровый и путем создания промежуточных кадров. Итак:
Покадровая анимация
Это анимация, полностью составленная из ключевых кадров. Т.е. вы сами определяете, как содержимое кадра, так и его "длительность" (т.е. сколько таких статических кадров будет занимать изображение).
На временной шкале покадровая анимация выглядит следующим образом:
Анимация

Рис 2. - Покадровая анимация
Достоинства:
  • Покадровая анимация дает вам, в некотором смысле, больший контроль над анимацией, и если вы опытный аниматор, вы можете выгодно ею пользоваться.
  • Это единственный способ организовать смену абсолютно независимых изображений - слайд шоу (например, создавая обычный баннер средствами Flash).
  • И все остальное, что вытекает из возможности прорисовывать каждый кадр вручную.

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

  • Анимация с построением промежуточных кадров (tweened motion)
    При этом способе анимации Flash автоматически строит промежуточные кадры между ключевыми кадрами, заданными вами. Это означает, что вы рисуете объект, потом на другом кадре производите изменения, о которых мы поговорим ниже, и просите Flash рассчитать те кадры, которые лежат между этими двумя ключевыми кадрами. Он выполняет эту работу, и вы получаете плавную анимацию.
    Скорость и плавность анимации зависят от количества кадров, которые вы отводите под движение и скорости вашего Flash фильма (movie). Скорость фильма можно изменить здесь: Modify->Movie:, Ctrl+M - там параметр Frame Rate задает количество кадров в секунду. Для качественной анимации скорость должна быть не меньше 25-30 кадров в секунду.
    Плавность и длительность задается количеством кадров, отведенных на анимацию (ее фрагмент). Например, если скорость вашего фильма - 30 кадров/сек., и вам нужно совершить перемещение, скажем, самолетика, из одного угла картинки - в другой за 2.5 секунды, то на это движение вам нужно отвести 75 кадров.
    Во Flash существует два варианта построения промежуточных изображений - motion tweening (построение анимации на основе модификации символов) и shape tweening (построение анимации на основе изменения формы). Эти способы отличаются в корне. Первый используется чаще всего, т.к. с помощью него можно построить подавляющее большинство анимаций. Второй применяется в случаях, когда нужно плавное изменение формы. Поговорим, сначала о нем.

    Shape tweening

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

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

    После того как у вас есть два ключевых кадра, вы делаете активным первый из них (просто переходите на него), и выбираете на панели Frame (Windows->Panels->Frame, Ctrl+F) в списке Tweening строку Shape:

    Анимация

    Рис 3. - Shape tweening

    Кадры на временной шкале должны окраситься в зеленоватый цвет и от первого кадра ко второму должна протянуться стрелочка (см. Рис. 4).

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

    Анимация

    Рис. 4 - Анимация на основе Shape tweening

    В этой маленькой анимации круг переходит в некое подобие полумесяца. На первам ключевом кадре я нарисовал круг, а на втором ключевом кадре (это 10-й кадр сцены) превратил его в полумесяц.

    Немного о параметрах shape tweening. Вы, наверное, заметили, что появилась пара других параметров, когда вы выбрали shape tweening в панели Frame - Easing и Blend (см. Рис. 3). Поле Label содержит метку кадра. О метках мы поговорим в статье, посвященной анимации с помощью ActionScript.

    Easing задает обратное экспоненциальное ускорение. Величина этого параметра может изменяться от - 100 до + 100. Это означает, что если вы зададите отрицательный easing, движение будет происходить с положительным ускорением, скорость будет увеличиваться (см. Рис. 5). И наоборот, если easing будет положительным, анимация будет замедляться (см Рис. 6).

    Анимация

    Рис. 5 - Easing: -100

    Анимация

    Рис. 6 - Easing: +100

    Параметр Blend, определяет алгоритм перехода: Distributive (распределяющий, общий) и Angular (угловатый). Первый старается максимально смягчить, сгладить переход от одной фигуры к другой. Второй же пытается сохранить пропорции углов. Если переход вас не удовлетворяет, можно поэкспериментировать с этим параметром.

    И, наконец, последний инструмент в анимации shape tweening - контрольные точки (shape hints, дословно - подсказки для форм). Это точки, с помощью которых вы помогаете Flash правильно осуществить переход. Без них не обойтись в случае сложных форм. Пользоваться ими очень легко:

    На первом ключевом кадре (с которого начинается анимация) вы добавляете контрольную точку (Modify->Transform->Add shape hint, Ctrl+Shift+H). На сцене появится маленькая красная точка, обозначенная буквой латинского алфавита. Вы прикрепляете ее к той части изображения, которая двигается не так, как вы хотели. Затем вы переходите на второй ключевой кадр, и прикрепляете эту же точку к части, в которую должна была перейти часть на начальном кадре. Точка будет уже зеленого цвета, а на начальном кадре она станет желтой. Так вы можете отличать начальные и конечные ключевые точки, так как на одном кадре могут присутствовать и те и другие.

    Удалить все точки можно с помощью Modify->Transform->Remove All Hints. Удалить же единственную точку можно, нажав на ней правую кнопку мыши, и в контекстном меню выбрав Remove Hint.

    Так как контрольные точки обозначаются буквами латинского алфавита, то их может быть максимум 27.

    На рисунках (Рис.7 и Рис.8) вы можете заметить разницу между кадрами, созданными без использования контрольных точек, и с использованием таковых.

    Анимация


    Рис. 7 - Shape tweening без использования контрольных точек

    Анимация

    Рис. 8 - Shape tweening c использованием контрольных точек

    При использовании анимации на основе изменения формы (shape tweening) могут модифицироваться следующие параметры фигуры:

  • форма
  • расположение
  • размер (любые пропорции)
  • цвет
  • угол поворота


  • Если вам нужно отключить shape tweening, в панели Frame выберите Tweening: None.

    Motion Tweening

    И, наконец, наиболее часто используемая техника анимации во Flash - Motion Tweening. В этом случае анимация строится на основе модификации символов, т.е. объектом анимации является символ.

    Как и в анимации shape tweening, на каждый объект в один момент времени, нам нужен один слой. На этом слое должен находиться один символ, с которым и будут происходить все изменения.

    Вот какие параметры символа могут модифицироваться при использовании Motion Tweening:

  • размер (как пропорционально, так и непропорционально - отдельно высоту и ширину)
  • наклон
  • расположение
  • угол поворота
  • цветовые эффекты (см. ниже)
  • можно использовать направляющие слои для задания траектории движения объекта


  • Включить motion tweening можно несколькими способами (а отключить, к сожалению, только одним). Для того, чтобы включить motion tweening, нужно сделать активным начальный кадр вашего перехода, затем, нажав правую клавишу мыши, в контекстном меню выбрать Create motion tween (это же можно сделать, выбрав Insert->Create motion tween). Универсальный способ включения/выключения motion tweening - с помощью панели Frame, выбрав Motion в поле Tweening. Там же можно контролировать параметры анимации:

    Анимация

    Рис. 9 - Motion tweening

    Easing - обратное экспоненциальное ускорение, работает абсолютно так же, как и в shape tweening.

    Rotate позволяет управлять вращением. Auto - Flash автоматически пытается определить количество витков. CW (Clockwise, по часовой стрелке) и ССW (Counter Clockwise - против часовой стрелки). При этом рядом в поле справа появляется возможность ввести количество оборотов. Можно использовать только целые значения. Можно отключить вращение, выбрав None.

    Orient to path - поворачивает символ в соответствии с направляющей линией. Snap привязывает символ к этой направляющей. (см. ниже)

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


    Направляющие слои

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

    Скажем, вам нужно анимировать самолетик, который выписывает виражи по небу. У вас уйдет уйма времени и сил, на создание этого движения. При этом анимация будет состоять из маленьких отрезков motion tweening и отдельных кадров. Вместо этого можно нарисовать траекторию на специальном слое и привязать символ самолетика к ней.

    Итак, если вы используете траекторию, то вам нужен дополнительный слой для нее. Кстати, с одной траекторией можно использовать несколько символов.

    Для того, чтобы добавить направляющий слой, вам нужно выбрать слой, на котором находится ваш символ, и, нажав правую клавишу мыши, в контекстном меню выбрать Add Guide. При этом исходный слой становится направляемым (guided layer). Это далеко не единственный способ создать направляющий слой (guide layer). Любой слой можно сделать направляющим, указав это в его свойствах, или направляемым, перетащив нужный слой мышкой, так, чтобы он находился под направляющим.

    Анимация

    Рис. 10 - Направляющий слой

    Далее, вам нужно нарисовать траекторию движения. Траекторией может быть любая кривая, не являющаяся областью заливки. Все! Управляющий слой готов. Вы можете его запретить для редактирования, чтобы было удобней работать, а в дальнейшем и вовсе сделать его невидимым.

    Анимация

    Рис. 11 - Анимация, с использованием траектории

    Теперь, чтобы использовать этот слой, вам нужно взять ваш символ за центральную точку (это такой маленький кружочек) и перетащить ее на траекторию. Вы почувствуете, когда символ "зацепится" за нее, и увидите, как он будет по ней скользить. Далее все по знакомому сценарию - ключевые кадры, включаем motion tweening: Если нужно, чтобы объект поворачивался согласно траектории, а не просто двигался по ней (как на рис. 11), то на панели Frame нужно включить флажок Orient to path.

    Цветовые эффекты


    Motion tweening позволяет использовать различные цветовые эффекты применительно ко всему символу. Эта возможность отсутствует в shape tweening.

    Для того, чтобы применить эффект к символу, нужно выделить этот символ, и на панели эффектов (Windows->Panels->Effects), выбрать нужный эффект (см. Рис 9-12).
    Анимация

    Рис. 12 - Установка яркости
    Анимация

    Рис. 13 - Цветовое смещение, оттенок
    Анимация

    Рис. 14 - Точная установка всех атрибутов
    Анимация

    Рис. 15 - Установка прозрачности

    Flash 5 - новые возможности

    Начну с определения, возможно, несколько неожиданного для многих, но дающего направление всему дальнейшему разговору: "Flash 5 - язык программирования нестандартных интерфейсов с векторной анимацией".
    Здесь делается основной упор на то, что интерфейсы нестандартны. Что имеется в виду, зачем это нужно и к чему это ведет?
    "Нестандартные" интерфейсы имеют ряд отличий от "стандартных" (под "стандартными" подразумеваются привычные интерфейсы HTML):
  • Специальные управляющие объекты (кнопки, панели, блоки). Для примера, рулетка в Microsoft Word - нестандартный объект. Ее практически невозможно реализовать в HTML, только картинку, но не интерактивную функциональность.
  • Независимое размещение объектов, другими словами, не размещение объектов относительно друг друга, а расположение по координатам и уровням. В DHTML такая возможность существует, но в DHTML надежно реализовать можно только совсем простые вещи.
  • Прозрачное взаимодействие с любым объектом. Т.е. все объекты равны, не складывается ситуация, когда часть принадлежит системе, часть вашему коду, и т.д., и при этом набор обрабатываемых событий один для всех.

  • В результате подобной "нестандартности" появляется полная свобода в создании интерактивного интерфейса, более удобного, более наглядного, более функционального. Это реально повышает уровень предоставляемого сервиса. А значит, достигается "customer satisfaction" (удовлетворение посетителя), и, в конечном итоге, система становится более конкурентоспособной.
    И именно Flash 5 дает возможность делать такие интерфейсы принципиально проще, чем любой другой инструмент, который можно всерьез рассматривать как сколько-нибудь значимую рыночную технологию.
    Разработчики, попробовавшие программировать в среде Flash 5, подтвердят мои слова: Flash - уже не просто технология для создания анимационных роликов. Другими словами, Flash стал применим для создания интерактивных приложений.
    Резонно задаться вопросом: а оно надо? Есть ли смысл использовать Flash 5 там, где он никогда не использовался? Ведь "несть числа" всевозможным языкам программирования, описывающим клиентскую часть. А Flash, к тому же, - один из самых медленных.
    Здесь важно понять, что существует два принципиальных условия применения Flash:

  • Надо аккуратно выбирать область применения Flash за пределами анимации.
  • Этим инструментом надо уметь грамотно пользоваться.


  • С первым условием достаточно просто: Flash нужен там, где нестандартный интерфейс дает много новых возможностей, где нужна интерактивность, где не подходит "спартанская" внешность. При совпадении всех этих требований имеет смысл задуматься об использовании Flash 5 в качестве инструмента для построения системы.

    Чем определяется "грамотность" применения Flash 5? Необходимо определиться, каковы преимущества использования именно Flash в конкретном проекте, и с какими "подводными камнями" придется столкнуться.

    Основные плюсы программирования в среде Flash 5 - в процессе разработки:

  • Почти каждая аккуратно запрограммированная функция сразу очевидно полезна во многих местах.
  • Возможно построение универсального сервера.
  • Легко переносится часть логики с серверной на клиентскую часть.
  • Свобода в верстке и в наборе control-элементов (кнопок, меню, списков, таблиц).


  • Есть, однако, и недостатки, что-то работает не лучшим образом, а потому, если в системе важны определенные компоненты, Flash использовать пока нецелесообразно. Собственно, список тех компонентов, которые на данный момент "не дружат" с Flash:

  • Сложные математические операции на клиентской части.
  • Работа с очень сложными структурами данных на клиентской части.
  • Мелкие тексты, написанные по-русски, из-за проблемы с кодировкой.
  • Сайты со сверхсложной бизнес-логикой, требующие мгновенной загрузки.
  • Механизмы, требующие работы с файловой системой клиента или его устройствами (например, web-камерой или микрофоном).


  • Вот, пожалуй, и все трудности. Но! Если в столь ожидаемом многими Flash 6 добавится некоторый набор усовершенствований, эти проблемы станут неактуальны. Это набор довольно простых вещей, которые очевидно не сложно сделать:

  • Кэширование растрированных векторов.
  • Поддержка Unicode.
  • Усовершенствование механизма наследования объектов.
  • Внедрение методов проектной/командной работы.
  • Отладка Performance and Memory-Use на XML, Math/Data Functions.
  • Окончательное разделение программирования и дизайна.



  • Это не так много, разница между Flash 4 и Flash 5 гораздо больше, чем эти изменения. Конечно, и после этого Flash не надо будет применять везде - он все равно останется для "своей" области.

    Производительность, поддержка кодировок - эти вопросы уже скоро будут решены. Инструмент будет более четко разделен, а концепция языка скорректирована. Разумеется, Flash 6 по-прежнему будет поддерживать разработанные на Flash 5 продукты.

    Многие описанные проблемы решаются уже сегодня:

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


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

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

    * * *

    Статья основана на материалах проекта REFLASH ()

    В качестве иллюстрации к возможностям Flash 5 при создании интерактивных систем рекомендуется демо-версия веб-магазина, полностью реализованного на технологии Flash 5 ().

    Графика, созданная вручную

    Когда вы создаете графику во Flash, убедитесь в том, что у вас нигде не осталось лишних линий полигонов, пустых или прозрачных фигур, которые не несут на себе функциональной нагрузки.
    Ограничьте себя в использовании специальных типов линий, таких как пунктир, нечеткие линии, точки и т.д. Сплошные линии занимают меньше места. Толстые линии, нарисованные карандашом, занимают гораздо меньше, чем линии, нарисованные кистью.
    Когда вы импортируете векторную графику, убедитесь, что в ней не существует скрытых линий или объектов.
    Flash позволяет сглаживать, выпрямлять и оптимизировать линии (меню Modify -> Smooth, Straighten, Optimize). Чем прямее линии, тем меньше места они занимают. И, наоборот, чем они детальнее, тем больше. Оптимизирую линии, можно задать уровень сглаживания, а так же выполнить многопроходную оптимизацию.

    Или еще один шаг в развитии Flash-технологии

    Рубен Сардарян

    4-го марта Macromedia анонсировала новую версию Flash: Flash MX. A 15-го марта на уже была опубликована пробная версия Flash MX (от полной версии она отличается тем, что действует только 30 дней). Для интересующихся: стоит Macromedia Flash MX всего $499, а upgrade с предыдущей версии обойдется в $199.
    Я, понятное дело, быстренько скачал этот продукт (весит он 46 Мб) и попробовал его в деле. Эта маленькая статья представляет собой обзор новых возможностей Flash MX, немного разбавленных моими комментариями.
    Бросается в глаза деление Macromedia пользователей Flash на дизайнеров (designers) и разработчиков (developers). Стоит открыть окошко What's new, и тебе популярно объяснят в чем состоит выигрыш для дизайнеров и для разработчиков (ну ладно, ладно, назовем их "программистами"), а в предустановленных расположениях окошек (panel sets) присутствуют "заводские" настройки для designer-ов и developer-ов. В статье я решил такого деления не проводить, а просто перечислить новые возможности программы и немножко поделится опытом использования этих самых возможностей.
    Начнем с совместимости. Вместе с новым Flash был выпущен и новый Flash Player 6 (примочка для браузеров, позволяющая проигрывать Flash-мультики). Он понадобится, чтобы наблюдать творения, созданные во Flash MX. Однако, как и в предыдущих версиях, вы спокойно можете экспортировать вашу анимацию для любой версии Flash Player-а, при этом будут использованы только возможности указанной версии. Формат авторских .fla файлов тоже изменился. Но есть возможность сохранять файлы в формате Flash 5. В случае, если вы использовали какие-то возможности Flash MX, программа выдаст вам список использованных новых "фич" и предупредит, что все они будут потеряны, если файл будет сохранен в формате Flash 5. В любом случае, никто не мешает для работы использовать Flash MX, а экспортировать во Flash 5. Большинство дизайнеров будут так поступать еще некоторое время, пока новый plug-in не получит достаточного распространения.
    Хорошее (я бы сказал, обязательное) решение для больших Flash-фильмов - иерархические слои. Теперь слои (layers) можно укладывать в иерархическое дерево папок. В первый раз я подумал о такой возможности, когда увидел у одного парня 78 слоев в мультике, и вот она появилась! Ура!

    Или еще один шаг в развитии Flash-технологии

    Рис.1 - Иерархические слои

    Заметно изменился интерфейс. Вместо Adobe-овских панелек с закладками появились "складывающиеся" панельки. Одним кликом мышки они разворачиваются или сворачиваются, экономя драгоценное место на экране. Мне это показалось довольно удобным, т.к. можно быстро перестраивать рабочее пространство. Появилась полезная панелька Properties (инспектор свойств), в которой можно изменять параметры любого выбранного объекта. Если ничего не выбрано, в ней отображаются свойства самого фильма. По сути, эта панелька заменила множество панелек, отвечающих за свойства текста, звука, символов, кадров, эффекты и т.д.

    Или еще один шаг в развитии Flash-технологии

    Рис. 2 - Панелька Properties

    Достаточно серьезное новшество - поддержка специальных средств для людей с ограниченными способностями (по-английски это называется accessibility). Macromedia использует технологию Microsoft Active Accessibility (MSAA) в качестве интерфейса к специальным программам для таких людей. Теперь для объектов Flash можно назначать название, описание и сочетания клавиш, которые будут доступны инвалидам. К сожалению, эти возможности поддерживаются только во Flash Player 6 для Internet Explorer-а. В Netscape и других браузерах, не использующих IE-технологию, поддержка accessibility будет недоступна.

    Еще одно значительное нововведение - импорт видеоклипов. Теперь видео можно импортировать практически в любом формате, причем Flash может изменить любые параметры этого видеоклипа, что позволит существенно сокращать размеры Flash фильмов. При импорте видеоклипа можно изменить его качество, размер и распределение по временной шкале во Flash.

    Появились общие библиотеки (shared libraries). Теперь можно подключить такую общую библиотеку и использовать какие-либо символы во многих фильмах одновременно. Это позволит значительно сокращать размеры авторских файлов. Можно, например, импортировать видеоклип или звук в shared library, а потом использовать эти компоненты в разных .fla файлах.

    Flash MX позволяет создавать шаблоны (templates) и использовать их в качестве заготовок для новых фильмов. Все что нужно сделать - сохранить Flash файл в качестве шаблона и далее выбрать File -> New from template... В пробной версии Flash были обнаружены некоторые достаточно функциональные шаблоны (презентация, опрос, слайд-шоу).

    Теперь к новостям для любителей всего сложного (для программистов, то бишь :).


    Конечно же вырос, окреп и поднялся над собой ActionScript. О новшествах этого компонента Flash можно написать отдельную большую статью. Добавились новые объекты, новые методы и переменные. Изменилась классификация объектов и функций. Теперь гораздо удобнее находить в дереве нужные возможности языка.

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

    Или еще один шаг в развитии Flash-технологии

    Рис. 3 - Редактор ActionScript-а

    Наконец-то появился нормальный отладчик (debugger), позволяющий ставить breakpoint-ы и осуществлять пошаговую отладку.

    Или еще один шаг в развитии Flash-технологии

    Рис. 4 - Отладчик

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

    В программе появилось большое количество других полезных мелочей, например, увеличилось количество настроек текста, появилась подстановка несуществующих шрифтов, пиксельная сетка и т.д. Все эти новшества вы можете обнаружить сами, когда перейдете на Flash MX. А я надеюсь, что эта статья поспособствует этому событию. Скачивайте 6-й Flash Player, устанавливайте MX и успехов вам на Flash-поприще!

    Имена

    Для того, чтобы обращаться к клипам, нам потребуется разобраться с понятием имени объекта (instance name) и пути до объекта (target path). Договоримся, что клип (movie clip) и объект для нас - одинаковые вещи.
    Имя объекта - это имя конкретного экземпляра символа. Скажем, у нас может быть символ - машинка, а экземпляры этого символа будут называться "Машинка1", "Машинка2", "Pickup", "Запорожец"...
    Для того чтобы дать имя объекту, нужно выделить объект и в панели Instance (Window->Panels->Instance, Ctrl+I) в графе Name ввести имя объекта (рис. 2). Имена могут состоять только из букв, цифр и символа подчеркивания ("_"), причем имя не может начинаться с цифры.
    Имена
    Рис. 2 - Панель Instance

    Изображения

    Так как Flash является векторной средой, по возможности следует использовать векторную графику. К тому же, растровая графика при масштабировании выглядит не слишком пристойно.
    Если изображение не является фотографическим, имеет смысл преобразовать его в векторный формат. В параметрах изображения, после его импортирования, можно выбрать тип компрессии и посмотреть, как оно будет выглядеть.
    Накладно и не оправдано создание во Flash анимации с помощью растровых изображений. Для этого можно использовать, скажем, формат GIF.

    Качество

    Вы, наверное, уже знакомы с понятием качества во Flash (опция Quality при публикации, параметры _quality, _highquality, функция toggleHighQuality()). Качество тоже сильно влияет на скорость воспроизведения. Тут тоже существует несколько компромиссов.
    Во первых, уровень качества можно установить вручную при экспорте. При этом не забывайте, что если не отключить контекстное меню, то у пользователя остается возможность регулировать качество.
    Во вторых, качество можно менять динамически во время исполнения анимации (параметр _quality). На время воспроизведения особенно сложных и "быстрых" фрагментов, можно понижать качество, тем самым выигрывая в скорости, а когда "количество" анимации уменьшится, вновь возвратиться к высокому уровню качества.
    При создании анимационных заставок, я предпочитаю давать выбор качества пользователю, поместив в уголок пару/тройку кнопок, позволяющих регулировать качество.
    Поэкспериментируйте, и вы увидите, что качество существенно влияет на скорость воспроизведения клипов.

    Кадры, слои, символы, временная шкала

    Мы досконально разберем все способы создания анимации, но сначала определимся с некоторыми базовыми понятиями. Этими понятиями являются кадры (frames), символы (symbols), слои (layers) и временная шкала (timeline).
    Временная шкала
    Временная шкала - основной инструмент при работе с анимацией во Flash. На ней отображается информация о слоях, о том какие кадры являются ключевыми, а какие генерирует Flash. С помощью временной шкалы можно понять, какие кадры содержат действия или метки. Она позволяет перемещать ключевые кадры и целые куски анимации. Вы очень быстро освоитесь с этим инструментом, благодаря хорошо продуманному и удобному интерфейсу. Временную шкалу очень легко найти, даже если вы впервые работаете во Flash:
    Кадры, слои, символы, временная шкала
    Рис. 1 - Временная шкала
    Подробное рассмотрение всех элементов шкалы займет очень много времени и места, поэтому я только перечислю ее основные возможности:
    - Маркер - указывает на текущий кадр, отображаемый в окне. При клике на какой-либо кадр, маркер автоматически перемещается на него.
    - Слои - слева находится перечень слоев. Под ним существуют кнопки, позволяющие добавлять и удалять слои. Каждый слой можно сделать невидимым и запретить его для редактирования.
    - Шкала кадров - поле, где вы можете добавлять и удалять простые и ключевые кадры. Если вызвать контекстное меню (нажать на правую клавишу мыши) на каком-либо кадре, вы увидите перечень действий, которые можно совершить. На шкале отображается информация о кадрах, которые являются ключевыми (такие кадры помечаются черными кружочками), содержат действия (буковка "а" над кружочком) или метку (красный флажок, после которого идет название метки). Цвет тоже говорит о типе кадров. Серый цвет - это кадры, которые в точности повторяют ключевой кадр (keyframe). Синеватая или зеленоватая подсветка говорит о том, что кадры сгенерированы Flash (о различиях я расскажу ниже). И, наконец, белое или "пустое" полосатое пространство говорят о том, что на этих кадрах ничего нет.
    - Кнопки управления тенями - это кнопки, позволяющие отображать соседние кадры как бы через кальку, чтобы видеть разницу между предыдущими и последующими кадрами. Можно задавать глубину такого отображения по обе стороны от маркера.
    Я думаю, вы очень быстро разберетесь со всеми функциями шкалы времени, если немножко поэкспериментируете.

    Слои
    В компьютерной графике этот инструмент используется очень часто. Представьте, что вы рисуете на прозрачных листах, а потом накладываете их друг на друга. То, что находится на верхних слоях, закрывает содержимое нижних слоев. Слои можно делать невидимыми и/или недоступными, чтобы облегчить редактирование сцены в целом.
    Во Flash есть пара особенных типов слоев: слои, содержащие траектории движения и слои - маски. Про первые мы поговорим ниже, обсуждение же вторых выходит за рамки данной статьи.
    Есть достаточно большое количество приемов, в которых используются слои, но во Flash без них просто нельзя обойтись по одной важной причине: в один момент времени для каждого объекта анимации нужен отдельный слой. Объектом анимации считается фигура (shape) или символ (symbol).
    Кадры
    Наша анимация состоит из последовательности кадров. Кадр может быть как составленным вручную, так и сгенерированным Flash. Это относится к кадрам одного слоя. Так как сцены Flash состоят обычно из нескольких слоев, то итоговые "многослойные" кадры, могут содержать, как сгенерированные, так и "самодельные" слои.
    В компьютерной анимации существует понятие - ключевые кадры (keyframes). Их название говорит само за себя. Это кадры, которые Flash не вправе изменять в процессе создания анимации. Вы задаете эти ключевые кадры, а промежуточные кадры между ними выстраивает Flash. Существует два типа промежуточных кадров - кадры, построенные на основе изменения геометрии (shape tweening) или кадры, построенные на изменении символов (motion tweening). И, конечно же, кадры могут быть пустыми, т.е. ничего не содержать.
    Элементарные операции с кадрами:
    Вставить пустой ключевой кадр - Insert->Blank keyframe, F7
    Ключевой кадр, повторяющий содержание предыдущего - Insert->Keyframe, F6
    Очистить ключевой кадр - Insert->Clear keyframe, Shift-F6
    Вставить обычный кадр - Insert->Frame, F5
    Удалить кадр - Insert->Remove Frames, Shift-F5

    Символы
    Символы - одно из ключевых понятий во Flash. Символом может быть, как простейшая геометрия или их объединение, так и целая анимация (movie). Это позволяет использовать символы, как мощный механизм создания абстракций во Flash.
    Например, можно сделать символы - колесо, корпус, стекла, антенны. Потом все это объединить в символ - автомобиль. А затем создать сцену, на которой этот автомобиль будет ехать. Другой пример. Допустим, вам нужно нарисовать падающий снег. Вы создаете символ снежинки, создаете символ, содержащий несколько анимирующихся снежинок, далее создаете символ в виде столбика падающих снежинок, затем размножаете этот столбик - и получаете падающий анимирующийся снег на всю сцену.
    Я думаю, вы уловили смысл символов. Символы добавляют гибкости вашей сцене. В случае с автомобилем вы можете сделать колесо анимированным символом, так, чтобы ощущалось вращение. Можете сделать дверь кнопкой, чтобы при клике мышкой она открывалась. Смысл в том, что в любой момент вы можете изменить содержание и вид символа, что существенно сокращает затраты на модификацию Flash сцен.
    Существует три вида символов: анимация (movie clip), кнопка (button) и изображение (graphic):
    - Изображение (graphic), представляет собой символ, состоящий из единственного кадра. Отсюда следует его статичное название. Если символ действительно представляет собой статичный (не анимирующийся) объект, лучше сделать его изображением (graphic).
    - Кнопка (button). Во Flash есть специально приспособленный под функции кнопки вид символа. В нем имеется 4 кадра: Up, Over, Down, Hit, которые содержат следующие состояния кнопок:


  • Up - обычное состояние кнопки.
  • Over - когда курсор мышки находится над кнопкой.
  • Down - когда курсор находится над кнопкой и нажата клавиша мыши.
  • Hit - обычное состояние, для кнопки, содержащей ссылку, которую пользователь уже посещал.

  • - Анимация (movie clip). Это самый "полноценный" тип символа. В нем может быть любое количество кадров. Символ этого типа может восприниматься как объект типа Movie в ActionScript (это встроенный язык Flash).
    Символы могут быть вложенными вне зависимости от типа. Это является самым главным их достоинством. Например, можно сделать кнопку, которая начнет двигаться, когда над ней будет "пролетать" курсор мыши, просто поместив в кадр Over символ - анимацию. Или (парадокс!) на изображение поместить бегущую кошку. Все остальное - дело вашей фантазии.
    Символы можно создавать как "с нуля" (Insert->New Symbol, Ctrl+F8), так и используя текущее выделение, поместив его сразу в символ (Insert->Convert to Symbol, F8). Второй прием используется гораздо чаще, чем первое, т.к. в этом случае отпадает надобность его позиционировать и изменять под нужный размер.
    Для управления символами используется так называемая библиотека (Library), описание которой, к сожалению, не входит в рамки данной статьи. Окно библиотеки находится по адресу Window->Library (или Ctrl-L). Я надеюсь, вы легко разберетесь с библиотекой символов.

    Кнопки

    Первое, что хочется, когда начинаешь изучать интерактивность Flash - сделать что-нибудь, что бы откликалось на действия пользователя, "оживить" ваше творение, добавить обратную связь. Самый простой способ сделать это - кнопки. Поэтому с них-то мы и начнем.
    Как вы знаете, во Flash существует специальный тип символа для создания кнопок - Button (см. Macromedia Flash ч. 2). Будем считать, что вы уже научились создавать кнопки, теперь научимся отслеживать нажатия на эти кнопки.
    Кнопки в Macromedia Flash обладают обширным списком событий, на которые мы можем реагировать:
  • press - клавиша мышки нажата, когда курсор находится в пределах кнопки;
  • release - клавиша мышки отжата, когда курсор находится в пределах кнопки;
  • releaseOutside - клавиша мышки отжата, когда курсор находится вне пределов кнопки;
  • rollOver - курсор мыши входит в пределы кнопки;
  • rollOut - курсор выходит за пределы кнопки;
  • dragOver - курсор входит в пределы кнопки, при этом была нажата кнопка, и нажата клавиша мыши;
  • dragOut - курсор выходит за пределы кнопки, при этом была нажата кнопка, и нажата клавиша мыши;
  • keyPress ("клавиша") - была нажата "клавиша". Список клавиш можно посмотреть в справке по Flash (объект Key), или использовать панель параметров для ввода нужной клавиши.

  • К сожалению, Flash "понимает" только левую клавишу мыши. Правая используется для вызова контекстного меню (щелкните правой клавишей на каком-нибудь Flash мультике). Способов отлавливать во Flash среднюю клавишу или "колесико" (mouse wheel) я пока не встречал; думаю, что их не существует.
    Перехватываются эти события с помощью директивы on(). Синтаксис ее таков:
    on (событие) { ... // Наши действия }
    Ниже вы можете сами попробовать вызвать некоторые события:
    Очень часто используемый пример - переход по ссылке при нажатии на кнопку:
    on (release) { getURL("http://rubs.boom.ru"); }
    Чтобы проверить этот сценарий, выделите вашу кнопку, нажмите Ctrl+Alt+A и введите программу.
    Вот так просто можно перехватить все события, связанные с кнопкой. Ну а как их использовать - это дело исключительно вашего воображения.

    Macromedia Flash 5. (часть первая)

    Рубен Сардарян,
    Как вы думаете, реально ли уместить страничку, содержащую приличное количество анимации, звука и удивительных способов интерактивности в файл порядка 100kb? Сделать так, чтобы эта страница работала одинаково как в Netscape Navigator (NN), так и в Internet Explorer (IE)? Компания Macromedia решила большинство проблем совместимости и производительности, выпустив Flash, который к сегодняшнему дню весьма эволюционировал и является полноценной частью инструментов / техник web-дизайна.
    Коротко и ясно о том, что это такое. Существуют plug-ins (примочки), которые встраиваются в браузер (web browser), и служат для просмотра Flash страниц. Называются они Flash Player. Причем в последних версиях IE и NN эти примочки уже встроены (если нет, то их можно бесплатно скачать с сайта Macromedia). И существует программа Flash, с помощью которой эти страницы создаются.
    В пользу Flash приведу его основные достоинства и статистку Macromedia.

  • Маленький размер получающихся файлов и, соответственно, более быстрая загрузка из сети. Flash использует векторный формат изображений и сжимает растровые и звуковые файлы, (которые также могут использоваться в страницах Flash), что очень положительно влияет на уменьшение размера страницы и время ее скачивания.

  • Устранение проблем совместимости между браузерами. В отличие от HTML, Flash одинаково работает как в IE, так и в NN. Имеется даже специальный вариант примочки-проигрывателя для браузеров, поддерживающих Java (Flash Java Player).

  • Мощный событийно-управляемый язык. В Macromedia Flash используется специальный язык, при помощи которого можно создавать "интеллект" для своей страницы. Причем если в Flash 4 это был, скорее, некий скрипт (script), имеющий всего несколько основных функций, то в Flash 5 (несмотря на название "ActionScript") - это почти полноценный язык программирования, с поддержкой условий, циклов, массивов, функций и классов, которые можно наследовать.

  • Красота. Да, да, именно! Flash имеет автоматическую поддержку anti-aliasing (антиалайсинг, сглаживание контуров с помощью смешения соседних цветов). В результате даже простая линия или кружочек, нарисованные во Flash, выглядят приятно для глаз. Что же тут говорить о рисунках, нарисованных профессионалами.

  • Удобство. Создавать страницы во Flash под силу даже ребенку, и, признаюсь, это весьма приятное занятие. А если обладать элементарными навыками дизайна и рисования, открывается весь простор для Вашей фантазии, предоставляемый Flash.

  • Распространенность. Flash потихоньку становится стандартом де-факто (см. статистику ниже). В случаях, где необходима широкая интерактивность, графика, звук, и маленький размер, Flash незаменим.



  • Статистика такова:

    На сегодняшний день Flash Player используют 222 миллиона человек, и каждый день его скачивает еще 1.4 миллиона. По данным Macromedia это позволяет 90% пользователей Сети просматривать страницы с Flash содержимым.

    Примочки распространяются бесплатно, в то время как за программу создания Flash файлов приходится платить. Последняя, 5-я версия продукта стоит $399. Пользователям старых версий это удовольствие достанется за $149.

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

    Эта (первая) часть статьи - обзорная. О том, стоит ли писать продолжение, я буду судить по Вашим откликам. Я буду очень рад поделиться своим опытом со всеми читателями и посвятить новичков в захватывающее действо творчества с помощью Flash. К сожалению, у меня нет времени заниматься созданием полноценного ресурса (сайта по Flash, скажем). Но написание иллюстрированных обучающих статей (tutorials) в моей власти. И если интерес к этой теме будет высок, я с удовольствием продолжу цикл, раскрывая возможности Flash 5. О том, насколько Вас это заинтересовало, яростно пишите на .

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

    Итак, приступим.

    Будем считать, что у вас уже есть Flash 5. Программа работает под Windows 95/98/NT/2000. Установить ее очень легко - с этим справится любой, кто установил хотя бы парочку программ в Windows. После установки можете смело заходить в нее, и вот, приблизительно, то, что вы увидите:


    Macromedia Flash 5. (часть первая)

    Интерфейс Flash 5 очень похож на интерфейс программ Adobe. Он весьма удобен и легок. После некоторого времени работы с программой понимаешь, как хорошо все продуманно и сколько труда разработчики Macromedia вложили в свое детище.

    Слева находятся панели инструментов. С помощью них можно выбирать инструменты, а также управлять рабочей областью, модифицировать объекты и выбирать простые цвета. Справа находятся диалоги настройки инструментов, цвета, текста, свойства кадров и объектов. Посередине - рабочая область, где мы будем творить, а над ней шкала времени (Timeline).

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

    Странички (файлы, анимации - как хотите) Flash принято называть фильмами (Movie), хотя мне больше нравится слово "мультик". Наверное, это оттого, что во Flash имеется шкала времени и, хоть вы и обладаете безграничными возможностями по использованию этой шкалы, ваше творение все равно будет упорядоченно выполнятся во времени. На самом деле, вы можете останавливать, вновь запускать мультик, прыгать с одного кадра на другой, загружать другие мультики и много еще чего.

    Процесс создания состоит в следующем. Вы создаете так называемый "авторский файл", который имеет расширение .fla, а затем он транслируется в результирующий .swf файл, который уже может быть просмотрен в браузере, обрамлен с помощью HTML, и т.д. Кстати, Flash может записать ваше творение в отдельный исполняемый .exe файл, сгенерировать java-код. И даже сохранить в виде статического GIF изображения.

    Давайте попробуем нарисовать первый простой мультик. Нам понадобятся инструменты - "овал" Macromedia Flash 5. (часть первая) и "выделение" Macromedia Flash 5. (часть первая). Выполните следующую последовательность действий:


  • Выберите инструмент "овал" и нарисуйте с помощью него овал или круг в левой части сцены.


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


  • Теперь войдите в меню Insert и выберите Convert to symbol (или нажмите F8). В появившемся диалоге выберите селектор Graphic и нажмите ОК:


  • Macromedia Flash 5. (часть первая)

  • Теперь выберите на шкале времени вверху 25-й кадр (просто щелкните по нему мышкой), и выберите меню Insert -> Keyframe (или нажмите F6). Этим вы создадите так называемый "ключевой кадр" на 25-м кадре вашей шкалы времени. У вас должно получиться нечто похожее:


  • Macromedia Flash 5. (часть первая)

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


  • Вернитесь на шкале времени в 1-й кадр. (В доказательство Вы должны увидеть свою фигуру опять в левой части экрана). Из меню Insert (или из контекстного меню при нажатии правой клавиши мыши на первом кадре) выберите Create motion tween.


  • Поздравляю! Вы только что сделали очень простой, но уже мультик, во Flash. Выберите Control > Play (или просто нажмите Enter) чтобы просмотреть результат.

  • Давайте добавим кое-что в наш мультик. Выберите опять 25-й кадр и выделите вашу фигуру. Войдите в диалог Effect. Если сложно отыскать нужную закладку в диалогах справа, выберите Window > Panels > Effect. В выпадающем списке в этом диалоге выберите Alpha (прозрачность), а появившийся параметр опустите до 0%.


  • Macromedia Flash 5. (часть первая)

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

  • Последний шаг. Нам нужно оттранслировать наше творчество в .swf файл и сгенерировать HTML файл, который загружал бы мультик в браузер. Это можно сделать, выбрав File > Publish (или нажав Shift-F12).


  • Теперь можно открыть созданный вами HTML файл в браузере. Это можно сделать даже из Flash, выбрав File > Publish Preview > HTML (или нажав F12). При этом Flash воспользуется браузером, установленным по умолчанию.

    Вот, вкратце, цикл создания простой сценки во Flash.

    Содержание (и вообще, написание) будущих статей на тему Flash зависит от ваших откликов. Я искренне надеюсь на, что в ближайшем будущем в Рунете (если называть так российскую часть Интернета) появятся достойные ресурсы по Flash и буду рад поделится своим опытом.

    Ссылки:

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

    Англоязычные:

    Самое главное место - Flash на сайте Macromedia. Отсюда можно также скачать примочку.

    Это место, где я черпаю 90% ресурсов по Flash:

    А здесь можно посмотреть на игры, которые писались еще на Flash 4:



    Русскоязычные:

    Flasher.ru - одно из немногих Flash мест на Руси. По сравнению с западными сайтами, ресурсов мало, но для нашего Рунета - вполне.

    Дизайн и графика - советы по Flash. Рекомендую начинающим. Много полезных вещей, очень приятно сделанный сайт. Единственный drawback - все про Flash 4.

    Macromedia Flash





  • ,



  • , http://www.jdesign.ru



  • , www.jdesign.ru



  • Арсений Чеботарев,





  • оригинал:

    перевод:



  • ,



  • ,



  • ,



  • ,



  • ,



  • ,



  • Рубен Сардарян,



  • Рубен Сардарян,



  • Рубен Сардарян,



  • Рубен Сардарян,



  • Рубен Сардарян,
    Эта статья представляет собой обзор новых возможностей Flash MX, очередной версии Flash.





  • Максим Косенко



  • Власов А.И., к.т.н., доцент












  • ,



  • , http://www.jdesign.ru



  • , www.jdesign.ru



  • Арсений Чеботарев,





  • оригинал:

    перевод:



  • ,



  • ,



  • ,



  • ,



  • ,



  • ,



  • Рубен Сардарян,



  • Рубен Сардарян,



  • Рубен Сардарян,



  • Рубен Сардарян,



  • Рубен Сардарян,
    Эта статья представляет собой обзор новых возможностей Flash MX, очередной версии Flash.





  • Максим Косенко



  • Власов А.И., к.т.н., доцент







  • Об авторе.

    Максим Косенко - Исполнительный Директор компании Subpixel . Соавтор и главный редактор проекта Reflash . Специалист по технологическому анализу. Опыт коммерческого применения интернет-технологий с 97го года.

    Оптимизация Macromedia Flash

    Рубен Сардарян

    За последний год технология Flash завоевала много умов и сердец, в том числе и в России. Для некоторых Flash стал профессией, некоторые использовали его для украшения своих страниц, а некоторые просто цокали языками в восхищении, увидев его интерактивные возможности. Появились книги по Flash, материалы в сети. Можно однозначно сказать, что "дело Flash" в России интенсивно продвигается. Итак…
    До сих пор мы задавались вопросом - как сделать? Но просто сделать, это еще не признак мастерства. Настоящий профессионал будет всегда задавать вопрос - как сделать хорошо? Чтобы сделать хорошо, надо досконально знать свой инструмент, обращая внимание на мельчайшие детали, и правильно разрешать компромиссы, касающиеся этих деталей. Речь пойдет об оптимизации во Flash.
    Статья поделена на два раздела: один посвящен оптимизации скорости и качества исполнения, другой - оптимизации размера .swf файлов.

    Основные действия с Movie Clips

    Огромная доля творчества во Flash приходится на манипуляцию символами. Практически все базовые приемы, все трюки и эффекты невыполнимы без этих действий.
    С помощью сценариев на ActionScript вы можете выполнять практически любые действия над символами. Надо только помнить, что выполнить эти действия можно только либо в ответ на действие пользователя, либо при наступлении какого-то кадра на временной шкале.
    Итак, что же у нас есть? Я перечислю только основные (на мой взгляд) инструменты. Остальное вы найдете в списке элементов языка или в помощи.
    Функции клипов (movie clip), которые можно вызывать:
  • play() - начинает или возобновляет воспроизведение клипа;
  • stop() - останавливает воспроизведение клипа;
  • gotoAndPlay() - переходит на определенный кадр (сцену) и продолжает воспроизведение;
  • gotoAndStop() - переходит на определенный кадр (сцену) и останавливает воспроизведение.

  • Свойства (параметры) клипов, которые можно считывать/изменять:
  • _x, _y - координаты клипа (в пикселях);
  • _xscale, _yscale - масштаб клипа (в процентах), соответственно по горизонтали и по вертикали;
  • _width, _height - ширина и высота клипа (в пикселях);
  • _rotation - угол поворота клипа (в градусах);
  • _alpha - прозрачность клипа (в процентах);
  • _visible - видимость.

  • Это далеко не все, что можно делать с клипами. Используйте другие параметры, экспериментируйте, творите!

    Отчет

    Flash может генерировать отчет, в котором по байтам расписан весь фильм. (Publish Settings -> Flash -> Generate size report). Для примера, мы рассмотрим следующий мультик:
    В этом фильме 70 кадров. В отчете (см. ниже) отражено количество байт, нужное для каждого кадра (Frame Bytes), и размер фильма к этому кадру (Total Bytes). Исходя из этих данных можно рассчитать требуемую скорость линии передачи, чтобы Flash-фильм мог отображаться без задержек.
    После отчета по кадрам идет отчет по сценам - какая сцена сколько занимает, а затем - по символам. 136 байт на первой (и единственной) сцене занимает фраза "(С). Rouben Sardarian, 2001". Этот текст использует опцию Use Device Fonts, и поэтому занимает мало места.
    Слово "Optimized" и буквы слова "Flash" являются символами, причем на каждую букву этого слова отводится два символа - один содержит графику, другой анимацию (движение вверх-вниз). Заметьте, что буквы, использованные в слове "Flash" не используют шрифт (см. конец отчета - там нет шрифта Arial, которым это слово было написано). Эти буквы были преобразованы в "самостоятельную" графику, после ввода текста (Modify->Break Apart, Ctrl+B).
    В конце отчета помещаются данные о шрифтах, звуке и изображениях. Звук и импортированные изображения отсутствуют в нашем примере, поэтому в отчете данных о них нет.
    Зато мы можем увидеть, что описание шрифта для фразы "(С). Rouben Sardarian, 2001" занимает 20 байт. Прибавив к этому 136 байт, которые описывают фразу, получаем 156 байт. Сравните это с 519 байтами (470 байт - 8 букв, из которых состоит слово "Optimized" + 49 байт описание слова).
    Вот как выглядит отчет:
    Movie Report ------------
    Frame # Frame Bytes Total Bytes Page ------- ----------- ----------- --------------- 1 3294 3294 Scene 1 2 566 3860 2 3 17 3877 3 4 17 3894 4 5 17 3911 5 6 17 3928 6 7 17 3945 7 8 17 3962 8 9 17 3979 9 10 17 3996 10 11 17 4013 11 12 17 4030 12 13 17 4047 13 14 17 4064 14 15 17 4081 15 16 17 4098 16 17 17 4115 17 18 17 4132 18 19 17 4149 19 20 17 4166 20 21 17 4183 21 22 17 4200 22 23 17 4217 23 24 17 4234 24 25 17 4251 25 26 17 4268 26 27 17 4285 27 28 17 4302 28 29 17 4319 29 30 17 4336 30 31 17 4353 31 32 17 4370 32 33 17 4387 33 34 17 4404 34 35 17 4421 35 36 17 4438 36 37 17 4455 37 38 17 4472 38 39 17 4489 39 40 17 4506 40 41 16 4522 41 42 16 4538 42 43 16 4554 43 44 16 4570 44 45 16 4586 45 46 16 4602 46 47 16 4618 47 48 16 4634 48 49 16 4650 49 50 16 4666 50 51 16 4682 51 52 16 4698 52 53 16 4714 53 54 16 4730 54 55 16 4746 55 56 16 4762 56 57 16 4778 57 58 16 4794 58 59 16 4810 59 60 16 4826 60 61 16 4842 61 62 16 4858 62 63 16 4874 63 64 16 4890 64 65 16 4906 65 66 17 4923 66 67 17 4940 67 68 17 4957 68 69 17 4974 69 70 30 5004 70

    Page Shape Bytes Text Bytes ----------------------- ----------- ---------- Scene 1 0 136

    Symbol Shape Bytes Text Bytes ----------------------- ----------- ---------- Optimized 0 49 H 97 0 Letter5 0 0 S 308 0 Letter4 0 0 A 112 0 Letter3 0 0 L 71 0 F 96 0 Letter2 0 0 Letter1 0 0

    Font Name Bytes Characters ----------------------- -------- ----------- Century Gothic Bold Italic 470 DEIMOPTZ Arial 20

    Отладка в ActionScript

    Последнее, что мы рассмотрим в этой статье - окна Output (вывод) и Debugger (отладчик). Это инструменты, служащие для отладки сценариев ActionScript.
    Окошко Output пришло из Flash 4, где оно было единственным инструментом для отладки. Существует директива trace(), которая выводит сообщения в это окошко. Туда же выводятся сообщения об ошибках.
    Использовать trace очень просто:
    trace ("280-й кадр");
    или, например,
    trace (xpos + k);
    В 5-м Flash появился специальный инструмент - окошечко Debugger. Чтобы им пользоваться, нужно проверять свои фильмы не как обычно (Test movie, Ctrl+Enter), а с помощью Debug movie (Ctrl+Shift+Enter). Окошко Debugger (рис. 4) можно скрыть/показать с помощью Window->Debugger.
    Отладка в ActionScript
    Рис. 4 - Окно Debugger
    В одной части окна Debugger находится иерархический список объектов, используемых в фильме. Выбрав объект, можно просматривать его свойства (закладка Properties).
    Под закладкой Variables находятся все переменные. Преимущество закладки Variables состоит в том, что вы можете модифицировать значения любых переменных "на лету" и тут же получать отражение этого изменения в фильме.
    И, наконец, можно добавить любые переменные в список просмотра (Watch list) и наблюдать за их значениями (закладка Watch).
    Debugger позволяет отслеживать практически любые параметры Flash-фильмов. Тем не менее, я считаю, что свое применение есть и у окошка Output, и у Debugger-a.
    Вот и все на этот раз. Это - последняя статья из цикла. К счастью, сейчас появилось много материалов и руководств по основам Macromedia Flash 5. Статьи по различным аспектам Flash постепенно переводятся/сочиняются на русском языке и появляются на наших сайтах. Последующие материалы по Flash будут посвящены его "продвинутым" аспектам. Так же есть идея написания руководств по другим программам, производящим Flash-фильмы (в частности трехмерные).
    Удачи вам! У вас есть великолепное средство делать сеть (и не только сеть) красивее! Пользуйтесь им, доставляя удовольствие посетителям ваших творений и самим себе.

    P.S.

    Все оригиналы статей с сайта перекочевали на сайт , милости просим в новое жилище :).

    Все статьи с Flash примерами, а так же исходники моих фильмов можно найти на моей страничке: , письма шлите на .


    Появился обещаный список ссылок на Flash-ресурсы:
    Теперь все мои материалы (с примерами на Flash) можно найти здесь:


    Спасибо большое всем читателям, так тепло откликнувшимся о статьи! Спасибо за конструктивную критику и мотивирующие пожелания!
    Я получил очень много писем с вопросом "a как сделать во Flash?.." Я честно пытался помочь всем, но за неимением времени, не всегда мог это сделать, поэтому не судите строго.
    Следующая статья будет посвящена основам ActionScript - событийно-управляемого языка, который создает интерактивность во Flash. Так же, я надеюсь поместить туда систематизированный каталог по Flash ресурсам.

    Панель действий (Actions Panel)

    Панель действий служит для отображения и ввода ActionScript-программ (рис. 1). Существует два режима работы с панелью - нормальный (для "чайников") и экспертный. В экспертном режиме список команд - это простое поле для ввода текста. В нормальном же режиме мы не можем напрямую редактировать команды. Для этого используется панель параметров.
    Добавить инструкцию можно, нажав на кнопку "+" (см. рис. 1) или выбрав соответствующую инструкцию в списке элементов языка. Кроме того, для всех действий во Flash имеются последовательности клавиш, с помощью которых это можно сделать гораздо быстрее. Они приведены справа от каждого действия в меню кнопки "+". Например, чтобы добавить функцию stop(), нужно нажать Esc+st (последовательно: Esc, затем "s", затем "t").
    Удалить инструкцию можно, выбрав ее и нажав кнопку "-" (или просто клавишу Delete).
    Я рекомендую вам не начинать сразу же пользоваться экспертным режимом, если у вас нет опыта программирования на Java-подобных языках (С++, Java, JavaScript). У нормального режима есть большое достоинство, делающее его незаменимым для новичков - в этом случае гораздо меньше шансов ошибиться с синтаксисом языка. Новичкам это поможет быстрее понять тонкости ActionScript.
    Панель действий (Actions Panel)
    Рис. 1 - Панель действий
    В панели действий отображаются действия объекта либо кадра, выбранного в данный момент.

    Поточное воспроизведение и предварительная загрузка

    Flash, специально приспособленный под Сеть, является поточным форматом. Это означает, что фильмы Flash могут начать воспроизводиться, не загрузившись до конца. С одной стороны, это преимущество, т.к. фильм начинает воспроизводиться достаточно рано, и пользователю нет нужды ждать конца загрузки. С другой стороны, если канал, по которому передаются данные, окажется уже, чем нужно для передачи Flash-потока, анимация будет приостановлена, и пользователю, как при просмотре "Санта-Барбары", на самом интересном месте придется ждать "следующей серии".
    Это еще один компромисс, который нужно учитывать. Если для вас незначительны такие задержки, или у вас есть уверенность, в том, что каналы связи не подведут - вам не о чем беспокоится. Но если вам хочется, чтобы ваш клип воспроизводился без задержек, тогда его надо снабдить предварительным загрузчиком (preloader) - это прием, позволяющий задержать воспроизведение до полной загрузки фильма.
    Имеет смысл протестировать работу вашего фильма на нескольких скоростях с помощью функции Test Movie (Control->Test Movie, Ctrl+Enter). Скорость можно выбирать в меню Debug, которое появляется после запуска фильма.

    Поточный звук

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

    Повторное использование, символы

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

    Пути

    Путь до объекта - это запись имени объекта с учетом иерархии. Попытаюсь объяснить, что это такое.
    Вы знаете, что во Flash объекты можно "вкладывать" друг в друга, составляя таким образом иерархию. Так вот, эта вложенность обеспечивает не только удобство в обращении с объектами, она еще и ограничивает видимость имен объектов. Видимость ограничивается своим уровнем. Объект может напрямую (по имени) обращаться только к объектам, входящим в него, стоящим на 1 уровень ниже в иерархии.
    Для того чтобы обратиться к объекту другого уровня, нужно знать путь до него. Причем путь может указываться как абсолютно (с самого верхнего уровня иерархии), так и относительно (с текущего уровня).
    Путь включает в себя объекты, через которые нужно "пройти" по дереву иерархии, чтобы добраться до нужного нам объекта. Имена объектов перечисляются через точку. Кроме того, существует несколько указателей (можно их назвать "виртуальными объектами"), которые часто очень полезны:
    this - указатель на "самого себя" (т.е. на текущий объект). Бывает нужен, например, для передачи в функцию указателя на объект, из которого эта функция вызывается.
    _parent - указатель на "родителя". Указывает на объект, стоящий в иерархии одним уровнем выше.
    _root - "корень". Это начало иерархии. Без него не обойтись при указании абсолютного пути.
    Путь выглядит так:
    leaf.play(); - у подобъекта leaf (лист) вызывается функция play();
    _parent.tree.leaf.stop(); - подразумевается, что на одном уровне имеется объект tree, у которого есть объект leaf, у которого и вызывается функция stop();
    _root.banner._visible = false; - сделать клип banner, находящийся на 1-м уровне, невидимым.
    у нас находится на первом
    Рис. 3 - Иерархия клипов
    Для иллюстрации возьмем иерархию из 5-ти объектов (рис. 3). Объекты 1-4 находятся на 1-м слое, объект 5 - на 2-м слое. Объект 2 вложен в объект 1, а объект 3 вложен в объект 2. Объекты на рисунке визуально вложены друг в друга, но это ни в коем случае не означает, что так должно быть и "в жизни". Здесь они так сгруппированы для наглядности. Так как имя объекта не может начинаться с цифры, пусть объекты у нас называются obj1-obj5.
    Теперь займемся путями. Для начала посмотрим, какие объекты могут обращаться друг к другу по имени. obj1 может обращаться к obj2, а obj2 - к obj3, но при этом obj1 не может обратиться к obj3 напрямую, т.к. тот содержится не в obj1, а в obj2.
    Например, первому объекту нужно, чтобы объект 3 начал заново воспроизводиться с 1-го кадра. Вот как это делается:
    obj2.obj3.gotoAndPlay(1);

    у нас находится на первом

    Чтобы 4-му объекту сделать 1-й объект (заметьте - со всеми подобъектами!) полупрозрачным, ему нужно в своем сценарии написать следующее:

    _parent.obj1._alpha = 50;

    или

    _root.obj1._alpha = 50;

    Так как obj4 у нас находится на первом уровне иерархии, то для него _root и _parent - одно и то же.

    Теперь для объекта 3 напишем скрипт, который сделает объект 5 невидимым при нажатии клавиши мыши. В сценарии для объекта 3 пишем:

    onClipEvent (mouseDown) { _root.obj5._visible = false; }

    В этом фрагменте мы использовали абсолютный путь. Если бы мы использовали относительный, это выглядело бы как:

    _parent._parent._parent.obj5._visible = false;

    Надеюсь, я прояснил момент с путями.

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

    Вы можете попробовать использовать обработчик onClipEvent, задавая различные условия и выполняя различные действия с объектами при этом.

    Одними из самых важных являются функции управления ходом воспроизведения клипа (play(), stop(), gotoAndPlay(), gotoAndStop()). Функции play() и stop() вызываются без параметров, в то время как в goto нужно указывать кадр, и, возможно, сцену.

    Размер .swf файлов

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

    Размеры и "количество" анимации

    Имеются способы повысить fps. Первый, наверное, не самый выгодный - уменьшить размеры воспроизводимого клипа: на слабой машине клип с размерами 300x200 будет воспроизводиться гораздо лучше, чем, скажем, клип с размерами 600x400.
    Второй заключается в нескольких простых правилах составления анимации:
    1) Самое простое: чем больше у вас анимирующихся объектов в сцене, тем сложнее Flash обрабатывать их, и тем медленней будет воспроизведение.
    2) Выгодней использовать один символ, содержащий мелкие объекты, чем много символов, отдельно для каждого объекта. В качестве примера можно привести имитацию снега на клипе. Много символов, каждый из которых будет отвечать за отдельную снежинку, будут двигаться гораздо медленней, чем один символ, отвечающий за весь снег.
    3) Не держите символы на сцене, если вы их не используете. К сожалению, Flash не настолько интеллектуален, чтобы не просчитывать клипы с _alpha или _vizible равными нулю. Если клип невидим, лучше его убрать со сцены, а потом, когда будет нужно, его показать.
    Имейте ввиду эти моменты, когда создаете анимацию во Flash.

    что ваши творения будут не

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

    Скорость исполнения фильмов

    Общеизвестно, что плавность анимации достигается большим количеством проигрываемых кадров в секунду (fps - frames per second). Следовательно, мы стремимся указывать большую скорость в свойствах Flash-фильма. (По умолчанию, Flash использует значение 12 fps. Для качественной анимации требуется минимум 25-30 fps).

    12 fps 35 fps

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

    Текст, шрифты

    По умолчанию, Flash преобразует все используемые буквы (я не использую слово "символ" чтобы не путать с известным термином Flash) в полигоны. Это означает, что для фразы "Жили-были дед да баба" Flash сохранит начертания букв "Жилбыдеа-". Каждая буква сохраняется в виде полигона, который потом размножается нужное количество раз. Причем, если мы напишем ту же фразу другим шрифтом, Flash будет вынужден сохранить начертания букв этого шрифта тоже. Представьте, сколько места займет описание целого шрифта, в случае если мы задействуем весь алфавит (плюс ко всему, Flash различает прописные и строчные буквы)!
    Есть способ избежать сохранения шрифта, правда придется пожертвовать сглаженными краями букв. Для этого нужно выбрать Use Device Fonts, в опциях текста. При этом Flash будет сохранять не начертания букв, а только характеристики и название шрифта (на практике, это всего несколько байт). При воспроизведении будет использован указанный шрифт, либо, если такого шрифта не окажется в системе, Flash использует ближайший по характеристикам шрифт.
    Отсюда выводы: большие объемы текста лучше не хранить во Flash, (а использовать, например, HTML) - Flash подходит больше для коротких надписей, лозунгов и т.п.; стараться использовать меньше различных шрифтов. Если уж очень нужно поместить большое количество текста во Flash, используйте опцию Use Device Fonts. Все это сократит размер создаваемого файла.

    Термины

    Прежде чем мы перейдем к конкретным действиям, несколько терминов из области ActionScript:
  • Действия (Actions) - это инструкции, которые говорят Flash-мультику, что делать. От них произошло название языка - ActionScript (дословно - сценарий действий). Давайте договоримся, что в рамках этой статьи мы будем использовать термин "инструкция", дабы не путать их с настоящими действиями, которые будем производить.
  • События (Events) - это действия, которые происходят, когда проигрывается мультик. События, например, могут происходить, когда заканчивается загрузка какого-то кадра, когда мы достигаем какого-то кадра, когда пользователь нажимает клавишу на клавиатуре или курсор мышки оказывается над нашим объектом.
  • Выражения (Expressions) - это любая часть инструкции, которая порождает значение. Следующие примеры являются выражениями: 2 + 2, 2 * 2, a + b, 2*pi*r, (15 + k) * random(10).
  • Функции (Functions) - это блоки кода, которые можно многократно использовать. Функциям можно передавать значения и получать от них результат. Например, number= get_color(15, 24). 15 и 24 являются аргументами (или параметрами) функции get_color, возвращаемое значение которой записывается в переменную number.
  • Классы (Classes) - это типы объектов. Например, класс дерева - растение. Во Flash есть некоторое количество предопределенных классов (очень похожих на классы JavaScript). Вы можете создавать свои классы или модифицировать существующие.
  • Экземпляры (Instances) - это буквально экземпляры определенных классов. Например, экземпляром растения могут являться дерево, куст или цветок. Экземпляр - это уже конкретный реальный объект. Если класс - это определение объекта (экземпляра), то экземпляр - это уже конкретное воплощение, это класс в действии. Каждому экземпляру можно присвоить имя, чтобы через него обращаться к функциям или переменным объекта.
  • Обработчики (Handlers) - это специальные инструкции, которые обрабатывают события. Например onClipEvent - обработчик действий, связанных с конкретным символом (см. Macromedia Flash ч. 2).
  • Операторы (Operators) - это элементы языка, которые вычисляют значения, исходя из одного или более аргументов. Например, оператор сложения (+) возвращает сумму двух значений, стоящих слева и справа от него.
  • Переменные (Variables) - это идентификаторы, которые могут хранить значения. Например, a = 5; или name = "Michael".

  • Эти термины мы будем использовать при обсуждении ActionScript. Итак...

    и все, что нужно для

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

    Звук

    Очевидно, что использование звука сильно увеличивает размер Flash-файлов. Звук тоже поддается оптимизации во Flash.
    В параметрах публикации (Publish Settings) можно установить тип компрессии и качество звука. В большинстве случаев имеет смысл использовать компрессию MP3, выбирая качество "по потребности". Чем шире поток (bit rate), тем больше места занимает звук.
    В общем случае, на размер звуковых данных влияют частота дискретизации (sample rate) и количество каналов (стерео, моно). Понятно, что стерео звук будет занимать в два раза больше места, чем моно, и что звук оцифрованный с частотой дискретизации 44 kHz, ровно во столько же раз больше отрывка с частотой 22 kHz. Частоту дискретизации относительно исходной можно понизить, повышать ее не имеет смысла (лучше от этого звук не станет).
    Еще способ, сократить затраты на звук - проигрывать один и тот же фрагмент несколько раз. Например, вам нужен фрагмент звуков джунглей, длиной 40 секунд. Вы можете взять фрагмент, длиной 10 секунд и повторить его несколько раз, при этом будут сохранены только требуемые 10 секунд записи.

    Рассуждение о "прелоадере"

    (Macromedia Flash 5.0).

    ,

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

    Нам нужны всего две конструкции:

    GetBytesTotal() и   GetBytesLoaded()

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

    Напишем простейший прелоадер, для этого создадим новый файл. На Scene1 разместим надписи: Bytes Total, Bytes Loaded, Percent и три "пустые" надписи. Получается примерно следующее:

    Рассуждение о


    Теперь в окне Text Options определяем надписи как динамические и назначаем имена переменных для этих надписей (сверху вниз), например: TotalField, LoadField и PercentField:

    Рассуждение о


    Для первого кадра в окне Actions (установите режим Expert Mode) пишем код (все кадры - ключевые):

    Total = _root.GetBytesTotal();

    Переменной Total (можно не объявлять) присваиваем размер файла в байтах;

    TotalField = Total;

    Переменной для надписи TotalField присваиваем значение переменной Total.
    Больше к этому кадру ролик не обращается. (Маловероятно, что размер вашего файла будет изменяться в процессе загрузки).

    Во втором кадре пишем код:

    Load = _root.getBytesLoaded();

    LoadField = Load;

    Percent = int(Load / Total * 100);

    PercentField = Percent + "%";

    Переменной Load присваиваем значение загруженной части файла;

    Переменной для надписи LoadField присваиваем значение переменной Load.

    Переменной Percent присваиваем увеличенное в 100 раз округленное значение отношения загруженной части файла к размеру файла, т. е. процентное значение загрузки;

    Переменной для надписи PercentField присваиваем значение переменной Percent и знак "%".

    Третий кадр:

    if (load < Total){gotoAndPlay (2);};


    Если загружено меньше, чем размер файла - перейти к кадру 2. В первом кадре мы уже все сделали. Зачем туда обращаться?

    Кадр 4:

    Stop();

    В этом же кадре, но на другом слое уже начинается сам ролик. Разумно нарисовать кнопку Play и передавать управление на начало ролика.

    Если вы сделали все правильно, то получится примерно следующее (это только картинка):

    Рассуждение о


    Если не вышло - вот .

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

    А нужен ли вообще прелоадер? Ответить на этот вопрос поможет сам Flash!

    В режиме Test Movie в меню Debug выберите или установите свою скорость загрузки файла (учтите, что реальная скорость загрузки у пользователя будет гораздо ниже указанной):

    Рассуждение о


    В меню View выбираем пункт Show Streaming:

    Рассуждение о


    Тестируем наш ролик на различных скоростях загрузки:

    Рассуждение о


    Успехов!

    PS. Обратите внимание: реальный размер ролика 2470 байт, а Flash "говорит", что 2468 байт! Я не знаю почему. Кто знает?


    Снег во Flash

    ,

    В этом уроке предлагается разобраться с ActionScript, а заодно научиться делать "настоящий" снег:


    Итак, шаг 1: В вашем любимом графическом пакете создайте картинку 480 х 60 px. Это наш фон. (Я поставил максимальное сжатие и самое плохое качество). Если у вас там всякий лес цветной разный нарисован - подберите степень сжатия, чтобы фон не смотрелся убого. Но учтите, что чем сложнее фон - тем больше размер баннера.

    Шаг 2: Теперь надо браться непосредственно за Flash. Создайте новый файл. Цвет фона значения не имеет. Измените параметр Modify | Movie... | Frame Rate с 12 до 50 и установите размер 480 х 60 px. Добавьте еще 2 слоя. Назовите слои соответственно "Snow", "Text" и "Back". В кадр 50 для каждого слоя вставьте фрейм:

    Снег во Flash


    Шаг 3: Вызываем пункт меню Insert | New Symbol... В разделе Name называем символ: "Back" , параметру Behavior назначаем Button. Импортируем наш фон: File | Import... В панели Info Устанавливаем размер 480 х 60:

    Снег во Flash


    Помещаем символ Back на слой Back и центрируем:

    Снег во Flash


    Шаг 4: Создание символа "Снежинка". Создаем новый символ: Insert | New Symbol... с именем Snow и типом "Movie Clip". Не забудьте: заливка должна быть белой, фон - прозрачный. Можно воспользоваться векторным редактором Flash или скопировать нарисованный символ, например, из программы Corel Draw (Я так и сделал. Вот ).

    Снег во Flash


    Размер снежинки 70 х 70 px. Нажмите Ctrl+Shift+G, чтобы разгруппировать изображение. Поместите Movie Clip Snow на слой Snow и в панели Instance присвойте имя Snow:

    Снег во Flash


    Установите позицию символа -35:

    Снег во Flash


    Шаг 5: Создание надписи. Создайте новый символ с именем Text, типом "Movie Clip" и поместите в него текст. Преобразуйте текст в растровое изображение (Ctr+b). Установите прозрачность 30%:

    Снег во Flash


    Поместите Move Clip на слой Text и в резделе Instance присвойте имя Text. У вас должно получиться примерно так:

    Снег во Flash


    Мы сделали всю подготовительную работу. Приступим к кодированию. Для символа Snow кликом правой клавиши мыши вызываем Object Actions.

    Снег во Flash


    Включаем режим Expert Mode:

    Снег во Flash


    Теперь старательно списываем этот код:

    Снег во Flash


    onClipEvent (enterFrame)
    Событие возникает при смене кадра.

    _root.snow._y = (35 + 60 + 35) / 60 * _root._currentframe;


    Вычисляем новое положение снежинки по вертикали (35 - половина вертикального размера снежинки, 60 - высота баннера. Можно было написать сразу 130).

    _root.snow._rotation = _root.snow._rotation + rotate;

    Поворачиваем снежинку в зависимости от переменной rotate.

    if (_root._currentframe == 1)

    Если текущий кадр первый, выполняется последующий код по установке первоначальных параметров снежинки.

    var scale;

    var rotate;

    Объявляем переменные.

    rotate = random(3) - 1;

    Переменная rotate принимает случайные значения: -1, 0 и 1.

    _root.snow._rotation = random(30);

    _root.snow._x = random(480);

    Устанавливаем случайный начальный угол поворота снежинки и случайное положение по горизонтали.

    _root.Snow._alpha = random(50) + 50;

    Устанавливаем прозрачность снежинки в диапазоне 50 - 100%.

    scale = random(90) + 10;

    _root.Snow._xscale = scale;

    _root.Snow._yscale = scale;

    Генерируем случайный начальный размер снежинки в диапазоне 10 - 100%.

    Итак, со снежинками разобрались. Сделали 2 важных вывода:

    1. Все работает. Можно проверить Control | Test Movie

    2. Встроенный редактор кода просто ужасен!

    Для тех, кто разбираться в кодировании не хочет - вот ). Загрузить его в редактор кода можно следующим образом:

    Снег во Flash


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

    Снег во Flash


    Втавьте ключевой кадр в позицию 35. (Insert Keyframe). Выделите надпись и увеличьте значение Alpha в 100%:

    Снег во Flash


    Установите указатель на 1-й кадр и в панеле Frame установите значение Tweening в Shape:

    Снег во Flash


    Для первого и последнего кадров в панели Frame Actions напишите единственную строчку кода:

    stop();

    Перейдите к Scene 1, для символа Back в Frame Actions напишите следующий ):

    on (rollOver, dragOver) {_root.Text.gotoAndPlay(2);}

    on (rollOut, dragOut) {_root.text.gotoAndPlay(1);}

    Вот и все:

    Успехов!


    Рисуем "работающие" часы

    (Macromedia Flash 5.0).

    ,

    Flash позволяет работать с датой/временем. За это отвечает объект

    Date (object)

    Рассмотрим некоторые возможности объекта, позволяющие создать часы, отображающие системное время.

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

    Итак, создадим новый файл размером 100 х 50 px. На Scene1 в первом кадре поместим динамическую текстовую надпись и присвоим ей имя, например TimeField:

    Рисуем


    Для удобства размещения/выравнивания присвойте значение 00:00:00, все равно в процессе работы ролика надпись изменится. Если вы используете "экзотический" шрифт, укажите Flash, что начертание цифр и разделителя надо храниить в самом ролике:

    Рисуем


    На этом процесс "рисования" заканчивается. Приступим к кодированию.

    Для первого кадра в панели ActionScript (не забудьте установить режим ExpertMode) пишем следующий код:

    Time = new Date();

    H = Time.GetHours();

    M = Time.GetMinutes();

    S = Time.GetSeconds();

    if (Length(H) < 2) {H = "0" + H};

    if (Length(M) < 2) {M = "0" + M};

    if (Length(S) < 2) {S = "0" + S};

    TimeField = H + ":" + M + ":" + S;

    В первой строке создаем экземпляр объекта Date и присваиваем ему текущее системное время.

    В строках 2 - 4 переменным H, M и S присваеваем значения часов, минут и секунд соответственно.

    В строках 5 - 7 добавляем текстовый "0" к началу переменной в случае, если длина переменной меньше 2.

    И, наконец, в последней строке для надписи TimeField присваиваем "собранное" значение времени.

    Во втором ключевом кадре ролика пишем код:

    GotoAndPlay(1);

    Если вы правильно повторили все шаги, то часы должны "заработать". Здесь лежит .

    Мы разобрались с "электронными" часами. Попробуем сделать часы "со стрелками":

    Создаем новый файл размером 100 х 100 px. Вставляем новый слой и в свойствах называем слои соотвественно Arrows и Grid. Разумно, чтобы стрелки были расположены над циферблатом:

    Рисуем



    На слое Grid рисуем сам циферблат. Здесь . Далее создаем три новых символа с часовой, минутной и секундной стрелками. (Учтите, что поворачиваться "стрелки" будут относительно центра, помеченного "крестиком"). Назовем их соответсвенно HArr, MArr и SArr:

    Рисуем


    Помещаем символы на слой Arrows и в разделе Instance присвоим им имена HA, MA и SA:

    Рисуем


    Для первого кадра слоя Arrows в панели ActionScript (не забудьте установить режим ExpertMode) пишем следующий код:

    Time = new Date();

    H = Time.GetHours();

    M = Time.GetMinutes();

    S = Time.GetSeconds();

    HA._rotation = 30 * (H - 12) + M / 2;

    MA._rotation = 6 * M + S / 10;

    SA._rotation = 6 * S;

    Первые четыре строчки вам уже понятны по первому примеру. В строках 5 - 7 вычисляем угол поворота для соответствующих стрелок в зависимости от времени.

    Во втором ключевом кадре ролика на слое Arrows пишем код:

    GotoAndPlay(1);

    Вот и все! Посмотрите исходный этого примера. Обратите внимание на размеры swf-файлов!

    Далее все зависит от вашей фантазии. Для примера я сделал такой ролик:

    Определение наличия Flash-plugin'а средствами HTML

    ,

    В этом маленьком уроке рассказывается как определить наличие установленного плагина (примочки) Flash в браузере пользователя.
    По статистике, около 90% пользователей в наши дни пользуются Internet Explorer (5-й или 6-й версией). В этих браузерах Flash, как правило, уже установлен (если же нет, то, при наличии Интернет-соединения, установить его - дело пары минут). Тем не менее, если вам нужно на 100% быть уверенным в том, что у пользователя всё будет работать "правильно", даже если у него не установлена примочка Flash, нужно определять наличие примочки, и, в зависимости от этого, показывать Flash страничку, или контент, не сожержащий Flash.
    Здесь приведён самый простой способ проверки наличия Flash. Для этого способа потребуется лишь одна строчка в HTML и очень простой Flash-мультик.
    Вот строчка, которую нужно будет вставить в HTML файл в раздел :

    Эта строчка обращается по адресу non_flash_url через seconds_until_refresh после загрузки строчки. Например строчка

    обращается к файлу non_flash.html через 5 секунд.
    Создаём Flash мультик с минимальными размерами (во Flash 5 было ограничение - 20x20, во Flash MX можно делать мультики хоть 1x1) с единственным кадром, содержащим единственное действие:
    GetURL("flash_page.html");
    flash_page.html - страничка, содержащая Flash-контент.
    Можете скачать пример такого файла:
    Из этого файла создаём .swf файл, который помещаем в наш HTML файл (в тот где была строчка ). Что в итоге происходит? Открывается файл, содержащий строчку и маленький Flash мультик. Если в браузере установлена Flash-примочка соответствующей версии, то срабатывает действие в .swf файле и браузер переходит на страничку flash_page.html. Если же Flash примочка не обнаружена, то через 5 секунд браузер перейдёт по адресу, указаному в (в нашем случае - non_flash.html). Недостаток этого метода состоит только в незначительной задержке в несколько секунд, кот. нужны для загрузки странички. Размер .swf файла получается очень маленьким (порядка 50-100 байт), так что это не является помехой.
    Удачи!



    Определение скорости компьютера

    ,

    Для производительных роликов часто оказывается полезным определить скорость "железа", на котором они будут проиграны. (И, может быть, выбрать соответствующее качество (quality) воспроизведения). Ниже приводится простой способ определения производительности компьютера, который можно использовать во время прелоадинга (загрузки ролика) или непосредственно перед началом проигрывания ролика.
    Вот наш рабочий пример:
    Метод очень прост: мы берём кусочек анимации (длиной 1-3 секунды), совпдающей (или превосходящей) по сложности анимацию, которая используется в ролике. Запоминается значение таймера в начале анимации и в конце, а затем вычисляется длительность проигрыша кусочка. Скажем, установленная скорость ролика равна 30 кадров в секунду, а длина тестового фрагмента составляет 60 кадров. (Данные значения используются в нашем примере). В таком случае, длительность проигрыша должна составлять 2 секунды. Можно прибавить некоторое время (в нашем случае добавлено 0.5 сек) немного поэкспериментировав и определив минимальную скорость, которая требуется для проигрыша ролика. Функция getTimer(), которая используется для получения значения таймера возвращает результат в миллисекундах, что даёт нам большую чувствительность для наших тестов.
    В приведенном примере тест на скорость считается пройденным, если 60 кадров анимации проиграются меньше чем за 2500 миллисекунд.
    Можно придумать различные вариации этого способа. Только будьте осторожны с анимацией, используемой при определении скорости. Она должна требовать столько же (или даже больше) ресурсов, сколько использует ваш основной ролик. Подсказка: используйте большие по площади символы и различные эффекты цветности/прозрачности. Это хорошо нагружает видеосистему.
    Вот исходник примера, использованного в уроке: (24 k)
    Удачи!



    Flash - статьи

    Держите весь код в одном месте

    Везде, где это возможно, весь код должен размещаться в одном месте. Это облегчает его нахождение и отладку. Одна из главных сложностей в отладке клипов Macromedia Flash — это поиск кода. Если большая часть кода размещена в одном кадре, эта проблема устраняется. Обычно лучшее место для размещения кода — это первый кадр.
    Когда в первом кадре расположен большой код, разделите его на части комментариями, чтобы повысить читабельность, например:
    /*** Раздел функций для кнопок ***/

    /*** Константы и переменные ***/
    Одно исключение при размещении всего кода в первом кадре возникает в случае предварительной загрузки клипов. В приложении с предзагрузкой клипов размещение всего кода в первом кадре может быть невозможным. Но все равно нужно стремиться к централизации кода.
    В клипах с прелоадером начинайте написание кода со второго кадра. Используйте два слоя для кода — один слой для функций, а другой слой для действий, связанных с различными состояниями приложения.
    Помните, что функции и объекты, созданные программными методами ActionScript, существуют на протяжении всего клипа. Вместе с этим продолжает действовать механизм создания и уничтожения мувиклипов, базирующийся на состояниях временной диаграммы. Временная диаграмма должна отражать эту взаимосвязь.
    Держите весь код в одном месте

    Рисунок 2
    : Пример временной диаграммы ("таймлайна") с предзагрузчиком.

    Формат временной диаграммы (таймлайна)

    Избегайте использования названий слоев, принятых по умолчанию (Layer 1, Layer 2, и т.п.), так как это может привести к путанице. Слои таймлайна должны называться интуитивно понятным образом. Слои также должны быть сгруппированы вместе путем использования папок там, где это имеет смысл. Например, следует располагать все слои с кодом ActionScript на самом верху стека слоев, чтобы в таймлайне можно было легко найти весь код.
    Блокирование неиспользуемых в данный момент слоев — хорошая практика. Это предупреждает случайные изменения в документе.

    Инициализация

    Инициализация приложения используется для задания его начального состояния. Функция инициализации вызывается в приложении в первую очередь и только один раз — программой. Все остальные вызовы этой функции должны управляться событиями.
    // кадр 1

    this.init();

    function init() {

    if (this.inited != undefined)

    return;

    this.inited = true;

    // здесь идет код инициализации...

    }

    Используйте файлы #include .as

    Любой определенный вами объект или библиотека созданных вами функций должны определяться во внешнем ActionScript файле и использоваться в качестве файла включаемого (include) файла. Например, если приложение использует объекты с именами "Foo" и "Bar", каждый из этих объектов должен содержаться в отдельном включаемом ActionScript-файле. Имя включаемого файла должно соответствовать имени объекта, например:
    Foo.as

    Bar.as
    Библиотеки многократно используемых функций должны также определяться во включаемых файлах ActionScript. В этом случае имя включаемого файла должно состоять из букв нижнего и верхнего регистра (начинаясь с буквы нижнего регистра), например:
    stringUtils.as
    Такая система использования включаемых файлов делает объектно-ориентированный код ActionScript более легким для идентификации. Но более важно то, что код становится модульным, позволяя разработчикам создавать ActionScript-библиотеки объектов и функций. Только необходимый для приложения код включается из библиотеки внешних файлов.
    Кроме того, используя внешние файлы ActionScript, разработчики могут интегрировать файлы кода с системой управления версиями, например, такими, CVS или SourceSafe. Это облегчает отслеживание исходного кода.

    Используйте ключевое слово var для локальных переменных

    Все локальные переменные должны использовать ключевое слово var. Это предохраняет переменные от глобального доступа и, что более важно, предохраняет переменные от неумышленного переназначения[]. Например, следующий код функции не использует ключевое слово var при объявлении переменной, что приводит к (неумышленной) перезаписи внешней переменной, не относящейся к функции:
    counter = 7;

    function loopTest()

    {

    trace(counter);

    for(counter = 0; counter < 5; counter++)

    {

    trace(counter);

    }

    }

    trace(counter);

    loopTest();

    trace(counter);
    Этот код выводит:
    7

    7

    0

    1

    2

    3

    4

    5
    В данном случае переменная counter, находящаяся на основной временной диаграмме, переназначается переменной counter, которая находится внутри функции. Ниже приведен исправленный код, который использует ключевое слово var, для объявления обеих переменных. Использование декларации var в функции устраняет ошибку вышеуказанного кода:
    var counter = 7;

    function loopTest()

    {

    trace(counter);

    for(var counter = 0; counter < 5; counter++)

    {

    trace(counter);

    }

    }

    trace(counter);

    loopTest();

    trace(counter);
    Исправленный код выводит следующее:
    7

    7

    0

    1

    2

    3

    4

    7
    Из последней строки видно, что не принадлежащая функции переменная counter сохранила свое значение после вызова функции.

    Используйте относительные пути для задания области видимости

    Область видимости должна быть задана для каждой переменной. Исключением являются параметры функций и локальные переменные. Область видимости переменных должна задаваться относительно их текущего положения, если это возможно. Использование _root для задания области видимости переменной не рекомендуется, поскольку это ограничивает мобильность кода. Вместо _root используйте ключевое слово _parent или this, например:
    this.myVar.blah = 100; // определяйте область видимости для переменных, используя относительную адресацию, как в этой строке

    _root.myMovieClip.myVar.blah = 100; // НЕ задавайте область видимости переменных, используя абсолютные ссылки, как в этой строке
    Если все же приходится использовать абсолютную адресацию к главному таймлайну, вместо использования _root создайте переменную-ссылку на главный таймлайн. Это позволит изменять всего один параметр, если структура таймлайна изменится. Чтобы создать удобную ссылку на основной таймлайн клипа, добавьте такую строку кода к основному таймлайну:
    _global.myAppMain = this; // (замените "myApp" названием вашего приложения)
    После вставки этой строки в ваше приложение, используйте _global.myAppMain.someFunction, чтобы ссылаться на функции главного таймлайна. Это позволяет изменять структуру приложения, не нарушая область видимости вызовов функций и переменных в клипе.

    Избегайте размещения кода на мувиклипах и кнопках

    Не размещайте код на мувиклипах и кнопках, если в этом нет крайней необходимости. Если код все же должен быть размещен на мувиклипе или кнопке, используйте при этом минимальное количество кода. С этой точки зрения лучше всего вызывать функции, как в следующем примере:
    myButton.onMouseDown = function() {

    _parent.doMouseDown(this);

    }
    Использование вызова функции переносит всю функциональность на основной таймлайн мувиклипа.

    Кадры как состояния приложения

    Разработчики часто пишут построчный код (программу) прямо на отдельных кадрах, чтобы определять состояния приложения. Такая практика нежелательна.
    Правильная организация кода базируется на описании состояний приложения в ключевых кадрах. Поместите в функцию любое действие, необходимое для конкретного состояния, а затем вызывайте эту функцию как единственное действие в соответствующем ключевом кадре.
    Продолжая организацию приложения, создайте в клипе два слоя с кодом. В первом кадре первого слоя, существующего по всей длине клипа, располагается самая большая часть кода. Второй слой содержит действия, необходимые ключевым кадрам для изменения состояний приложения. Единственный код в каждом ключевом кадре второго слоя должен быть вызовом функции для конкретного состояния (вызываемая функция должна быть описана в первом кадре первого слоя). Для создания некоторых состояний (например, для вызовов диалоговых окон) допускается использование мувиклипов, присоединенных с помощью действия attachMovie во время выполнения приложения.

    Комментирование кода

    Комментируйте код всегда. Для разработчика комментарии являются хорошей возможностью рассказать, для чего написан код и что он должен делать. Комментарии должны подтверждать каждое решение — в любом месте, в котором вы производили выбор и принимали решение о способе кодирования, нужно вставлять комментарий с обоснованием сделанного выбора.
    Когда вы пишете "обходной" код для решения специфических, нестандартных задач вашего приложения, добавьте комментарий, из которого другие разработчики поймут, в чем заключалась сложность, и как вы ее обошли. Это облегчает понимание специфических проблем теми разработчиками, которые еще могут с ними столкнуться. Это просто облегчает им жизнь.
    Вот пример простого комментария для переменной:
    var clicks = 0; // переменная для подсчета нажатий кнопки
    Блочные комментарии полезны для больших кусков текста:
    /*

    Инициализирует переменную clicks, хранящую количество нажатий кнопки.

    */
    Ниже приведены некоторые общие методы для указания особо важных комментариев (в скобках предложены русскоязычные аналоги):
    // :TODO: topic (// :СДЕЛАТЬ: тема)
    Указывает, что код нужно доделать или сделать что-то еще.
    // :BUG: [bugid] topic (// :ОШИБКА: [номер ошибки] тема)
    Показывает известную ошибку ("глюк", "баг"). Комментарий также должен объяснять, в чем состоит проблема, и содержать "bug ID" (номер "бага"), если необходимо.
    // :KLUDGE: (// :ВОЗМОЖЕН ДРУГОЙ ВАРИАНТ:)
    Показывает, что соответствующий код не является элегантным или лучшим решением. Этот комментарий оповещает других, что в будущем код следует усовершенствовать.
    // :TRICKY: (// :РИСКОВАНО:)
    Уведомляет разработчиков, что код со многим взаимосвязан (его изменение повлечет изменения в других местах). Это совет разработчику: "подумай, прежде чем что-то изменять".
    Пример
    /*

    :TODO: msw 654321: проблемы с отображением больших объемов данных из БД. Наверное, следует разбивать данные на более мелкие порции для каждого запроса.

    */

    Наследование объектов

    Задание свойства "__proto__" для создания наследования практиковалось в Flash Player 5. Эта практика не поддерживается в Flash Player 6, и ее использование не рекомендуется. Свойство __proto__ должно рассматриваться как свойство только для чтения (read-only). Правильный способ создания наследования — это создание цепочки прототипов. Чтобы создать цепочку прототипов, установите свойство "prototype" функции конструктора подкласса (subclass) в экземпляр надкласса (superclass), используя следующий синтаксис:
    ChildClass.prototype = new ParentClass();
    Пример этой практики:
    function Shape()

    {

    }

    function Rectangle()

    {

    }

    Rectangle.prototype = new Shape();
    Следующая практика НЕ рекомендуется:
    Rectangle.prototype.__proto__ = Shape.prototype;
    Если разработчики беспокоятся, что такая форма наследования приведет к тому, что весь конструктор будет признан необязательным, следующий код поможет предотвратить это:
    _global.SuperClassConstructor = function() {

    if (this._name!=undefined) {

    // код конструктора размещается здесь

    }

    }
    В вышеприведенном примере код конструктора не будет выполнен, потому что еще не определен экземпляр. Заметьте, что этот код работает только в классах, основанных на классе MovieClip.

    Область видимости

    Flash Player 6 поддерживает концепцию "цепочки областей видимости" (как определено в стандарте ECMA-262). Таким образом, устранены значительные недостатки "прямой области видимости" в Flash Player 5.
    Цепочка областей видимости — это список ActionScript-объектов. Flash Player ищет идентификатор, начиная с последнего элемента в цепочке областей видимости, и продолжает подниматься по цепочке, пока не найдет его.
    Цепочка областей видимости для типичного сценария ActionScript:
  • Объект Global;

  • Объект MovieClip;

  • Локальные переменные.

  • Конструкция with временно добавляет объект в конец цепочки областей видимости. Когда действие with прекращается, объект удаляется из цепочки областей видимости.
    При определении функции текущая цепочка областей видимости копируется и хранится в объекте функции. При вызове функции происходит переключение текущей цепочки областей видимости на цепочку областей видимости объекта функции, а в конец цепочки добавляется новый объект Local Variables.
    В Flash 5 область видимости функции всегда была следующей:
  • Объект Global;

  • мувиклип, содержащий функцию;

  • Локальные переменные.

  • Список областей видимости никогда не содержал более трех пунктов, кроме случая с использованием with. Это было отклонением от стандарта ECMA-262, и область видимости метода всегда находилась в мувиклипе, содержащем метод, а не в месте определения этого метода.
    В Macromedia Flash Player 6 при определении метода мувиклипа вне самого мувиклипа цепочка областей видимости метода будет содержать внешний объект, а не объект мувиклипа, для которого определяется метод. В таком случае в теле определяемого метода необходимо использовать ключевое слово this, чтобы используемые в этом методе идентификаторы ссылались на объект мувиклипа, а не на внешний объект.
    Имейте в виду, что поддерживается обратная совместимость с Flash Player 5. Для среды разработки Flash 5 применимы те же правила использования области видимости, что и для Flash Player 5.

    Предосторожности использования оперативной памяти

    Текст. Каждый отдельный текстовый объект использует 10 КБ памяти. Это относится к динамическим текстовым полям, полям для ввода текста и статическим текстовым полям, использующим шрифты устройств ("device fonts"), например, "_sans".
    Мувиклип. Каждый мувиклип использует около 1 КБ памяти. Это число может стремительно возрастать при увеличении количества используемых мувиклипов. Имейте в виду, что графические символы (graphic) не обладают такими высокими требованиями к памяти, как мувиклипы.
    Объекты функций. Каждый объект функции создает два объекта ActionScript, вместе занимающие 700 байтов. Создание объекта функции для каждого экземпляра объекта — дорогое удовольствие с точки зрения расхода памяти. Рекомендуется всегда использовать прототипы. Прототипы создаются только один раз и помогают избежать неоправданного расходования памяти.

    Предварительная загрузка

    Главная проблема создания компонентов, хорошо согласовывающихся с процессом предварительной загрузки — это минимизация количества объектов, загружающихся перед первым кадром. Символы в первом кадре загружаются прежде, чем в проигрывателе сможет отобразиться какая-либо графика. Это означает, что даже компонент прелоадера не появится, пока не будут загружены все символы с пометкой "Export in First Frame" (экспортировать в первом кадре). Поэтому любой код ActionScript, обрабатывающий действия пользователя, должен всегда помещаться в кадре, следующем после кадра с прелоадером.

    Принципы присвоения имен

    Во-первых, схема присвоения имен должна быть последовательной, а имена должны быть удобными для чтения и понимания. Это означает, что имена должны быть понятными словами или фразами. Первичная функция или назначение любого объекта должны быть очевидными из его имени. Так как типы переменных в ActionScript контролируются динамически, то имя должно также содержать суффикс, определяющий тип объекта, на который ссылается имя. Самый естественный случай имен — это фразы типа "существительное-глагол" или "прилагательное-существительное". Например:
  • Имя клипа — "my_movie.swf";

  • Переменная для добавления к URL — "course_list_output" (вывод списка курсов);

  • Компонент или объект — "ProductInformation" (информация о продукте)

  • Переменная или свойство — "userName" (имя пользователя)

  • Имена функций и переменных должны начинаться со строчной буквы (a, b, c, ..., x, y, z). Имена объектов и конструкторов объектов должны начинаться с заглавной буквы (A, B, C, ..., X, Y, Z). Использование смешанных регистров символов рекомендуется в случае именования переменных. Другие форматы именования приемлемы, если они используются последовательно во всем проекте. Имя переменной может содержать только буквы, числа и символы подчеркивания. Не начинайте имя переменной с числа или символа подчеркивания. Неправильными именами переменных будут следующие:
  • _count = 5; // начинается с символа подчеркивания

  • 5count = 0; // начинается с числа

  • foo/bar = true; // содержит символ "слэш"

  • foo bar = false; // содержит пробел

  • Кроме того, в качестве имен переменных нельзя использовать ключевые слова ActionScript. Также избегайте использования в качестве имен переменных слов из популярных конструкций программирования, даже если Macromedia Flash Player к настоящему времени не поддерживает эти конструкции в качестве ключевых слов. Это дает больше уверенности в том, что будущие версии проигрывателя не вступят в конфликт с вашим приложением. Например, не нужно делать так:

  • var = "foo";


  • MovieClip = "myMovieClip";


  • switch = "on";


  • case = false;


  • abstract = "bar";


  • extends = true;


  • implements = 5;


  • Так как ActionScript совместим с ECMAScript, авторы приложений могут ознакомиться со списком зарезервированных слов, приведенных в . Пока Flash MX не поддерживает константы, разработчики должны применять следующий принцип: имена переменных набирать символами нижнего регистра, а имена переменных-констант — только символами верхнего регистра. Например:

  • course_list_output = "foo"; // переменная


  • courseListOutput = "foo"; // переменная


  • BASEURL = http://www.foo.com; // константа


  • MAXCOUNTLIMIT = 10; // константа


  • MyObject = function{}; // функция конструктора


  • f = new MyObject(); // объект


  • Редактор кода ActionScript в среде разработки Flash MX имеет встроенную функцию "завершения кода". Эта функция помогает вам писать код, предоставляя в виде выпадающего списка возможные варианты завершения кода. Чтобы вы могли пользоваться этим преимуществом, имена ваших переменных должны соответствовать определенному формату. В этом встроенном формате суффикс имени переменной является строкой, указывающей на тип переменной. Ниже приведена таблица поддерживаемых суффиксов:



    Таблица 3
    : Суффиксы для активации функции завершения кода

    Тип объекта Суффикс Пример
    String _str myString_str
    Array _array myArray_array
    MovieClip _mc myMovieClip_mc
    TextField _txt myTextField_txt
    Date _date myDate_date
    Sound _sound mySound_sound
    XML _xml myXML_xml
    Color _color myColor_color
    Button[] _btn myButton_btn
    TextFormat _fmt myTextFormat_fmt
    XMLSocket _xmlsocket myXmlSocket_xmlsocket
    FListBox _lb myFListBox_lb
    FScrollBar _sb myFScrollBar_sb
    FComboBox _cb myFComboBox_cb
    FScrollPane _sp myFScrollPane_sp
    FMessageBox[] _mb myFMessageBox_mb
    FDraggablePane _dp myFDraggablePane_dp
    FTicker tick_ (префикс) tick_myFTickerMain
    FTree _tree myFTree_tree
    FTreeNode _tn myFTreeNode_tn
    FIconButton _ib myFIconButton_ib
    FProgressBar _pr myFProgressBar_pr
    <


    Вы увидите эту функцию в действии, если наберете в панели Actions один из примеров и символ точки. Например, введите myString_str. — появится выпадающий список свойств и методов для объекта String. Не забывайте о точке:

    Принципы присвоения имен

    Рисунок 1
    : Пример действия помощника завершения кода.

    Наконец, имена всех .swf-файлов должны быть набраны в нижнем регистре, а слова в именах должны быть разделены символом подчеркивания (например, "lower_case.swf"). Обсуждение соглашений об именовании включаемых файлов ActionScript см. в разделе "".

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

    _Root против _global

    Важно понимать разницу между _global и _root. Ссылка _root уникальна только в рамках каждого загруженного .swf-клипа. Ссылка _global применима ко всем клипам в пределах проигрывателя. В общем случае для ссылок лучше использовать _global , а не _root.

    Создание объектов

    При создании объекта включайте в его прототип функции и свойства, распространяемые на все экземпляры объекта. Это гарантирует, что в оперативной памяти будет находиться только одна копия каждой функции. Сделайте своим правилом не определять функции внутри конструктора — это создает для каждого экземпляра объекта отдельную копию этой же функции и приводит к излишнему расходованию оперативной памяти.
    Пример лучшей практики создания объекта:
    MyObject = function()

    {

    }

    MyObject.prototype.name = "";

    MyObject.prototype.setName = function(name)

    {

    this.name = name;

    }

    MyObject.prototype.getName = function()

    {

    return this.name;

    }
    Следующий пример демонстрирует неправильный метод создания объекта:
    MyObject = function()

    {

    this.name = "";

    this.setName = function(name)

    {

    this.name = name;

    }

    this.getName = function()

    {

    return this.name;

    }

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

    Стандарты Actionscript

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

    Типы данных и их размеры в файлах

    Таблица 2: Основные объекты ActionScript



    Тип объекта Размер, байтов
    Короткая строка (7 символов) 55
    Число 22
    Объект 340
    Пустой мувиклип 800
    Объект функция 700
    Текстовое поле 9 500

    Таблица 3: Простые .swf-файлы



    Тип простого .swf-файла Размер, байтов
    Пустой .swf-файл 250 000 (большая часть памяти уходит на встроенные объекты ActionScript)
    Пустой .swf-файл с определенным компонентом 750 000 (большая часть отводится самому .swf-файлу и объекту функции компонента)

    Таблица 4: Объекты компонентов (по одному экземпляру)



    Объект компонента Размер, байтов
    PushButton 60 000
    CheckBox 55 000
    Пустой ListBox 490 000


    Этот документ не является завершенным

    Этот документ не является завершенным набором лучших методов создания кода. Macromedia продолжает расширение документа, основываясь на информации от людей, создающих и продвигающих критически важные по своему значению приложения для Flash Player. Этот документ живой, он управляется сообществом разработчиков, как это всегда было с ActionScript и Macromedia Flash Player с самого начала их существования.
    оригинал:

    перевод:

    рецензент: fix
    Примечания:

    [] Начиная с этой строки, идут суффиксы, любезно подсказанные .

    [] Эти суффиксы активизируются при установленном Flash UI Component Set 2, который можно скачать с сайта Macromedia.

    [] Английское слово "overwriting" переведено как "переназначение", что соответствует терминологии, принятой в статьи "Объектно-ориентированное программирование в Flash 5". Весьма полезная статья.

    Flash - статьи

    Чего нет в демонстрационной версии программы?

    Много чего, например:
  • Автоматической привязки компонентов и связей к линиям сетки, что значительно упрощает рисование;
  • Изменяемой размерности линий сетки;
  • Наличия в меню реализованных пунктов Select, Copy, Paste;
  • Сохранения и восстановления нарисованной схемы узла на диске.

  • Будем считать это заданием на будущее.
    Всего хорошего, Евгений.

    Демонстрация метода.

    Загрузить демонстрационную версию программы можно отсюда (80 кб).
    Выберем в качестве объектов композиции модели различных микросхем, а затем для демонстрации метода объединим их в некоторый узел. Отметим, что выбор данной области для демонстрации метода не имеет большого значения, просто это направление нам ближе.
    В левой части загруженного приложения находится окно Tree с набором микросхем. Выберите несколько любых микросхем (далее объектов), щелкнув по каждой из них мышью. Расположите объекты на рабочем столе, так как Вы считаете нужным. Обратите внимание — объекты можно свободно перемещать, так как работает функция drag-and-drop.
    Работает так же контекстное меню, причем работает оно избирательно. Если Вы щелкнете правой мышью на пустом месте области проектирования, то увидите множество пунктов системного меню. Если щелкнете над объектом или связью (о них чуть позже), то к системному меню добавятся новые подпункты. Выбрав подпункт "Delete Component", можно удалить объект с рабочего стола.
    Чтобы объединить пару объектов связью, достаточно щелкнуть левой кнопкой мыши по любой из контактных площадок объекта, затем, не отпуская кнопки, переместить мышь на другой объект и отпустить кнопку мыши над нужной контактной площадкой. Будет создана линия связи между двумя микросхемами. Аналогичным образом, можно связать любое число объектов любым количеством связей. Программа не позволяет проводить повторные связи и связи между контактами одной и той же микросхемы.
    Если разрешение экрана Вашего монитора велико и работать трудно, включите нужное увеличение, и работать станет значительно удобнее. Сделать это можно либо из пункта View Flash Player, либо из контекстного меню.
    Отметим, что любая линия связи может иметь какое угодно число составных частей (звеньев). Чтобы изменить форму линии, достаточно щелкнуть по ней левой кнопкой мыши, затем, не отпуская кнопки, переместить мышь в любое место рабочего стола и отпустить. Обратите внимание, что цвет редактируемой линии изменяется. Выбрав подпункт "Delete Line" в контекстном меню, можно удалить ненужную линию связи.
    Объект, объединенный в схему, может быть перенесен в любую точку стола проектирования, линии связи последуют за ним, причем, изменяться будет только последнее (первое) звено cвязи. Таким образом сохраняется единое целое конструкции.
    Поместив на экран некоторое число компонентов, и связав их можно получить приблизительно такую картину. Если приложить усилие и выровнять компоненты и связи, то получим читаемую схему узла. Итак, мы имеем возможность связать объекты. Но что это дает?
    Каждый объект (в данном случае модель микросхемы) имеет свою функциональность, которая реализована в виде класса с определенным набором свойств, методов, обработчиков событий. Связывая объекты программа конструирует модель композиции. В данном случае мы получим модель узла, собранного из моделей микросхем, в другом случае - это может быть SQL запрос, в третьем - еще что-то. Это зависит от выбранной области знания и требует создания соответствующего программного модуля проектирования.
    Примечание. Статья описывает лишь метод объединения объектов и никак не затрагивает вопросы проектирования узлов на микросхемах.

    Как устроены объекты.

    Объекты, между которыми проводятся связи, так же наследники класса MovieClip. Создаются они динамически из одноименных классов при выборе элемента внутри компонента Tree. Например: la3 = new la3(nameLa3, numberLayer, numberLa3);
    Однако отметим, что в качестве объектов могут использоваться любые визуальные компоненты, имеющие обработчики onPress(), onRelease(), onMouseUp() а не только наследники MovieClip. Но при этом нужно иметь в виду, что работы может значительно прибавиться.
    В качестве "горячих областей" (hitArea) применяются также MovieClip. Количество горячих областей внутри объекта никак не ограничивается, однако, координаты их, определяются при создании класса объекта.
    Несмотря на то, что каждый объект имеет несколько "горячих" областей, обработчик событий для всех дочерних областей объекта один. Реализовано это, например, для события onPress следующим образом: function _onPress(parametr){ // Переберем все дочерние MovieClip элемента _this var _this = parametr; var obj:Object; for(j in _this){ if((typeof (_this[j]) == "movieclip")) { obj= _this[j]; // Найдем горячую область, по которой щелкнули мышью if (obj.hitTest(_root._xmouse, _root._ymouse, true)) {...}
    } ......... } }
    где parametr — несущий MovieClip для дочерних областей.

    Как устроены связи.

    Связи между объектами — это суть наследники класса MovieClip, создаются динамически в процессе рисования и имеют обработчики событий onPress(), onRelease(), а также обработчик контекстного меню itemHandler(_obj, menuItem), где:
  • _obj — имя выбранной пользователем связи;
  • menuItem — подпункт контекстного меню.

  • Количество звеньев в связи (в линии) ничем не ограничивается, другими словами, линия может быть как угодно сложной.
    Примечание. В определениях "как угодно сложной" или "ничем не ограничивается" есть немного от лукавого. Более точное определение может звучать так: "сложность композиции зависит от мощности Вашего компьютера".
    Все связи сохраняются в двух специальных массивах: arrayLines({startNameElement, endNameElement, lineObject ,,,,}) и arrayPoint({nameLine, x,y }); где,
  • startNameElement — стартовый элемент;
  • endNameElement — финишный элемент;
  • lineObject, nameLine — имя линии;
  • x, y — координаты звена линии.

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

    Композиции объектов

    ,
    Статья содержит описание графического метода, при помощи которого можно создавать композиции из объектов в различных областях знаний. Метод легко развивается и трансформируется под конкретную функциональность объектов. Язык реализации ActionScript 2.0, для больших проектов С++.

    Несколько слов о среде проектирования.

    В состав основного модуля программы входит небольшое число функций, перечислим некоторые из них: onLoad, onEnterFrame
    , и другие.
    Общий объем текста программы без учета классов микросхем содержит около 600 строк.

    Описание задачи.

    Предлагается метод и его реализация в виде программы, которая позволяет объединять визуальные объекты при помощи мыши в единую композицию, подобно тому, как это делается, например, в конструкторе SQL запросов Microsoft Access.

    Flash - статьи

    Цель работы.

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

    Описание интерфейса программы.

    Верхняя часть приложение содержит меню, которое введено по большей части на перспективу развития. Меню создано на основе UI компонента MenuBar.
    Иерархически раскрывающийся список содержит перечень микросхем для выбора пользователем. Полный список микросхем находится в XML файле на сервере, и при необходимости может быть подгружен в приложение. Для организации списка использован UI компонент Tree.
    Генератор импульсов предназначен для задания входной импульсной последовательности по каждому из каналов. В настоящее время программа содержит четыре входных канала, однако, по мере создания новых моделей требующих большее число каналов, число их в приложении увеличивается. Для каждого канала может быть установлена отдельная импульсная последовательность с требуемой длиной импульса и скваженностью. Генератор выполнен на UI компонентах ComboBox, RadioButton, NumericStepper.
    Задержка срабатывания микросхемы выполнена на UI компоненте NumericStepper.
    В нижней части приложения находиться панель состояния, в ней отражаются неопределенные или ошибочные состояния моделируемой микросхемы.
    Правая часть экрана приложения содержит входные и выходные импульсные последовательности.
    Пользоваться приложением достаточно просто: следует выбрать микросхему и задать ей входные импульсные последовательности. Программа отобразит входные и выходные графики и возможно диагностику.

    Организация программы.

    Все модели микросхем выполнены в виде отдельных классов и содержат только логику работы микросхем. Классы микросхем не содержат кода визуализации входных или выходных последовательностей. Другими словами, содержимое и представление полностью разделены, класс микросхемы не делает ничего, чтобы отобразить какой либо график.
    Входной информацией для объекта класса микросхемы служит многомерный массив событий, поступающий от входных каналов. Например, в модели микросхемы RS/D триггера любое событие анализируется с учетом всех четырех входных воздействий R,S,D,C.
    Прорисовкой входных и выходных графиков занимаются специальные подпрограммы. Входом для программы прорисовки входных графиков служат параметры импульсных последовательностей, исходящих от генератора, и определенные пользователем. Входом для программы рисования выходного графика служит массив выходных значений объекта микросхемы.
    Ниже приведен пример класса модели R-S триггера.
    //*************************************** // Логический элемент : R-S триггер // автор : Вересов Евгений // дата создания : 10.11.05 // vers.: 1.0 //*************************************** class tp2 { private var input : Array; // Массив для входа private var output : Array; // Выходной массив private var s : Number // Буфер первого канала private var r : Number // Буфер второго канала private var sost : Number // Состояние триггера
    // Конструктор public function tp2(){ this.input = new Array(); this.output = new Array(); sost = 0; s = null; r = null; }
    // История точек входа public function setInput(step:Number,value:Number, channel:Number):Void{ this.input.push({x:step,y:value,ch:channel}); }
    // формирование выхода public function out():Array { input.sortOn("x"); var i = 0;
    for(i=0; i // Если s ==0 r==1 if((s==0) && (r ==1)) {output.push({x : input[i].x, y : 1});sost=1}
    // Если s ==1 r==0 if((s==1) && (r ==0)) {output.push({x : input[i].x, y : 0});sost=0}
    // Если s ==1 r==1 if((s==1) && (r ==1)) {output.push({x : input[i].x, y : sost});}
    // Если s ==0 r==0 if((s==0) && (r ==0)) {output.push({x : input[i].x, y : null});} } return output; } }

    Предмет моделирования.

    На первом этапе, для моделирования выбраны микросхемы ТТЛ серии SN74/54, у нас это серии микросхем: 155, 555, 1531, 1533. С точки зрения написания модели не имеет существенного значения тип используемой технологии, по которой изготавливается микросхема: ТТЛ, ЭСТЛ или КМОП, хотя конечно, это будут разные модели. Гораздо более важным является степень интеграции микросхемы. Например, написать модель R-S триггера это одно, а модель АЦП, функционирование которого начнется только после предварительной записи в него ряда управляющих слов, это совершенно другое с точки зрения затрат временим и объема кода.
    К моменту написания статьи реализованы модели простых микросхем: ЛН1 – логическое НЕ, ЛА3 – логическое 2И-НЕ, ЛЕ4 – логическое 3ИЛИ-НЕ, ТР2 – RS триггер, ТМ2 – RS/D триггер.

    Предположение.

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

    Технология моделирования.

    Автор использует событийный метод моделирования. Суть его состоит в том, что обработке подлежат лишь события. Под событием понимается любое изменение входного воздействия или времени задержки срабатывания микросхемы, например, изменение потенциала или фронта импульса. Однако подчеркну, что речь идет о логическом, а не электрическом моделировании, – у этих двух направлений совершенно разные точки приложения усилий.
    Событийное моделирование хорошо тем, что позволяет использовать минимум ресурсов процессора пользователя и канала доставки приложения.

    Требования, предъявляемые к приложению.

    В настоящее время модели микросхем включены в состав приложения ControlPanel.
    Приложение соответствует следующим требованиям:
  • Модели микросхем, по возможности точно отражают поведение оригиналов.

  • Выходные сигналы генерируются быстро, без видимой задержки.

  • Пользователь может задавать любые входные последовательности, в том числе и такие, при которых состояние микросхемы становится неопределенным.

  • Объем загрузочного модуля приложения не превышает 100-150 кб. В противном случае будет использована оверлейная структура организации программы.


  • Рисование с помощью ActionScript во Flash MX

    В этом уроке мы научимся рисовать различные графические примитивы - линии, кривые и заливки - средствами ActionScript. Предполагается, что вы уже немого знакомы с этим языком и вам не нужно объяснять его основы. Если вы новичок в ActionScript, посмотрите другие статьи, в частности
    Для рисования примитивов нам потребуются следующии функции объекта MovieClip:
  • beginFill ([rgb[, alpha]])
  • beginGradientFill (fillType, colors, alphas, ratios, matrix)
  • clear()
  • curveTo (controlX, controlY, anchorX, anchorY)
  • endFill()
  • lineStyle ([thickness[, rgb[, alpha]]])
  • lineTo (x, y)
  • moveTo (x, y)

  • Начнем с функций moveTo() и lineTo(). Они используются для рисования линий. moveTo() устанавливает позицию "карандаша" (курсора) в позицию x, y. lineTo() проводит линию от позиции, установленной moveTo(), до позиции указанной параметрами x, y в самой функции lineTo().
    Но, прежде чем рисовать линии этими функциями, нужно установить свойства линии функцией lineStyle(). У неё три необязательных параметра: thickness - указывает толщину линии; rgb - цвет (а-ля 0x56FFCC); alpha - значение прозрачности. Если параметр не указан, его значение считается равным нулю.
    Вот пример кода, который рисует синий квадрат в текущем объекте MovieClip:
    lineStyle(1, 0x0000FF);

    moveTo(100, 100);

    lineTo(200, 100);

    lineTo(200, 200);

    lineTo(100, 200);

    lineTo(100, 100);
    Рисование с помощью ActionScript во Flash MX

    Координатная решетка любого объекта типа MovieClip начинается с верхнего левого угла и растет вправо вниз, как видно на рисунке выше.
    Для закраски нарисованных фигур используются функции beginFill() и endFill(). Функцию beginGradientFill() для создания градиентной закраски мы рассмотрим позже.
    beginFill() включает режим закраски. После её вызова, все нарисованные контуры будут закрашиваться, образую замкнутые фигуры. beginFill() имеет два необязательных параметра: rgb указывает цвет закраски, alpha - прозрачность.
    endFill() отключает режим закраски.
    Рекомендуется для рисовательной деятельности создавать пустой объект при помощи функции createEmptyMovieClip(). Этой функции передаются два параметра: имя экземпляра клипа, и целое значение, указывающее глубину клипа на экране, относительно других клипов.

    Вот пример c использованием функций beginFill() и endFill():

    _root.createEmptyMovieClip("myClip", 1);

    myClip.lineStyle(2,0x234567);

    myClip.beginFill(0x7878FF);

    myClip.moveTo(70,20);

    myClip.lineTo(20,100);

    myClip.lineTo(120,100);

    myClip.lineTo(70,20);

    myClip.endFill();

    myClip.lineStyle(4, 0x0078DD);

    myClip.moveTo(140,20);

    myClip.lineTo(190,20);

    myClip.lineTo(190,70);

    myClip.lineTo(140,70);

    myClip.lineTo(140,20);

    myClip.beginFill(0x00FF00, 30);

    myClip.lineStyle(1, 0xDC2323);

    myClip.moveTo(230, 20);

    myClip.lineTo(350, 100);

    myClip.lineTo(350, 20);

    myClip.lineTo(230, 100);

    myClip.lineTo(230, 20);

    Вот как выглядит результат работы этого скрипта:

    Рассмотрим функцию, которая рисует кривые: curveTo(controlX, controlY, anchorX, anchorY). Функция имеет четыре обязательных параметра. При отсутствии хотя бы одного из них она не срабатывает. Началом кривой считается текущая позиция курсора ("карандаша"), которая устанавливается при помощи moveTo(), или же позицией, в которой закончили черчение функции lineTo() или curveTo(). Конец кривой указывается параметрами anchorX и anchorY. Параметры controlX и controlY указывают точку, к которой направлены начало и конец линии. Для наглядности на рисунке ниже обозначены все точки.

    Рисование с помощью ActionScript во Flash MX


    Вот пример кода, и рисунка, который получается в результате его исполнения:

    lineStyle(1);

    beginFill(0xFF9921, 20);

    moveTo(70,20);

    curveTo(120,20,120,70);

    curveTo(120,120,70,120);

    curveTo(20,120,20,70);

    curveTo(20,20,70,20);

    endFill();

    moveTo(140,120);

    curveTo(140,20,160,20);

    curveTo(180,20,180,120);

    Наконец, рассмотрим самую сложную функцию beginGradientFill (fillType, colors, alphas, ratios, matrix), которая служит для градиентной закраски.

    Параметр fillType указывает тип закраски может быть равен одной из следующих строк: "linear" - линейная, "radial" - радиальная. Не забудьте, что это строки, поэтому параметры нужно указывать в кавычках.

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


    colors - массив, содержащий цвета градиента. alphas содержит alphа-канал (прозрачность) каждого цвета.

    ratios содержит значения распределения цветов. Возможные значения: 0-255. Это значение указывает место в процентном соотношении, где значение цвета достигает максимума.

    matrix является матрицей преобразования, которая может описываться двумя наборами значений:

    a, b, c, d, e, f, g, h, i, которые представляют из себя матрицу типа

    a b c
    d e f
    g h i
    или matrixType, x, y, w, h, r, где matrixType - строка "box"; x и y - смещение центра градиента, относительно точки регистрации объекта; w и h - ширина и высота градиента соответственно; r - угол поворота градиента в радианах.

    Для обращения к свойствам объекта можно использовать инструкцию with(). Вот пример, в котором мы создаём классическую "хромовую" закраску, повёрнутую на 45 градусов.

    _root.createEmptyMovieClip( "myClip", 1 );

    with ( _root.myClip )

    {

    colors = [ 0x0066FD, 0xFFFFFF, 0xFFFFFF, 0x996600, 0xFFCC00, 0xFFFFFF];

    alphas = [ 100, 100, 100, 100, 100, 100 ];

    ratios = [ 0, 100, 120, 125, 165, 255];

    matrix = { matrixType:"box", x:20, y:20, w:130, h:100, r:(45/180)*Math.PI };

    beginGradientFill( "linear", colors, alphas, ratios, matrix );

    moveto(20,20);

    lineto(150,20);

    lineto(150,120);

    lineto(20,120);

    lineto(20,20);

    endFill();

    }

    Вот и всё! На самом деле, после небольшого количества практики, всё становится понятно и легко.

    Как обычно, можно скачать все примеры к уроку: (6 k)

    Удачи!


    Flash - статьи

    Использование методов SetVariable и GetVariable для передачи данных между Flash и CBuider

    Демонстрации методов SetVariable и GetVariable приведена в проекте, который находится в файле .
    Методы объявлены в SockwaveFlashObjects_OCX.h. следующим образом:
    void __fastcall SetVariable(BSTR name/*[in]*/, BSTR
    value/*[in]*/);
    BSTR __fastcall GetVariable(BSTR name/*[in]*/);
    Параметр name определяет полное имя переменной, значение которой устанавливается методом SetVariable или запрашивается методом GetVariable. Для метода SetVariable параметр value содержит устанавливаемое значение. Возврат значения переменной в методе GetVariable производится через имя метода.
    Обратите внимание, что все параметры и возвращаемое значение имеет тип BSTR.
    Итак, пример использования SetVariable и GetVariable
    Во Flash создаем ролик, (см. рис. 9) в котором располагаем статический текст и динамический тексты.
    Использование методов SetVariable и GetVariable для передачи данных между Flash и CBuider
    Рис. 9. Flash ролик для демонстрации SetVariable и GetVariable
    В динамическом тексте меняем его имя на CBuilderText и имя переменной на BcbText (см. рис. 10)
    Использование методов SetVariable и GetVariable для передачи данных между Flash и CBuider
    Рис. 10. Свойства динамического текста
    Сохраняем Flash ролик под именем BcbToFlash.fla (и BcbToFlash.swf) и приступаем к созданию проекта на CBuilder (см. рис. 11).
    Этот проект будет передавать во Flash ролик текст, который будет отображаться в поле динамического текста (имя этого компонента CBuilderText), меняя переменную под именем BcbText. Изменение будет происходить при нажатии на кнопку "Передать" (вызов метода SetVariable).
    С помощью ComboBox1 будем менять цвет бордюра вокруг текста. Изменение будет происходить при любой модификации значения в ComboBox1. (опять же метод SetVariable).
    Использование методов SetVariable и GetVariable для передачи данных между Flash и CBuider
    Рис. 11. Форма для демонстрации методов SetVariable и GetVariable
    И, наконец, демонстрация метода GetVariable с помощью кнопки "Запросить цвет бордюра из Flash ролика" и метки с именем Label3. При нажатии на кнопку в Label3 отобразится значение кода цвета бордюра.
    Обратите внимание, что задавать цвет надо в 16-ричном виде, а возвращается он в десятичном. И, естественно, надо не забывать, что все параметры передаются и возвращаются в переменных типа BSTR. Для преобразования можно использовать функцию StringToOleStr и не забывать указывать L перед текстовыми константами.

    Текст модуля для демонстрации методов SetVariable и GetVariable

    //------------------------------------

    #include < vcl.h>

    #pragma hdrstop

    #include "Unit1.h"

    //-----------------------------------

    #pragma package(smart_init)

    #pragma link "ShockwaveFlashObjects_OCX"

    #pragma resource "*.dfm"

    TForm1 *Form1;

    //-----------------------------------

    __fastcall TForm1::
    TForm1(TComponent* Owner)

    : TForm(Owner)

    {

    ShockwaveFlash1->Movie =
    ExtractFilePath(Application->ExeName) + "BcbToFlash.swf";

    Label3->Caption = ShockwaveFlash1->
    GetVariable (L"CBuilderText.borderColor");

    }

    //-------------------------------------

    void __fastcall TForm1::
    Button1Click(TObject *Sender)

    {

    ShockwaveFlash1->SetVariable
    (L"BcbText", StringToOleStr(Edit1->Text));

    }

    //--------------------------------------

    void __fastcall TForm1::
    ComboBox1Change(TObject *Sender)

    {

    ShockwaveFlash1->SetVariable
    (L"CBuilderText.borderColor", StringToOleStr(ComboBox1->Text));

    }

    //---------------------------------------

    void __fastcall TForm1::
    Button2Click(TObject *Sender)

    {

    Label3->Caption = ShockwaveFlash1->
    GetVariable (L"CBuilderText.borderColor");

    }

    //--------------------------------------

    Команда fsCommand и событие onFSCommand

    Flash ролик может инициировать событие CBuilder, а наоборот –CBuilder во Flash, к сожалению, нет. Команда скрипта fsCommand, написанная во Flash, вызывает событие onFSCommand для объекта типа TSockwaveFlash в CBuilder и передаёт два параметра:

  • BSTR command – наименование команды;

  • BSTR args – параметры.
    Значение этих параметров устанавливается командой fsCommand во Flash и, в нашем случае, могут иметь произвольные значения, которые можно использовать для обмена данными.
    Приведём простой пример (см. ).
    Запустим macromedia Flash и создадим ролик следующим образом.
    Поместим в единственный фрейм сцены кнопку "Oval bottons - blue" из общей библиотеки (см. рис. 7).
    Команда fsCommand и событие onFSCommand
    Рис. 7. Создание кнопки.
    Теперь напишем обработчик события Release для этой кнопки в котором разместим команду fscommand ("Click"). В данном примере передача второй параметр в команде fscommand не используется.
    Это показано на рис. 8.
    Команда fsCommand и событие onFSCommand
    Рис. 8. Обработчик события нажатия кнопки.
    Выбор текста "Click" в качестве первого параметра данном случае произволен.
    Сохраним ролик под именем botton.fla в том же каталоге, в котором будем размещать создаваемый на CBuilder проект. Нажмем Alt+Ctrl+Enter, чтобы получить botton.swf.
    Создадим новый проект на CBuilder. На форму поместим компонент Flash под именем ShockwaveFlash1. Сделаем программную загрузку файла botton.swf и обработку события onFSCommand как показано ниже в тексте модуля.
    #include < vcl.h>
    #pragma hdrstop
    #include "Unit1.h"
    //------------------------------------
    #pragma package(smart_init)
    #pragma link "ShockwaveFlashObjects_OCX"
    #pragma resource "*.dfm"
    TForm1 *Form1;
    //-----------------------------------
    __fastcall TForm1::TForm1
    (TComponent* Owner)
    : TForm(Owner)
    {
    }
    //-----------------------------------
    void __fastcall TForm1::Shockwave
    Flash1FSCommand(TObject *Sender,
    BSTR command, BSTR args)
    {
    AnsiString x(command); //
    преобразование BSTR AnsiString
    if (x == "Click")
    Form1->Color = Form1->Color==
    clWhite?clBtnFace:clWhite;
    }
    //------------------------------------
    void __fastcall TForm1::
    FormCreate(TObject *Sender)
    {
    ShockwaveFlash1->Movie =
    ExtractFilePath(Application->ExeName) + "button.swf";
    }
    //------------------------------------
    Обратите внимание, что перед использованием параметр command типа BSTR преобразуются в тип AnsiString (переменная x). Если значение переменной x равно "Click", то форма меняет свой цвет.
    Параметр arg здесь не используется, но его можно применить, чтобы передать в CBuilder какую-либо информацию. Для нормальной работы не забудьте преобразовать его в AnsiString , так, как мы сделали это с переменной command.

    Проигрывание Flash ролика

    Создаём на CBuilder новый проект с единственной формой Form1. Из палитры компонентов ActiveX помещаем на форму компоненту ShackwaveFlash. Заносим с помощью инспектора объектов или программно в свойство ShockwaveFlash1->Movie полный путь и имя файла Flash ролика (расширение файла swf). В примерах Flash ролик помещён в тот же каталог что и exe-файл, поэтому в них свойство удобно менять программно, размещая код в обработчике события создания формы:
    void __fastcall TForm1::FormCreate(TObject *Sender)
    {
    ShockwaveFlash1->Movie = ExtractFilePath
    (Application->ExeName) + "ball.swf";
    }
    Установите свойства ShockwaveFlash1->Loop и ShockwaveFlash1->Playing в true. Нажмем F9, чтобы провести промежуточную проверку приложения. На форме должен двигаться и деформироваться овал. Если вместо этого на форме просто белый квадрат, то скорее всего неправильно установлено свойство ShockwaveFlash1->Movie (файл ball.swf находится в ).
    Отметим, что свойства, методы и поля класса TShockwaveFlash можно просмотреть в файле ShockwaveFlashObjects_OCX.h. Рекомендуем сделать это. Информацию о методах можно найти на сайте компании Macromedia, в описании и в Help пакета Flash.
    Теперь модифицируем наше приложение так, чтобы продемонстрировать возможности управления ходом выполнения Flash ролика. Вид главной формы представлен на рис. 5. Кнопки Stop, Play, Back, Forward, Rewind вызывают одноименные методы ShockwaveFlash1:

  • Stop – останавливает выполнение ролика;

  • Play – инициирует выполнение ролика с текущего фрейма;
    Back - переход на предыдущий фрейм;
    Forward - переход на следующий фрейм;
    Rewind - переход на следующий фрейм;
    При нажатии кнопок Back, Forward, Rewind, если ролик проигрывается то, перед выполнением соответствующего метода производится остановка методом Stop.
    Проигрывание Flash ролика
    Рис. 6. Вид формы
    Кнопка "Перейти" совместно с CSpinEdit1 демонстрирует использование метода ShockwaveFlash1->GotoFrame – переход на произвольно заданный номер фрейма.
    Кнопка "Загрузить новый Flash ролик" вызывает диалоговое окно и загружает новый swf файл. (См. поставляемый с примером square.swf)..

    Отметим, что в программе используются:



  • свойство ShockwaveFlash1-> TotalFrames для отображения общего количества фреймом во Flash ролике;


  • метод ShockwaveFlash1->IsPlaying. Возвращаемое им значение позволяет определить проигрывается ли в текущий момент ролик.

    метод ShockwaveFlash1->CurrentFrame для отображения номера текущего фрейма при остановках.

    Исходный код программы находится в архиве .

    Текст основного модуля из архива

    #include < vcl.h>

    #pragma hdrstop

    #include "Unit1.h"

    //---------------------------------

    #pragma package(smart_init)

    #pragma link "ShockwaveFlashObjects_OCX"

    #pragma link "CSPIN"

    #pragma resource "*.dfm"

    TForm1 *Form1;

    //-------------------------------

    __fastcall TForm1::TForm1
    (TComponent* Owner)

    : TForm(Owner)

    {

    }

    //---------------------------------

    void TForm1::ShowCurFrame(void) //
    показать номер текущего фрейма

    {

    Label2->Caption = IntToStr
    (ShockwaveFlash1->CurrentFrame()); // номер текущего фрейма

    Label2->Visible = true;

    }

    //--------------------------------

    void __fastcall TForm1::FormCreate(TObject *Sender)

    {

    ShockwaveFlash1->Movie =
    ExtractFilePath(Application->ExeName) + "ball.swf";

    Label4->Caption = IntToStr
    (ShockwaveFlash1->TotalFrames); // Общее число фреймов

    }

    //--------------------------------

    void __fastcall TForm1::
    Button2Click(TObject *Sender)

    {

    ShockwaveFlash1->Stop();

    ShowCurFrame();

    }

    //--------------------------------

    void __fastcall TForm1::
    Button3Click(TObject *Sender)

    {

    ShockwaveFlash1->Play();

    Label2->Visible = false;

    }

    //--------------------------------

    void __fastcall TForm1::
    Button4Click(TObject *Sender)

    {

    if (ShockwaveFlash1->IsPlaying())

    ShockwaveFlash1->Stop();
    // если проигрывается, то остановим

    ShockwaveFlash1->Back();
    // на предыдущий фрейм

    ShowCurFrame();

    }

    //---------------------------------

    void __fastcall TForm1::
    Button5Click(TObject *Sender)

    {

    if (ShockwaveFlash1->IsPlaying())


    ShockwaveFlash1->Stop();
    // если проигрывается, то остановим

    ShockwaveFlash1->Forward();
    // на следующий фрейм

    ShowCurFrame();

    }

    //--------------------------------

    void __fastcall TForm1::
    Button6Click(TObject *Sender)

    {

    if (ShockwaveFlash1->IsPlaying())

    ShockwaveFlash1->Stop(); //
    если проигрывается, то остановим

    ShockwaveFlash1->Rewind(); //
    на 1-й фрейм

    ShowCurFrame();

    }

    //--------------------------------

    void __fastcall TForm1::
    Button7Click(TObject *Sender)

    {

    ShockwaveFlash1->GotoFrame
    (StrToInt(CSpinEdit1->Text)); // на введенный фрейм

    ShowCurFrame();

    }

    //---------------------------------

    void __fastcall TForm1::
    Button8Click(TObject *Sender)

    {

    if (OpenDialog1->Execute())

    {

    if (ShockwaveFlash1->IsPlaying())

    ShockwaveFlash1->Stop(); //
    если проигрывается, то остановим

    ShockwaveFlash1->Movie =
    OpenDialog1->FileName;

    Label4->Caption = IntToStr
    (ShockwaveFlash1->TotalFrames); // Общее число фреймов

    ShockwaveFlash1->Play();

    Label2->Visible = false;

    }

    }

    //-------------------------------

    Установка компоненты

    Чтобы иметь возможность работать с Flash роликом, необходимо импортировать компонент ActiveX для Flash. Естественно это возможно, если в операционной системе есть библиотека Flash.ocx или SWFlash.ocx. Эта библиотека устанавливается автоматически при установке пакета Flash или проигрывателя Flash. Последний распространяется компанией Macromedia бесплатно (http://www.macromedia.com/go/getflashplayer).
    Итак, установим компоненту. Запустим CBuilder. Откроем меню Component>Import ActiveX Control появиться диалоговое окно (рис. 1).
    Установка компоненты
    Рис 1. Диалоговое окно Import ActiveX
    Поле Palette page можно не менять, если вы не хотите поместить компонент на другую страницу палитры компонентов. Найдите и выберете в списке Shockwave, откроется кнопка Install…, нажмите её, появится окно (рис. 2)
    Установка компоненты
    Рис. 2 Выбор пакеджа в который будет помещаться компонент.
    Рекомендуем поле File name не менять. Нажатие кнопки OK приведет к появлению окна (рис. 3)
    Установка компоненты
    Рис. 3. Запрос на переустановку пакеджа.
    После подтверждения получаем информационное сообщение (рис. 4)
    Установка компоненты
    Рис. 4. Информационное сообщение
    В результате всех этих манипуляций в палитре компонентов в разделе ActiveX появятся новая компонента
    Установка компоненты
    Рис. 5. Фрагмент линейки компонент.
    Подготовительный этап завершён.

    Вступление

    Цель данной статьи продемонстрировать программистам, работающим на CBuilder или на Delphi, возможность интерактивного взаимодействия CBuilder (Delphi) и Flash. Хотя статья рассчитана в основном на программистов, работающих под CBuilder, она также будет полезна программирующим на Delphi.
    От редакции CITForum.ru: Для любителей Delphi Олег Варибрус впоследствии написал аналогичную статью .

    в данной статье приведены для

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

    Flash - статьи

    Использование методов SetVariable и GetVariable для передачи данных между Flash и Delphi

    Демонстрации методов SetVariable и GetVariable приведены в проекте, который находится в файле .
    Методы объявлены в ShockwaveFlashObjects_TLB.pas следующим образом:
    procedure SetVariable(const name: WideString; const value: WideString); safecall; function GetVariable(const name: WideString): WideString; safecall;
    Параметр name определяет полное имя переменной, значение которой устанавливается методом SetVariable или запрашивается методом GetVariable. Для метода SetVariable параметр value содержит устанавливаемое значение. Возврат значения переменной в методе GetVariable производится через имя метода.
    Итак, пример использования SetVariable и GetVariable
    Во Flash создаем ролик (см. ), в котором располагаем статический и динамический тексты.
    В динамическом тексте меняем его имя на DelphiText и имя переменной на DelphiVarText (см. рис. 10)
    Использование методов SetVariable и GetVariable для передачи данных между Flash и Delphi
    Рис. 10. Свойства динамического текста
    Сохраняем Flash-ролик под именем DelphiToFlash.flaDelphiToFlash.swf) и приступаем к созданию проекта на Delphi (см. рис. 11).
    Этот проект будет передавать во Flash-ролик текст, который будет отображаться в поле динамического текста (имя этого компонента DelphiText), меняя переменную под именем DelphiVarText. Изменение будет происходить при нажатии на кнопку "Передать" (вызов метода SetVariable).
    С помощью ComboBox1 будем менять цвет бордюра вокруг текста. Изменение будет происходить при любой модификации значения в ComboBox1 (опять же метод SetVariable).
    Использование методов SetVariable и GetVariable для передачи данных между Flash и Delphi
    Рис. 11. Форма для демонстрации методов SetVariable и GetVariable
    И, наконец, демонстрация метода GetVariable с помощью кнопки "Запросить цвет бордюра из Flash-ролика" и метки с именем Label3. При нажатии на кнопку, в Label3 отобразится значение кода цвета бордюра.
    Обратите внимание, что задавать цвет надо в 16-тиричном виде, а возвращается он в десятичном.

    Команда fsCommand и событие onFSCommand

    Flash-ролик может инициировать событие Delphi, а наоборот - из Delphi во Flash, к сожалению, нет. Команда скрипта fsCommand, написанная во Flash, вызывает событие onFSCommand для объекта типа TSockwaveFlash в Delphi и передаёт два параметра:
  • BSTR command - наименование команды;
  • BSTR args - параметры.

  • Значения этих параметров устанавливаются командой fsCommand во Flash и, в нашем случае, эти параметры могут иметь произвольные значения, которые можно использовать для обмена данными.
    Приведём простой пример (см. ).
    Запустим Macromedia Flash MX и создадим ролик следующим образом.
    Поместим в единственный фрейм сцены кнопку "Oval buttons - blue" из общей библиотеки (см. рис. 7).
    Команда fsCommand и событие onFSCommand
    Рис. 7.Создание кнопки.
    Теперь напишем обработчик события Release для этой кнопки, в котором разместим команду fscommand ("Click"). В данном примере передача второго параметра в команде fscommand не используется.
    Это показано на .
    Выбор текста "Click" в качестве первого параметра в данном случае произволен.
    Сохраним ролик под именем botton.fla в том же каталоге, в котором будем размещать создаваемый на Delphi проект. Нажмем Alt+Ctrl+Enter, чтобы получить botton.swf.
    Создадим новый проект на Delphi. На форму поместим компонент Flash под именем ShockwaveFlash1. Сделаем программную загрузку файла botton.swf и обработку события onFSCommand, как показано ниже в тексте модуля.
    unit Unit1;
    interface
    uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, OleCtrls, ShockwaveFlashObjects_TLB;
    type TForm1 = class(TForm) ShockwaveFlash1: TShockwaveFlash; procedure ShockwaveFlash1FSCommand(ASender: TObject; const command, args: WideString); procedure FormCreate(Sender: TObject); private { Private declarations } public { Public declarations } end;
    var Form1: TForm1;
    implementation
    {$R *.dfm}
    procedure TForm1.ShockwaveFlash1FSCommand(ASender: TObject; const command, args: WideString); begin if command = 'Click' then if Form1.Color=clWhite then Form1.Color := clBtnFace else Form1.Color := clWhite; end;
    procedure TForm1.FormCreate(Sender: TObject); begin ShockwaveFlash1.Movie := ExtractFilePath(Application.ExeName) + 'button.swf'; end;
    end.
    Если значение переменной x равно "Click", то форма меняет свой цвет.
    Параметр arg здесь не используется, но его можно применить, чтобы передать в Delphi какую-либо информацию.

    Проигрывание Flash-ролика

    Создаём на Delphi новый проект с единственной формой Form1. Из палитры компонентов ActiveX помещаем на форму компоненту ShackwaveFlash. Заносим с помощью инспектора объектов или программно в свойство ShockwaveFlash1.Movie полный путь и имя файла Flash-ролика (расширение файла swf). В примерах Flash-ролик помещён в тот же каталог, что и exe-файл, поэтому в них свойство удобно менять программно, размещая код в обработчике события создания формы:
    procedure TForm1.FormCreate(Sender: TObject); begin ShockwaveFlash1.Movie := ExtractFilePath(Application.ExeName) + 'ball.swf'; end;
    Установите свойства ShockwaveFlash1.Loop и ShockwaveFlash1.Playing в true. Нажмем F9, чтобы провести промежуточную проверку приложения. На форме должен двигаться и деформироваться овал. Если вместо этого на форме просто белый квадрат, то, скорее всего, неправильно установлено свойство ShockwaveFlash1.Movie (файл ball.swf находится в ).
    Отметим, что свойства, методы и поля класса TShockwaveFlash можно просмотреть в файле ShockwaveFlashObjects_TLB.pas (обычно он находится в "c:\Program Files\Borland\Delphi7\Imports\"). Рекомендуем сделать это. Информацию о методах можно найти на сайте компании Macromedia, в описании и в Help пакета Flash.
    Теперь модифицируем наше приложение так, чтобы продемонстрировать возможности управления ходом выполнения Flash-ролика. Вид главной формы представлен на рис. 6. Кнопки Stop, Play, Back, Forward, Rewind вызывают одноименные методы ShockwaveFlash1:
  • Stop - останавливает выполнение ролика;
  • Play - инициирует выполнение ролика с текущего фрейма;
  • Back - переход на предыдущий фрейм;
  • Forward - переход на следующий фрейм;
  • Rewind - переход на следующий фрейм;

  • При нажатии кнопок Back, Forward, Rewind во время воспроизведения ролика, перед выполнением соответствующего метода производится остановка методом Stop.
    Проигрывание Flash-ролика
    Рис. 6. Вид формы
    Кнопка "Перейти" совместно с CSpinEdit демонстрирует использование метода ShockwaveFlash1.GotoFrame - переход на произвольно заданный номер фрейма.
    Кнопка "Загрузить новый Flash-ролик" вызывает диалоговое окно и загружает новый swf-файл. (См. предоставляемый с примером файл square.swf).
    Отметим, что в программе используются:
  • свойство ShockwaveFlash1.TotalFrames для отображения общего количества фреймом во Flash-ролике;
  • метод ShockwaveFlash1.IsPlaying. Возвращаемое им значение позволяет определить, проигрывается ли в текущий момент ролик.
  • метод ShockwaveFlash1.CurrentFrame для отображения номера текущего фрейма при остановках.

  • Исходный код программы находится в архиве .

    Текст модуля для демонстрации методов SetVariable и GetVariable

    unit Unit1;
    interface
    uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, OleCtrls, ShockwaveFlashObjects_TLB, ExtCtrls, StdCtrls;
    type TForm1 = class(TForm) Label1: TLabel; Label2: TLabel; Label3: TLabel; Button1: TButton; Edit1: TEdit; ComboBox1: TComboBox; Button2: TButton; Panel1: TPanel; ShockwaveFlash1: TShockwaveFlash; procedure FormCreate(Sender: TObject); procedure Button1Click(Sender: TObject); procedure ComboBox1Change(Sender: TObject); procedure Button2Click(Sender: TObject); private { Private declarations } public { Public declarations } end;
    var Form1: TForm1;
    implementation
    {$R *.dfm}
    procedure TForm1.FormCreate(Sender: TObject); begin ShockwaveFlash1.Movie := ExtractFilePath(Application.ExeName) + 'DelphiToFlash.swf'; Label3.Caption := ShockwaveFlash1.GetVariable ('DelphiText.borderColor'); end;
    procedure TForm1.Button1Click(Sender: TObject); begin ShockwaveFlash1.SetVariable ('DelphiVarText', StringToOleStr(Edit1.Text)); end;
    procedure TForm1.ComboBox1Change(Sender: TObject); begin ShockwaveFlash1.SetVariable ('DelphiText.borderColor', StringToOleStr(ComboBox1.Text)); end;
    procedure TForm1.Button2Click(Sender: TObject); begin Label3.Caption := ShockwaveFlash1.GetVariable ('DelphiText.borderColor'); end;
    end.

    Текст основного модуля из архива

    unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, Spin, OleCtrls, ShockwaveFlashObjects_TLB; type TForm1 = class(TForm) Label1: TLabel; Label2: TLabel; Label3: TLabel; Label4: TLabel; Label5: TLabel; ShockwaveFlash1: TShockwaveFlash; Button2: TButton; Button3: TButton; Button4: TButton; Button5: TButton; Button6: TButton; Button7: TButton; SpinEdit1: TSpinEdit; OpenDialog1: TOpenDialog; Button8: TButton; procedure Button2Click(Sender: TObject); procedure Button3Click(Sender: TObject); procedure Button4Click(Sender: TObject); procedure Button5Click(Sender: TObject); procedure Button6Click(Sender: TObject); procedure Button7Click(Sender: TObject); procedure Button8Click(Sender: TObject); procedure FormCreate(Sender: TObject); private { Private declarations } procedure ShowCurFrame(); // показать номер текущего фрейма public { Public declarations } end;
    var Form1: TForm1;
    implementation
    {$R *.dfm}
    procedure TForm1.ShowCurFrame(); // показать номер текущего фрейма begin Label2.Caption := IntToStr(ShockwaveFlash1.CurrentFrame()); // номер текущего фрейма Label2.Visible := true; end;
    procedure TForm1.Button2Click(Sender: TObject); begin ShockwaveFlash1.Stop(); ShowCurFrame(); end;
    procedure TForm1.Button3Click(Sender: TObject); begin ShockwaveFlash1.Play(); Label2.Visible := false; end;
    procedure TForm1.Button4Click(Sender: TObject); begin if ShockwaveFlash1.IsPlaying() then ShockwaveFlash1.Stop(); // если проигрывается, то остановим ShockwaveFlash1.Back(); // на предыдущий фрейм ShowCurFrame(); end;
    procedure TForm1.Button5Click(Sender: TObject); begin if ShockwaveFlash1.IsPlaying() then ShockwaveFlash1.Stop(); // если проигрывается, то остановим ShockwaveFlash1.Forward(); // на следующий фрейм ShowCurFrame(); end;
    procedure TForm1.Button6Click(Sender: TObject); begin if ShockwaveFlash1.IsPlaying() then ShockwaveFlash1.Stop(); // если проигрывается, то остановим ShockwaveFlash1.Rewind(); // на 1-й фрейм ShowCurFrame(); end;
    procedure TForm1.Button7Click(Sender: TObject); begin ShockwaveFlash1.GotoFrame(StrToInt(SpinEdit1.Text)); // на введенный фрейм ShowCurFrame(); end;
    procedure TForm1.Button8Click(Sender: TObject); begin if OpenDialog1.Execute() then begin if (ShockwaveFlash1.IsPlaying()) then ShockwaveFlash1.Stop(); // если проигрывается, то остановим ShockwaveFlash1.Movie := OpenDialog1.FileName; Label4.Caption := IntToStr(ShockwaveFlash1.TotalFrames); // Общее число фреймов ShockwaveFlash1.Play(); Label2.Visible := false; end
    end;
    procedure TForm1.FormCreate(Sender: TObject); begin ShockwaveFlash1.Movie := ExtractFilePath(Application.ExeName) + 'ball.swf'; Label4.Caption := IntToStr(ShockwaveFlash1.TotalFrames); // Общее число фреймов end; end.

    Установка компоненты

    Чтобы иметь возможность работать с Flash-роликом, необходимо импортировать компонент ActiveX для Flash. Естественно, это возможно, если в операционной системе есть библиотека Flash.ocx или SWFlash.ocx. Эта библиотека устанавливается автоматически при установке пакета Flash или проигрывателя Flash. Последний распространяется компанией Macromedia .
    Итак, установим компоненту. Запустим Delphi. Откроем меню Component→Import ActiveX Control, появится диалоговое окно (рис. 1).
    Установка компоненты
    Рис 1.Диалоговое окно Import ActiveX
    Поле Palette page можно не менять, если вы не хотите поместить компонент на другую страницу палитры компонентов. Найдите и выберите в списке Shockwave, откроется кнопка Install…, нажмите её, появится окно (рис. 2)
    Установка компоненты
    Рис. 2. Выбор пакеджа, в который будет помещаться компонент.
    Рекомендуем поле File name не менять. Нажатие кнопки OK приведет к появлению окна (рис. 3)
    Установка компоненты
    Рис. 3. Запрос на переустановку пакеджа.
    После подтверждения получаем информационное сообщение (рис. 4)
    Установка компоненты
    Рис. 4. Информационное сообщение
    В результате всех этих манипуляций в палитре компонентов в разделе ActiveX появится новая компонента
    Установка компоненты
    Рис. 5. Линейка компонентов с новым компонентом в ActiveX
    Подготовительный этап завершён.

    роликом через Delphi отнюдь не

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

    Flash - статьи

    Числовые методы в одно касание

    Как видим, перед нами дифференциальное уравнение второго порядка. Для этого случая есть старые и миллион раз проверенные числовые методы интегрирования. На самом деле там все проще, чем кажется: вычисления производятся методом "а почему бы и нет" — то есть берется начальная точка и как бы немного аппроксимируется первыми членами разложения Эйлера к следующей в предположении, что это не черт знает где, а где-то рядом. Ну, то есть y[i+1]=y[i]+dy.
    Например, большой популярностью у студентов и преподавателей пользуется метод Рунге-Кутты четвертого порядка точности. Не буду вдаваться в подробности — сами посмотрите в тексте программы. Главное, что каждая следующая точка будет вычисляться как функция предыдущей. А поскольку уравнение у нас второго порядка, начальная точка будет задаваться двумя координатами: (x, y), где y — суть функциональная производная от x, но в данном случае мы будет смотреть на нее как на независимую переменную.
    Сразу скажу, что мы не будем "бороться" с переменным шагом интегрирования — это, конечно, выгодно с точки зрения вычислений, но усложнит демонстрацию того, что мы тут будем демонстрировать: применение Flash в качестве вычислительной среды.

    Диагноз: Ш 7-Б

    А теперь, если посмотреть на вещи прагматично, глазами конкретных людей из ЦРУ, ГРУ и других беспредельных заведений. Это мы для примера взяли какие-то странные аттракторы — а ведь эти-то ребята могут поручить Flash-скриптам все что угодно, от расчета биологического оружия, декодирования шифров, дешифрации изображений со спутников до вычитки электронной почты и… да мало ли хороших дел можно придумать.
    И если раньше для этого нужно было покупать новый мэйнфрейм за несколько миллионов, то теперь достаточно перетереть с yahoo.com и разместить там свой Flash-банерок. Видели там такие большие Flash’ки? Это с виду там реклама кредитных карточек, а на самом деле — кто знает?
    А ведь можно сделать "вычислитель" и вовсе маленьким и невидимым…
    С другой стороны, можно, как в , наоборот — разрекламировать, раструбить, чтобы любой пользователь мог поставить вашу флэшку домашней страничкой и таким образом стал помогать вам бороться со СПИДом, искать пришельцев и раскодировать коды террористов. Это уже вопрос наглости, под каким предлогом вы будете тырить у людей их процессорное время.
    Кстати, ходит такая полусказка, что, мол, Саддам Хусейн в ответ на эмбарго на ввоз компов в Ирак скупал приставки Nintendo 64, ставил на них Linux, объединял в кластеры и решал стратегические задачки типа просчета траекторий ракет. Не уверен, что именно так оно и было — но идея, без сомнения, интересная. В любом случае, скрытые возможности есть, и рано или поздно они будут использованы.

    Использованы иллюстрации с сайта .
    document.write('');
    Диагноз: Ш 7-Б Диагноз: Ш 7-Б
    Диагноз: Ш 7-Б Диагноз: Ш 7-Б Новости мира IT:
  • 02.08 -
  • 02.08 -
  • 02.08 -
  • 02.08 -
  • 02.08 -
  • 01.08 -
  • 01.08 -
  • 01.08 -
  • 01.08 -
  • 01.08 -
  • 01.08 -
  • 01.08 -
  • 01.08 -
  • 01.08 -
  • 01.08 -
  • 31.07 -
  • 31.07 -
  • 31.07 -
  • 31.07 -
  • 31.07 -

  • Архив новостей
    Диагноз: Ш 7-Б Диагноз: Ш 7-Б Диагноз: Ш 7-Б Последние комментарии:
    (66)

    2 Август, 17:53
    (19)

    2 Август, 17:51
    (34)

    2 Август, 15:40
    (42)

    2 Август, 15:35
    (1)

    2 Август, 14:54
    (3)

    2 Август, 14:34
    (3)

    2 Август, 14:15
    (2)

    2 Август, 13:34

    (7)

    2 Август, 13:04

    (3)

    2 Август, 12:28

    Диагноз: Ш 7-Б Диагноз: Ш 7-Б Диагноз: Ш 7-Б

    BrainBoard.ru

    Море работы для программистов, сисадминов, вебмастеров.

    Иди и выбирай!


    Диагноз: Ш 7-Б Диагноз: Ш 7-Б Диагноз: Ш 7-Б Loading

    google.load('search', '1', {language : 'ru'}); google.setOnLoadCallback(function() { var customSearchControl = new google.search.CustomSearchControl('018117224161927867877:xbac02ystjy'); customSearchControl.setResultSetSize(google.search.Search.FILTERED_CSE_RESULTSET); customSearchControl.draw('cse'); }, true);

    Диагноз: Ш 7-Б Диагноз: Ш 7-Б
    Диагноз: Ш 7-Б
    Диагноз: Ш 7-Б
    IT-консалтинг Software Engineering Программирование СУБД Безопасность Internet Сети Операционные системы Hardware
    PR-акции, размещение рекламы — ,
    тел. +7 495 6608306, ICQ 232284597

    Пресс-релизы —

    Диагноз: Ш 7-Б
    Диагноз: Ш 7-Б
    Диагноз: Ш 7-Б
    Диагноз: Ш 7-Б This Web server launched on February 24, 1997

    Copyright © 1997-2000 CIT, © 2001-2009
    Диагноз: Ш 7-Б
    Диагноз: Ш 7-Б
    Внимание! Любой из материалов, опубликованных на этом сервере, не может быть воспроизведен в какой бы то ни было форме и какими бы то ни было средствами без письменного разрешения владельцев авторских прав.
    Источники воды. Если на Agriko-Akva.ru. Для бытового использования.


    Flash ActionScript и странные аттракторы

    Арсений Чеботарев,
    Я уже как-то рассказывал и показывал, как работает сервер приложений Cold Fusion от Macromedia. Но вот, опять встречаю человека, а он мне и говорит: "А-а-а, флэшки? Это которые картиночки про Масяньку?". Елы-палы, объясняю для детей природы…
    Вот уж люди: любят носиться со своими предрассудками — и что обидно, еще и живут при этом долго. Ну какая же там за бесценок продавшаяся Масянька, если "флэш анимейшин" — это на сегодня самый простой и очень мощный способ кросс-платформенного самовыражения.
    Конечно, происхождение флэшки — самое что ни на есть простецкое, первые версии вообще не далеко ушли от анимированных GIF’ов, но главное, как поняли макромедийцы,— это попасть на комп пользователя и подсадить народ на продукт, чтобы люди апгрейдились и апгрейдились. Сам апгрейд через плуг — это пожизненный памятник Flash’евским создателям.
    Вот так вот под шумок у нас на компьютерах и поселилась самая что ни на есть операционная среда Flash и виртуальная Flash-машина.
    Изначально Flash работал только под MS Windows и Mac OS. Благодаря фирме Sun Flash был портирован под X-Windows, то есть на Solaris, IRIX, BSD, Linux. Количество установленных Flash-плееров приблизительно равно количеству установленных браузеров, которые, в свою очередь, в любом случае сопутствуют графическим оболочкам, таким как KDE. Короче, на сегодня вероятность встретить на персональном компьютере Flash-плеер составляет около 86%, и то последние 14% относятся к "только что установленным", на которые плагин просто не успел попасть.
    Конечно же, первую роль играет красивая анимация — но, заметьте, сетевая анимация. То есть поддерживается доступ к сетевым ресурсам для загрузки данных и изображений. Конечно, все это ограничено довольно специфичными рамками, но главное — есть доступ к серверам приложений. А значит, все, что нельзя сделать, локально можно делегировать серверу. И в этом заключается прикол, так и должны работать сетевые приложения.
    Важен и фактор компактности самого плеера, который на сегодня не превышает 400 Кб для большинства платформ. Такой плеер легко встроить в любой смартфон или хэндхэлд. Сравните с виртуальной машиной Java даже в минимальной версии. Конечно же, на стороне Java — мощность и богатство платформы, но у этой мощности имеются не только стороники, но и противники. Есть же люди, платящие суммы как за супермощные джипы, так и за маломощные и экологичные автомобильчики — и последних все больше. Так и в программировании: для изучения всех иерархий классов и разработки новых иерархий в Java может понадобиться много месяцев. А задача за это время может быть решена на Flash — и при том, заметьте, серверная часть будет портабельной и инвариантной, так что тут даже больше гибкости и правильности. О том, что фронт-энд будет красивее на Flash, можно и не говорить — конечно, если под рукой есть про-дизайнер с руками в нужном месте.
    Ладно, хватит чесать блох — переходим к практике дзен. Практику нам раздали такую: создать портабельное, интерактивное, распределенное приложение. Причем никаких масянек, никаких летающих пингвинов — что-то из мира науки, что-то из математики. Что-то, что бы могло показать, что Flash может использоваться в качестве калькулятора.

    Немного оптимизации: истребляем в себе все человеческое

    Еще чуть-чуть теории — а потом сплошная практика. Поговорим о человеческом факторе в науке.
    Если порыться в любой научной отрасли, даже в сравнительно чистой математике или физике, можно найти не только штаны Пифагора, но и старые носки Эйлера. Например, та же десятеричная система появилась благодаря привычке считать на пальцах. Ну разве не абсурдная причина? Та же секунда времени — усредненная частота сердечного ритма. Ну разве не странная единица? Более поздние "находки", типа 360 градусов окружности — это уже дань более ученым расчетам. Не смогли поделить угол на три части, вот и придумали: сделаем в полном развороте 3х4х5х6=360 частей, будет делиться по определению на что угодно.
    С другой стороны есть реально интересные числа: то же. Например, стоит договориться с тараканами, что такое окружность, ее центр и радиус, а также выяснить, что такое ряды, так сразу любой таракан сможет доказать вам, что длина окружности, выраженная через ее же радиус, равна Пи.
    Короче, старая хитрость: хочешь понять систему — говори на ее языке, а не на своем. Это знают математики и программисты, взять ту же задачу вавилонских башен и ее рекурсивное решение. Оказалось, что есть простое решение, нужно только выбрать точку зрения.
    А мы тут при чем? Вот при чем. Как правило, при задании dt в числовых методах используются "отбалденные" значения типа 0,1. Это число просто удобно в десятичной системе счисления — больше в нем ничего хорошего. Даже если применяются методы динамического шага, то в лучшем случае мы перейдем к 0,2 или 0,01. Хрен редьки не слаще.
    На самом-то деле наша система обладает своим собственным сердцем: R*cos(wt). Вот это и есть естественный для нашей системы хронометр, часы — или называйте как хотите. Один полный оборот этих часов — это и будет наша единица времени, назовем ее революцией, то есть оборотом.
    По ходу задачи для получения аттракторов мы должны будем фиксировать значения в одной фазе нашего колебатора, например в нулевой. Если мы выберем dt произвольно, то не факт, что в одном обороте будет целое число шагов — даже наверняка не будет. В результате наш рабочий цикл для вычисления тысячи точек будет выглядеть примерно так:
    int time=0; dt=0.1; cnt=0;
    while(cnt<1000) {
    x1=fn(x);
    if ((2*Pi*(cnt+1))-(tme*w))>=0 {cnt++; … }
    x=x1;
    }


    Короче, мы должны будем отслеживать, как наша "стрелка часов" приближается к нулевой отметке, и брать, например, первую точку, которая прошла "за полночь". Не точно, не удобно и не спортивно. Гораздо проще и куда интереснее разделить нашу революцию на целое число частей (как это сделано с градусами) и "ходить конем" только в эти точки. Тогда вычисления аттрактора будут точными, кратными целому и постоянному числу "ходов".

    На сколько частей делить революцию — априори не понятно, но можно предположить, что для вычислений удобными будут степени двойки. Тогда мы сможем для энного хода получать значение mod(n), что для степеней двойки эффективно реализуется отбрасыванием старших разрядов с помощью битовой операции AND.

    Введем такую величину, как революция/2n, или сокращенно revN2. Это величина, представляющая деление одного оборота на 2n. То есть: rev8 — 256-я часть от одного оборота, rev10 — 1024-я и т.д. Такая система измерения удобна для компьютера. Например, можно создать объект rev (8, "сos", R, w), который просчитывает косинус с градацией 256 позиций на один оборот, с радиусом R и частотой w и заносит результаты в таблицу-массив. Частота тут, собственно, нужна, для вычисления временного шага: если rev8=2*Pi/2n, то w*dt_revN=2*Pi/2n, в частности w*dt_rev0=2*Pi/20. Это можно реализовать как метод объекта rev, например GetTimeStep().

    Теперь все чудно: для получения тысячи точек аттрактора только и нужно, что устроить цикл:

    for (i=0;i++;i<1000) for (j=0;j++;j<256)

    А значения косинуса можно получать из массива в заранее просчитанном объекте rev:

    rev.GetValue(i)

    Не буду рассказывать, насколько выборка из массива быстрее вычисления косинуса. Скажу только, что в ActiveScript обе операции реализованы способом, далеким от идеального. Массивы на самом деле представляют собой ассоциативные списки Java, косинус — тоже, очевидно, не реализуется одной процессорной командой, как могло бы быть в идеале. Но и в этом случае массив дает огромное преимущество, включая экономию на одном дополнительном умножении на радиус на каждом расчете. Ситуация осложняется еще и тем, что для расчета одной точки Cos вызывается четыре раза, то есть для тысячи точек и rev8 количество вычисляемых косинусов достигает 4х256х1000=1e6, то есть одного миллиона! Это не шутка даже для ассемблера.

    На этом — конец теории, полный и окончательный.

    Об объектной модели ActionScript

    Если вы привыкли работать с объектами в C++, то объекты в ActionScript частично окажутся для вас шокирующими. Для начала: вы привыкли к наличию классов и экземпляров? Придется отвыкать. Классы в ActionScript — это тоже экземпляры, только особого типа. Ну, собственно, если вы задумаетесь, как работают статические методы в классах C++, то поймете, что создавать экземпляр не всегда нужно. Если проводить параллель с ActiveX, то объекты-классы (объекты типа "класс") можно назвать фабриками классов.
    Эта каша серьезно усложняет понимание, но не использование классов и объектов. Об объектах-классах также можно думать как о шаблонах, а о производных "экземплярах" как о копиях, создаваемых методом Clone(). Поэтому об объектах-классах еще говорят как об объектах верхнего уровня.
    На самом деле вы будете часто пользоваться такими объектами верхнего уровня, предопределенными в самом Flash. Некоторые объекты вообще существуют в одном экземпляре, точнее — не являются экземплярами никаких классов, и создание новых копий не предполагается. На таком объекте выполняются только статические методы, хотя понятие статических методов, как таковых, в ActionScript, не существует.
    К более привычным относятся два других типа объектов — "сточные" и пользовательские. Первые заранее определены, и вы обычно создаете их экземпляры. Например, вы создаете новый экземпляр snd=new Sound() для воспроизведения вашего саундтрека. Особый тип объектов, MovieClip, создается специальной функцией. Пользовательские классы создаете вы сами. И тут вас поджидает другой микро-шок.
    Этот микро-шок — синтаксис декларирования класса. Его (синтаксиса) нет. Для определения класса используется слово function! Это уже жестоко напоминает "ООП" в perl: оказывается, все реализовано через области видимости, то есть класс определяется областью видимости локальных переменных и функций.
    Это стало возможным потому, что, в отличие от C++ и в полном соответствии с Паскалем, допускается создание локальных функций внутри функций, так сказать иерархическая, а не одноранговая архитектура.
    На еще более глубоком уровне зарыты локальные анонимные функции — то, что мы назвали бы виртуальными методами или указателями на функции. Эти функции доступны не по имени, а через "хэндлеры", в качестве которых выступают переменные, в частности — элементы списка. Именно так, через список дочерних функций, реализованы области видимости. Виртуальность заключается в том, что вы можете найти нужный метод и переопределить его, независимо от того, писали вы его сами или же унаследовали от суперкласса.
    Сами функции, как можно уже догадаться, также являются объектами типа Function. Естественно, что функция содержит списки локальных объектов. Кроме этого функции содержат список своих аргументов (свойство arguments), ссылку на вызывающую и вызываемую функции (то есть на саму себя), а также несколько методов, вроде call и apply. Эти методы явно получают в качестве первого параметра ссылку на объект, из которого вызывается метод, и null, если это "свободная" функция.
    Жара, однако, крепчает. Оставим на время эту теорию и проиллюстрируем ее практикой. Не простой, конечно, а относящейся к нашей задачке. Создадим класс, который вычисляет тригонометрические (впрочем, как и любые другие) функции, разделяя окружность на 2n частей. Впоследствии для любого положительного N возвращается значение в этой точке. Также можно спросить, какое "время" соответствует этому N. Параметры на входе конструктора: n, fn(){}, A, w. Где n определяет количество точек, функция задает вычисляемую зависимость, A и w — амплитуда и частота соответственно. Go-go.
    function rev(n,fun,a,w) {
    this.length=1 this.mask=this.length-1;
    this.values=new Array(this.length);
    this.slice=Math.PI*2/this.length/w;
    var i=0;
    while (i this.values[i]=a*fun(i*this.slice*w); i++; }
    }
    rev.prototype.GetValue=function(i){ return this.values[i&this.mask];}
    rev.prototype.GetSlice=function(){ return this.slice;}
    rev.prototype.GetLength=function() {return this.length;}


    Вы, возможно, захотите спросить, почему я использую while, а не for. А потому что в for у меня проблемы. Может глюк, а может мне просто ума не хватает. В любом случае, в теории есть только три программных конструкции: последовательность, выбор и итерация — так что разницы никакой. Как видите, код компактный, на вид приятный (и при этом — работающий). Есть пару "хакерских" местечек, например вычисление той же битовой маски или "почему сначала делится на w, а потом умножается". Честно говоря, я и сам ничего не понимаю, просто это вот работает — значит угадал что-то.

    Использование этого объекта такое (числа — номера кадров):

    1 #include "coord.as"
    #include "rev.as"
    callback=function(arg){return Math.cos(arg);}
    rev1=new rev(10,callback,1,1);
    rev2=new rev(6,callback,2,2);
    2 cnt=0;
    while (cnt dt(cnt*rev1.GetSlice(),rev1.GetValue(cnt),0x00f);
    Cnt++; }
    3 cnt=0;
    while (cnt dt(cnt*rev2.GetSlice(),rev2.GetValue(cnt),0x00f);
    Cnt++; }
    4 Stop();


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

    Об объектной модели ActionScript

    Наши объекты работают ожидаемым образом

    Два глюка, кроме for, были обнаружены при работе с as-файлами. Во-первых, вы обязательно должны завершить последнюю строку переводом курсора — иначе ошибки, ошибки... Такие глупости когда-то встречались в некоторых утилитах UNIX — и, как видно, ходят по миру до сих пор. Второе — в режиме Ctrl+Enter какие-то вещи не меняются при изменении внешних файлов. То есть алгоритм обновления кэша включаемых файлов не работает как следовало было. Если ваши изменения в тексте программы не имеют эффекта, попробуйте проверять по Ctrl+F12 — должно сработать. Кстати, и производительность в браузере раза в два больше. Видимо, отключается какая-то отладка или что-то в том же роде.

    Практика: точки, системы координат, синхронизация 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++;
    }


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

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

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

    Странные картиночки

    Мы не будем детально обсуждать реализацию наших числовых методов, там все как в книжках. Важно то, что есть какая-то функция. На входе она воспринимает точку на плоскости, а на выходе дает следующую точку. Делов-то. Полный текст всех наших AS файлов — на КП-диске. В нашем "кине" код тоже не слишком сложен и похож на то, что мы уже видели:
    1 #include "coord.as"
    #include "rk4.as"
    c=1.0; A=1.1; w=2.1; revN=8;
    rk = new rk4(c,A,w,revN);
    dots=1;
    dotcolor=0x003300
    2 for (i=0;i<500;i++) {
    rk.NextPoint();
    if ((rk.GetTI()&255)==0) {
    dt(rk.GetX(),rk.GetY(),dotcolor);
    dots++;
    }
    }
    3 if (dots>100000) {Stop();} else {GotoAndPlay(2);}

    Вот как один из наших странных аттракторов выглядит в результате.
    Странные картиночки
    Инь и Янь имеют простую математическую интерпретацию
    Как видите, все очень красиво и похоже на ожидаемый результат. По сложившейся традиции все происходит на черном фоне. Аттрактора тут, собственно, два — в разных фазах. Фиолетовый соответствует нулевому смещению фаз косинуса, красный — полуобороту, углу Пи. Благодаря нашему табличному генератору делается все это просто.
    Конечно, правильный препод должен сделать замечание, что, мол, на координатные оси не нанесены единицы измерения, кроме того, не указаны параметры. Серьезный программист, посмотрев в код, может дополнить, что координатную сетку тоже можно сделать объектом и параметризировать. К тому же, поскольку вычисления тут превалируют над отрисовкой, то несложно будет рисовать сразу 128 фазовых слоев в 128-ми окнах. Более того, можно эффективно анимировать слои, циклически заменяя символы MovieClip.
    Да, все это так — но главное для нас не это. Куда интересней, что ActionScript может считать не хуже того же Бейсика — и при этом эффективно отображать результаты. Что и требовалось доказать. Кстати, вы легко можете кликнуть по клипу и прилизать любой участок — без единой строки кода. А теперь реализуйте это сами, например на C++… Ну, а мы пока будем продвигаться дальше.
    А где же тут интерактивность и распределенные вычисления? Простой ответ: в Караганде. Более детально: Flash в современной форме включает все для интерактивности, реализованы основные элементы управления, а каких и нет — те можно добавить. Первое, что приходит в голову: позволить пользователю вводить параметры нашего уравнения и нажимать кнопку Пересчитать. Но это противоречит другой идее — распределенным вычислениям. В конце концов, можно сделать хотя бы кнопку Выход, для нетерпеливых.
    Идея распределенного вычисления как раз и состоит в централизованном (или распределенном) управлении вычислительным процессом. Для реализации такого поведения проще всего создать на сервере XML-приложение, которое будет реализовать управление. Пользователю браузера при этом отводится роль лоха-наблюдателя.
    В случае с нашим приложением можно предположить, что в качестве параметров будут выступать c, A и w. В качестве результата программа может сбрасывать те же параметры, плюс тип полученного графика: странный — не странный (придется еще реализовать детектор странности). Серверная часть легко сможет заносить эти данные в базу данных — с последующим анализом. Кстати, программа анализа этой БД тоже может быть написана на Flash, почему бы и нет.
    С точки зрения программирования ActiveScript тут нет никаких проблем: в язык встроена поддержка XML-сообщений. Также в широком ходу и старая техника — LoadVariables. При этом вместо файла вы указываете имя CGI-скрипта, который и поставляет необходимые пары "имя-значение". Короче, даже выбор есть.
    Выглядит это даже проще, чем кажется: например, для загрузки параметров из duffarg.pl можно загрузить переменные. Для этого достаточно строку
    c=1.0; A=1.1; w=2.1; revN=8;
    заменить на:
    _root.LoadVariables(duffarg.pl,"GET");
    Если скрипт генерирует параметры в виде XML, загрузить их будет чуток сложнее:
    duffXMLParams=new XML();
    duffXMLParams.onLoad=function(success) {
    if (success) {
    … Разбор XML документа
    }
    }
    duffXMLParams.load(duffarg.xml);

    Для "отдачи" результатов легко можно использовать метод XML.send() — отсылка работает еще проще, без ожидания результата. Несложно организовать и отсылку переменных, указав в качестве метода доступа "POST" либо же "PUT" — в качестве второго параметра LoadVariables().

    Задачка: странные аттракторы (очень краткий курс)

    Придумал, а точнее — вспомнил. Есть в мире математики такие популярные вещи, как странные аттракторы. Это когда что-то там движется странно. Как известно, когда решаешь дифуру, то в простом случае получается что-то такое периодическое, или не совсем — ну, короче, что-то не странное. Поведение простого колебатора одно из трех: либо затухает, либо выходит на орбиту (тупо аппроксимирует к ней), либо вообще входит в резонанс (само с собой — одна часть уравнения с другой) и разрывает все к ежам, как говорится — "движущиеся части системы выходят из наблюдаемой области". Во втором случае колебатор называют осциллятором.
    Ага, нету такого слова колебатор? Ну о’кей, считайте меня автором — с момента публикации у меня на это слово все права.
    А потом обнаруживается, что некоторые системы колбасятся по непонятному закону — то есть не видно, где у него период. Одним из простых странных колебаторов является система, описываемая уравнением Дюффинга:
    dx/dt=dfy, dy/dt = x-x3 — c*y + A*cos(w*t)
    Как видите (ну, типа видите), тут в наличие источник суеты в виде какого-то внешнего колебатора A*cos(w*t) и "гальмо" (энергетическая утечка, в механике — трение) в виде -c*y и, плюс к этому, еще какая-то гадость, описывающая закон движения точки в пространстве в зависимости от времени. Есть несложная физическая интерпретация — но она нам сейчас без интереса. Хотите — почитайте здесь: .
    Да, так вот, при некоторых параметрах получаем достаточно замысловатое движение. Странно ведут себя как координата x, так и скорость y. Вот как выглядит, например, жужжание хаотического шмеля.
    Задачка: странные аттракторы (очень краткий курс)
    Координата и скорость точки в хаотическом режиме
    Для прикольности можно построить график зависимости x от y — красиво видно, как и куда сходится поведение системы с течением времени.
    Задачка: странные аттракторы (очень краткий курс)
    Скорость как функция координаты
    Больше таких картинок вы можете увидеть на сайте, с которого было взято это изображение — линк в конце статьи. Я нарочно взял независимые результаты, чтобы потом сравнить их с собственными, тут никакой ошибки. Интерактивную версию можно посмотреть здесь: .
    Есть еще вариант: отмечать на графике только точки в одной фазе колебатора возбуждения. Это именно и есть странный аттрактор. Там такой кисель смешной образуется — называется подковообразное преобразование. По этим картинкам определять странность вообще просто. Посмотреть на странный аттрактор "в натуре" в виде gif-анимации можно по адресу: www.sekine-lab.ei.tuat.ac.jp/~kanamaru/Chaos/e/Animation/duffing.html.
    Что нас будет интересовать, это то, при каких параметрах проявляется странное поведение. Само поле параметров является слегка глючным: при одних параметрах проявляется странность аттрактора, при других (даже бесконечно близких) — как и не бывало, налицо отвратительная и нежелательная гармония. Вот и постараемся, по крайней мере графически, отобразить области, где странность проявляется, а также области, где таких странностей нет.

    Загрузка текста и переменных во Flash

    (C). ,
    Как таковой возможности загружать текст во Flash нету, но имеется возможность загружать переменные извне (в том числе и из текстовых файлов). Переменные передаются в стандартном формате GET-запроса:
    [переменная]=[значение]&[переменная]=[значение]&...&...
    - в таком виде формируются пары переменная-значение, разделённые символом амперсанда ("&"). Flash может также принимать переменные, сформированные серверными сценариями (PHP, ASP, JSP, CGI, Cold Fusion и т.п.). Но об этом пойдёт речь ниже. Сейчас же продемонстрируем загрузку текста (и почему только текста? да любых переменных! :) из обычного (текстового :) файла.
    Для начала, сформируем текстовый файл, который нам предстоит загрузить. Он должен состоять из пар переменная=значение, разделенных амперсандом. Амперсанд определяет конец значения переменной, так что перед ним не должно быть пробелов или символов перевода каретки (если, конечно, это не входит в ваши планы). Вот пример содержимого текстового файла, который можно дать Flash на загрузку:
    myText=This is the text to be loaded to Flash.&myValue=123.45
    Сохраняем этот файл под именем "vars.txt".
    Теперь создадим Flash файл, в который будет загружаться этот файл. Нам потребуются текстовые поля с именами myText и myValue и кнопка, которую мы будем использовать, чтобы инициировать загрузку:
    Загрузка текста и переменных во Flash

    Нам нужен только очень простой код для кнопки:
    on(release) {

    loadVariables("vars.txt", "_root");

    }
    Как вы догадались, всё выполняет функция loadVariables(). Рассмотрим её подробнее.
    loadVariables() служит не только для загрузки переменных из внешних источников, но и для передачи переменных из Flash в серверные скрипты или другие ролики Flash.
    Формат фунцкции loadVariables() следующий:
    loadVariables("url", level/"target" [, variables]);
    url - абсолютная или относительная ссылка на файл, из которого/в который будут посылаться данные.
    level - номер уровня, на который будут загружены переменные. Чтобы указать числовое значение, нужно использовать функцию loadVariablesNum(). В этой же функции можно использовать идентификаторы уровней (например, loadVariablesNum("vars.txt", "_level0") для загрузки на 0-й уровень).
    target - идентификатор клипа (movie clip), в который загружаются переменные.
    Указывается либо идентификатор уровня, либо идентификатор клипа. Нельзя указать оба параметра одновременно.
    variables - необязательный параметр, используется при посылке переменных, указывает метод посылки: GET или POST.
    В нашем примере, мы загружали переменные из текстового файла vars.txt в основной объект Flash-ролика: _root.
    Скачать файлы данного урока: (3 k)
    В рассказано как можно передавать данные из Flash в сценарий PHP.
    Удачи!



    Передача данных из Flash в серверные сценарии

    (C). ,
    В прошлом уроке мы рассмотрели возможность загрузки данных во Flash. Сейчас мы научимся посылать данные из Flash во внешние сценарии, или в другие ролики Flash.
    Как и в , нам потребуется .swf файл, из которого мы будем посылать данные. Пусть он содержит два поля для ввода переменных и пару кнопок, при нажатии на которые будут посылаться данные:
    Передача данных из Flash в серверные сценарии

    Послать данные можно как с помощью функции loadVariables(), описанной в , так и с помощью знакомой многим getURL(). В нашем примере одна кнопка использует первую функцию, другая - вариант с getURL(). Разница этих методов состоит в том, что loadVariables() вызывает скрипт, без отображения его в окне браузера, а getURL() открывает свою цель в браузере и передаёт ей переменные.
    Итак, в ролике присутствуют два текстовых поля для ввода с именами переменных myText и myValue. По умолчанию там записан текст "поле myText" и "поле myValue". Левая кнопка вызывает PHP скрипт "target.php" и передаёт ему значение переменных. Правая - открывает файл "target2.php" и тоже передаёт ему данные из .swf. Код содержащийся в файлах приводится ниже.
    Вот код первой кнопки:
    on(release) {

    loadVariables("target.php", "_root", "POST");

    }
    Функция уже описывалась в прошлом уроке, интересующися могут .
    Код второй кнопки:
    on(release) {

    getURL("target2.php", "_blank", "POST");

    }
    Синтаксис getURL() очень похож на синтаксис loadVariables:
    getURL(url [, window [, "variables"]]);
    url - единственный обязательный параметр, путь до файла, который загружается в браузер.
    window - имя окна или фрейма, в которое загружается файл. Значение "_blank" означает, что содержимое открывается в новом окне.
    variables - метод передачи переменных: GET или POST.
    Код файла "target.php":

    $f = fopen("result", "w");


    fwrite($f, $myText);

    fclose($f);

    ?>

    Код файла "target2.php":


    print $myText;

    print "
    ";

    print $myValue;

    ?>

    Сценарий target. php сохраняет содержимое переменной myText в файле "result", позволяя тем самым проверить работу loadVariables(). Сценарий target2.php просто выводит значиния myText и myValue в окно браузера. Как видите, переменные напрямую передаются в PHP скрипт и имеют там такие же имена, как и во Flash.

    Точно так же можно получать доступ к переменным из любого серверного приложения, имеющего интерфейс CGI. Например, в Perl можно использовать конструкцию param("myText"). В ASP доступ к переменным можно получить через Request.QueryString("myText").

    Использованные в уроке файлы можно забрать здесь: (3 k)

    Удачи!


    Flash - статьи

    Динамическая загрузка внешних .mp3 файлов

    Во Flash MX появилась возможность загрузки внешних файлов. Для
    этого используется функция loadSound(url, stream) объекта Sound.
    Первый параметр, url, указывает путь к файлу. Второй, stream,
    является логической (булевой) переменной, определяющий потоковый режим загрузки
    звукового файла. Если значение stream равно false, то Flash дождётся
    полной загрузки файла, прежде чем его воспроизводить. Если же stream
    равен true, то файл может воспроизводиться в потоковом режиме не загрузившись
    полностью. Данный режим рекомендуется использовать только на быстрых каналах
    связи или при использовании на локальной машине, т.к. потоковое воспроизведение
    по нашим каналам Интернет часто приводит к прерыванию воспроизведения длинными
    паузами :).
    snd1 = new Sound();

    snd1.loadSound("track03.mp3", true);

    snd2 = new Sound();

    snd2.loadSound("http://someserver.com/some_file.mp3", false);
    Специально для этого урока я сделал маленький проигрыватель,
    который использует подгрузку внешних файлов и позволяет менять громкость и баланс
    проигрываемой композиции. Он также позволяет отслеживать сколько процентов запрошенной
    композиции загружено. Этот пример можно скачать (,
    218k), и поэкспериментировать самому.
    Внимание! mp3 файлы не включены в архив с примером, поэтому вам
    придётся использовать свои, предварительно изменив пути к ним в параметрах компонента
    ComboBox.
    Надеюсь, данная статья оказалась вам полезной.
    Удачи!
    (C). // 2002-2003 // all rights reserved

    Динамическое изменение параметров звука

    Объект Sound позволяет динамически устанавливать уровень громкости
    и баланс (панорамирование) звука. Существуют также функции для получения значения
    баланса и громкости.
    Для установки громкости звука используется функция setVolume(value).
    Параметр value может принимать значения от 0 (минимальный уровень) до
    100 (максимальный уровень). По умолчанию уровень громкости равен 100.
    Для установки баланса используется функция setPan(value).
    Здесь параметр value может принимать значения от -100 (весь звук в левом
    канале) до 100 (весь звук в правом канале). Значение 0 (оно стоит по умолчанию)
    означает, что звук равномерно распределён между обоими каналами.
    globalSnd.setVolume(50); // Половинная
    громкость

    globalSnd.setPan(70); // Сместить звук по большей части в правый канал
    Можно использовать функции getVolume() и getPan()
    для получения текущего значения громкости и баланса соответственно.
    currentVolume = someSnd.getVolume();

    currentPan = someSnd.getPan();
    Можно одновременно устанавливать все параметры звука при помощи
    функции setTransform(), но мы её в данной статье не рассматриваем.
    Можно в цикле вызывать функции setVolume() и setPan(),
    плавно изменяя значение параметра, и тем самым создавать эффекты затухающего,
    возрастающего и/или перемещающегося звука.

    Привязка звука к объектам Sound

    Объект Sound позволяет вопроизводить звуки, не втавленные непосредственно в ключевой кадр временной шкалы. Но для этого их надо сначала поместить в библиотеку, а затем экспортировать для использования в ActionScript.
    Для помещения звука в библиотеку достаточно выбрать "File -> Import to Library...", и в появившемся окне указать имя звукового файла.
    Теперь, когда файл уже находится в библиотеке, выделяем его,
    Привязка звука к объектам Sound
    кликаем правой кнопкой мыши на названии звука, и в появившемся контекстном меню выбираем "Linkage...". Должно появится подобное окошко:
    Привязка звука к объектам Sound
    В поле Identifier мы вводим идентификатор (имя) звукового ресурса. Можно включить галочку "Export in first frame", тогда звук будет загружен уже в первом кадре мульта, однако, такой способ неприменим при хоть сколько-нибудь больших звуках, т.к. до начала загрузки 1-го кадра (даже прелоадера не видно!) мы видим пустое место, появляется ощущение "зависшего клипа". Поэтому рекомендуется выключать эту галочку, а в кадре где нужна загрузка звука, помещать его на временную шкалу с параметрами Sync Stop. Тогда звук не будет загружен до этого кадра и можно спокойно использовать прелоадер.
    Далее, чтобы привязать звуковой ресурс к звуковому объекту, нужно
    воспользоваться функцией attachSound(idName), в которой параметр idName
    указывает идентификатор звукового ресурса:
    mySound = new Sound();

    mySound.attachSound("tada");
    После этого наш звуковой объект готов к манипуляциям.

    Программное управление звуком

    Рубен Сардарян & Андрей Жебраков,
    В этой статье мы познакомим вас с программным управлением звуком при помощи языка AcrionScript. Flash иногда очень неадекватно воспринимает звуки, размещённые прямо во временной шкале, поэтому при создании больших мультов без программного управления не обойтись.
    Мы рассмотрим:
  • создание звуковых объектов (объектов типа Sound);

  • привязку звуков к таким объектам;

  • управление воспроизведением звука;

  • динамическое изменение параметров звучания (громкость и панорамирование);

  • загрузку в объект Sound внешних .mp3 файлов.

  • Объект Sound появился в 5-й версии Flash, поэтому все приёмы, рассмотренные в статье, кроме загрузки внешних .mp3 файлов, могут быть использованы и в 5-й версии.

    Создание звуковых объектов

    Начнём. Вы уже наверное догадались, чтобы производить какие-либо операции со звуком, нужно создать объект типа Sound. Сделать это очень просто. Существует стандартная конструкция
    soundObject = new Sound(target);
    где soundObject - это имя создаваемого звукового объекта, а target - необязательный параметр, указывающий объект типа MovieClip, или уровень. Если мы хотим, чтобы наш звуковой объект работал только в одном MovieClip-е или на одном уровне, то мы должны его создавать с указанием данного параметра:
    movieSound = new Sound("SomeClip");

    movieSound = new Sound("_root.teddy.mouth");

    levelSound = new Sound("_level1");
    Если же планируется использовать объект в любом месте вашей флэшки, то он создаётся без параметров:
    globalSound = new Sound();

    Воспроизведение и остановка звуков

    Основными действиями, выполняемыми со звуковыми объектами являются,
    конечно же, воспроизведение и остановка воспроизведения.
    Для того, чтобы воспроизвести звук, используется функция start(offset,
    loops)
    объекта Sound. Параметр offset, указывает смещение
    в секундах, от начала звукового фрагмента, а loops - количество повторений
    проигрываемого фрагмента.
    Например, если мы хотим проиграть вторую половину 20-тисекундного
    фрагмента 3 раза, мы запишем:
    someSoundObject.play(10, 3);
    Звук начнёт проигрываться с 10-й секунды.
    Оба параметра функции start() являются необязательными.
    По умолчанию звук проигрывается с самого начала один раз:
    someSoundObject.play();
    Можно повторить звуковой фрагмент несколько раз с начала, тогда
    мы указываем нулевое смещение:
    someSoundObject.play(0, 5);
    Чтобы остановить проигрывание, используется функция stop(idName).
    Вызванная без параметров, функция останавливает все звуки. Указав параметр idName,
    обозначающий идентификатор звука, можно остановить только один специфический
    звук:
    globalSnd.stop();

    someSnd.stop("tada");

    Flash - статьи

    Цель данной работы.

    Оценить возможности Flash для создании клиентов Web сервисов.

    Flash client.

    Для оценки возможностей Flash 8 написан простой SOAP (76Кб).
    Приложение формирует и передает запросы Web сервису, принимает от него данные и отображает их. С точки зрения пользователя Flash клиент и Web Service обеспечивают функциональность:
  • Последовательный просмотр всех записей таблицы базы данных;
  • Чтение произвольной записи таблицы базы данных;
  • Обновление произвольной записи;
  • Вставку новой записи.

  • Исходный тест Flash клиента в виде RAR файла Вы можете взять .
    Eсли Web сервис создан и размещен, обращение к нему может исходить от любого SOAP клиента, а не только от описываемого здесь. Более того, тип технологии, применяемой для создания клиента или сервиса, и язык реализации могут быть выбраны произвольно, но выбранная технология должна поддерживать SOAP/WSDL.

    Internet как среда разработки.

    Web сервис, созданный и размещенный в Internet по некоторому URL определяет:
  • имена методов доступа к данным;
  • имена и типы входных данных;
  • имена и типы выходных данных;
  • типы сообщений;
  • кодировки;
  • пространства имен

  • и некоторые другие параметры.
    Другими словами, Web сервис формализовано описывает данные и предоставляет открытые методы доступа к ним.

    Использование приложения.

    Работать с Web клиентом просто:
  • Листание записей выполняется кнопками "Prior" и "Next".
  • Для чтения произвольной записи установите ее номер в поле "Номер записи" и нажмите кнопку "Select" .
  • Для обновления записи заполните все поля формы нужными данными, включая номер записи и нажмите кнопку "Update".
  • Вставка записи выполняется после ввода данных в поля формы клиента и нажатия кнопки "Insert". Номер записи вводить не обязательно, программа сама найдет последнюю запись в таблице базы данных.

  • P.S. Используемая здесь версия NUSOAP не работает с Unicode, принятой по умолчанию во Flash, однако, после незначительной доработки эта проблема решается. Для заинтересованных читателей пусть это будет домашним заданием.
    Всего хорошего.

    Описание реализации.

    Никаких особых требований к набору инструментов: PHP, NUSOAP, mySQL нет.
  • Версия PHP может быть 4.0.6 и выше;
  • mySQL - любая стабильно работающая версия;
  • Пакет NUSOAP достаточно скопировать в рабочую директорию на сервере.

  • Исходный текст Web сервиса прозрачен и содержит:
  • Последовательное определение методов сервиса (строки с 7 по 82):

  • selectSales;
  • updatesales;
  • insertSales
  • Регистрацию обьявленных методов (строки с 83 по 114);
  • Реализацию обьявленных методов в виде одноименных PHP функций (строки с 119 по 200).

  • Web клиент реализован в среде Macromedia Flash 8 c использованием компонентов:
  • WebServiceConnector;
  • TextInput;
  • Button

  • и некоторых других.
    Для просмотра Web сервиса в Internel Flash имеет специальное окно, которое может быть открыто, например, так:
    Windows --> Other Panels --> Web Services.
    В окне Define Web Service следует ввести URI сервиса, для нашего случая это:
    Flash обратится по заданному адресу, считает и отобразит информацию о сервисе. Состав предоставляемой Flash информации о сервисе идиентичен тому, что можно увидеть в браузере, обратившись по URL, но Flash отобразит только те данные, которые необходимы для реализации клиента:
  • имена методов доступа;
  • входные и выходные параметры.

  • Отмечу так-же, что аналогичную функцию имеет и компонент WebServiceConnector, настройка которого может быть выполнена как визуальными средствами Flash так и из ActionScript 2.0
    Web клиент очень прост, он содержит несколько десятков строк текста, существенная часть которого посвящена анализу возмоможных ошибок.
    Основой Web клиента служат три компонента WebServiceConnect (по числу методов сервиса). Правда, этот компонент мог бы быть и один, но в этом случае его пришлость бы перенастраивать при смене вызываемого метода, что, наверное, не очень рационально. Большая часть настройки клиента выполняется визуальными средсвами среды Flash, что весьма удобно.

    На стороне сервера, средствами языка

    На стороне сервера, средствами языка PHP и пакета создан Web сервис реализующий RPC (Remoute Procedure Calls) к СУБД mySQL. Web сервис выполняет на стороне сервера SQL операторы:
  • Select;
  • Update;
  • Insert,

  • которые реализованы в виде SOAP/PHP методов:
  • selectSales ($request);
  • updateSales ($request);
  • insertSales ($request)

  • где переменная $request содержит параметры запроса, принятые от клиента.
    Для демонстрации работы с Web сервисом, предварительно, в базе данных создана небольшая таблица:
    CREATE TABLE DBSERVICE ( ID INT NOT NULL PRIMARY KEY, SALES VARCHAR(100), DESCRIPT VARCHAR(150), PRICE INT );
    Данный можно увидеть в Internet, используя обычный браузер. Открыв ссылку WSDL, Вы можете посмотреть описание Web сервиса средствами XML. На этой же странице, открыв соответстующие ссылки, можно ознакомиться с описанием RPC методов сервиса.
    Исходный тест Web сервиса в виде RAR файла Вы пожете взять отсюда.

    Web Service в Macromedia Flash.

    Мacromedia Flash 7,8 версий содержат набор классов для создания клиентов Web сервисов:
  • WebServiceConnector;
  • DataSet;
  • DataGrid;
  • RDBMSResolver;
  • DataHolder

  • и некоторые другие.
    Имеется так-же богатый набор классов для работы с данными, представленными в виде XML файлов, но это тема для отдельной статьи.
    Для реализации Web сервиса на стороне сервера может быть использована любая технология поддерживающая SOAP/WSDL, например:
  • J2EE;
  • .NET;
  • PHP.


  • 

        Сайт: Аннимация - Видео - Графика