Сергей Кулинкович - Специально для «Flash-онлайн!» [entries|archive|friends|userinfo]
Сергей Кулинкович

[ website | www.kulinkovich.info ]
[ userinfo | livejournal userinfo ]
[ archive | journal archive ]

Специально для «Flash-онлайн!» [May. 8th, 2008|06:25 am]
Previous Entry Add to Memories Tell a Friend Next Entry
[Tags|]

Программная анимация.
Денис, www.siakera.com


Всем привет!
Меня зовут Денис. Как и Сергей, я уже много лет занимаюсь разработкой флеш-приложений и прочей веб и offline радости :) Не мог упустить возможности поделится с вами некоторыми флеш-полезностями)).

Очень рад, что вас собралось очень много на этот интереснейший тренинг!)

Если будете слушать Сергея — он из вас сделает крутых флешеров) А быть крутым флешером — это совсем не шутки!) Это тысячи километров заанимашенного таймлана за плечами, это способность придумать анимацию для целого промосайта за 15 секунд, это знать как ужать всё что угодно до 25 кб, это красный Ferrari возле дома, мировая слава итп! :)

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

Сегодня я расскажу об очень полезной и довольно лёгкой штучке).

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

Но тут сразу с мыслью «Хе! Я могу круче! )» вы шустро открывали флеш… накидывали кучу графики, эффектов, фильтров, полупрозрачных стильных блюров, сложных роловеров, широченный бэкграунд, который постоянно плывёт… Ставили fps (frames per second) окороло 100, делали паблиш и наблюдали дикие тормоза, перегруз проца, критические ошибки браузеров и так далее) Сайт симпатичный, но в таком виде он не имеет права на существование :)

Помочь в этом случае может программная анимация! :) Т.к. она абсолютно объективно выигрывает у фрэймовой (назовём её так).

Кратко о плюсах программной анимации:
  • Mеньше грузит проц, шустрее работает
  • Скомпилированный файл с программной анимацией весит меньше, чем с аналогичной фрэймовой.
  • В некоторых случаях удобна для редактирования. Поменяв пару строк кода, вы можете получить совершенно другую анимацию.
  • Незаменима при создания сложных структур и флешек с динамичным контентом
Минусы:
  • Требование хотя бы минимальных знаний Action Script.
  • Ненаглядность анимирования: увидеть анимацию можно, только закончив код и сделав компеляцию swf
Но и ещё стоит добавить, что даже программная анимация не творит чудес! Но не стоит сильно расстраиваться, просто помните об основных вещах, которые подгружают флеш, а именно:
  • большие картинки и большие, сложные объекты
  • большое количество мувиклипов сразу
  • полупрозрачность и прозрачность
  • фильтры
  • сложные дёртовые шрифты
  • экстремальный скэйлинг объектов
  • неоптимизированный код

Это в общем о программной анимации. На практике программная анимация может быть реализована во можествах форм.
Сегодня мы разберём 2 улётных класса:


Tween class & Easing class
Рассмотрим их функционал, а в конце бонусом сделаю вам видео-туториал)

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

Иначе говоря, класс Tween служит для анимирования ряда свойств мувиклипа. Происходит это по несложной схеме:
  • устанавливаем начальное значение некоторого свойства клипа
  • устанавливаем конечное значение некоторого свойства клипа
  • задаём период, за который значение свойства поменяется с начального на конечный
  • задаём вид изменения этого свойства (вид моушна)
и всего-то :)

Теперь разберём на живом примере)

Открываем Flash. Создаём новый док. Что-нить рисуем. Делаем из этого MovieClip и присваиваем Instance Name этому клипу FunnyBall. Затем кликаем на фрэйм и жмём F9 (или Right-Click – Actions) и пишем туда код :

import mx.transitions.Tween;
import mx.transitions.easing.*;

var FunnyAnimation:Tween = new Tween (FunnyBall,"_x",Strong.easeOut,0,400,2,true);

FunnyAnimation.onMotionFinished = function (){
this.yoyo()
}

и выходит у нас следующее (нажмите кнопку чтобы задвигалось):


Теперь пройдёмся по коду

import mx.transitions.Tween;
import mx.transitions.easing.*;

Для использования класса мы должны сначала его импортировать в документ. Достаточно 1 раз его импортировать и использовать его многократно.

var FunnyAnimation:Tween = new Tween (FunnyBall,"_x",Strong.easeOut,0,400,2,true);

Для контроля над свойствами клипа мы должны объявить класс Tween по шаблону

var tweenInstanceName:Tween = new Tween (object, property, function, begin, end, duration, useSeconds);
  • tweenInstanceName - валидное имя, с помощью которого мы сможем управлять анимацией.
  • object - это InstanceName объекта, который мы будем анимировать (Мувиклип, кнопка, текст…)
  • property – это _scale, _x, _y, _alpha или любое другое свойство. Писать нужно в двойных кавычках (пример: “_x”)
  • function – это тип моушна (об этом позже)
  • begin – начальное значение свойства
  • end – конечное значение свойства
  • useSeconds – использование секунд или кадров как меру времени для анимации. (true – секунды, false – кадры)

FunnyAnimation.onMotionFinished = function (){
this.yoyo();
}

В этих строчках мы использовали оператор событий (onMotionFinished) и метод (yoyo();). После завершения анимации, она вновь стартует инверсивно. Методы и операторы мы так же рассмотрим позже.

Класс Easing
Пока вернёмся к параметру function, это параметр, который определяет вид моушна (анимации). Это реализуется при помощи класса Easing, который имеет 16 различных видов моушна: 5 категорий, каждая из которых поддерживает 3 типа моушна + 1 тип, не имеющий особенностей (easeNone).

Категории моушна:
  • Regular – анимация будет постепенно замедляться или ускоряться в соответствии с выбранным типом.
  • Strong – более выраженная категория Regular
  • Back – анимация с захождением за конечные значения анимированного параметра
  • Bounce – анимация «с отскоком»
  • Elastic – микс Back & Bounce
  • None – специальная категория, анимация без изменения скорости

Типы моушна:
  • easeIn – равноускоренный
  • easeOut – равнозамедленный
  • easeInOut – равноускоренный до середины и равнозамедленный после
  • easeNone – прямолинейный (взаимодействует только с категорией None)

Категории и типы взаимодействуют вместе в таком виде Back.easeInOut. Описать все 16 видов моушна словами и даже слэнгом довольно сложно, поэтому посмотрим это на примере :) можно поиграться с точками begin\end & duration.

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

Операторы событий класса Tween
Операторы событий класса (Tween Event Handlers) это инструменты, которые срабатывают при при наступления какого-нибудь события (например завершение анимации). Используются они так:

myTween.onMotionFinished = function (){
trace("Motion is finished!");
}

Существует несколько операторов событий:
  • .onMotionChanged – постоянно срабатывающий оператор на протяжении всей анимации (от начала до конца)..
  • .onMotionFinished – срабатывает при завершении анимации
  • .onMotionResumed – срабатывает при вызове метода .resume() после предварительной остановки
  • .onMotionStarted – срабатывает при вызове метода .start() или .yoyo(). Не срабатывает при первом старте анимации после стандартного объявления класса.
  • .onMotionStopped – срабатывает при вызове метода .stop().

Методы класса Tween
Манипулировать классом Tween мы можем с помощью методов (Tween Methods), иными словами это команды, с помощью которых, класс выполняет некоторые действия. Этих команд совсем не много:
  • Tween.stop() – останавливает анимацию в текущей позиции.
  • Tween.resume() - возобновляет анимацию с текущей позиции (используется после метода .stop() )
  • Tween.continueTo(finish, duration) – продолжает анимацию с текущей позиции до позиции finish за период времени duration с применением того же вида моушна.
  • Tween.start() – начинает анимацию с начала.
  • Tween.fforward() - останавливает анимацию и одновременно переходит в конечную позицию
  • Tween.nextFrame() - переходит к следующему кадру анимации
  • Tween.preFrame() – переходит к предыдущему кадру анимации
  • Tween.rewind() - останавливает анимацию и одновременно переходит в начальную позицию
  • Tween.yoyo() – проигрывает анимацию реверсивно

Исползуются методы так: NameOfTheTween.stop();

Свойства класса Tween
Также мы можем получать доступ к некоторым свойствам класса.
  • Tween.duration – возвращает значение продолжительности анимации
  • Tween.finish – возвращает конечное значение параметра
  • Tween.FPS – возвращает значение FPS (количество кадров в секунду) проигрываемой анимации.
  • Tween.position – возвращает значение текущей позиции анимируемого мувиклипа

Например, мы можем постоянно трэйсить положение нашего объекта

MyMotionTween.onMotionChanged = function (){
trace (this.position);
}


Скачать исходник (314 Кб)
Скачать видео-урок (25.5 Мб)



Специально для «Flash-онлайн!»
LinkReply

Comments:
[User Picture]From: [info]bruma_gris
2008-05-08 04:38 am (UTC)

(Link)

потрясная статья. супер вообщеее! Ради такой инфы можно и не поспать недельку))
[User Picture]From: [info]panteras_07
2008-05-08 05:37 am (UTC)

(Link)

+1
супер
и за видео урок))
приду домой качну
[User Picture]From: [info]jamaica_rum5
2008-05-08 08:29 am (UTC)

(Link)

+1 спасибо!
срочно курить :)
[User Picture]From: [info]kissteen
2008-05-08 05:26 am (UTC)

(Link)

именно то, чего я ждал 3 недели!
Зачёт!
[User Picture]From: [info]sergo2005
2008-05-08 08:05 am (UTC)

(Link)

+1 =)
[User Picture]From: [info]yoksel
2008-05-08 11:16 am (UTC)

(Link)

та же фигня
[User Picture]From: [info]vericck
2008-05-08 06:00 am (UTC)

(Link)

Супер!!! Спасибо большое, как раз сегодня ночью пыталась это раскопать!!!
[User Picture]From: [info]la_diez
2008-05-08 06:20 am (UTC)

круть. спасибо

(Link)

import mx.transitions.easing.*;
что здесь означает * в конце?
[User Picture]From: [info]asocial_type
2008-05-08 07:13 am (UTC)

Re: круть. спасибо

(Link)

* в конце значит что импортируются необходимые классы из папки easing. Можно импортировать определенный класс. А можно поставить * и будут импортированы необходимые классы при компиляции. Позволяет сокращать код.
[User Picture]From: [info]la_diez
2008-05-08 08:16 am (UTC)

Re: круть. спасибо

(Link)

спасибо!
[User Picture]From: [info]the_palm_tree
2008-05-08 06:32 am (UTC)

(Link)

....просто в восторге...
...скорейбы сработы сбежать и за флеш приняться..)))))
..спасибо..))))
[User Picture]From: [info]mauglish
2008-05-08 07:12 am (UTC)

(Link)

спаис бочки!
пока не выкинули(может оставят слушателем ??:)
сижу читаю анализирую
радуюсь!
огромное мерси
[User Picture]From: [info]asocial_type
2008-05-08 07:52 am (UTC)

Урок хороший!!

(Link)

Но для начинающих я бы еще добавил кое-что.
1. для var FunnyAnimation:Tween = new Tween (FunnyBall,"_x",Strong.easeOut,0,400,2,true)
иногда очень полезно бывает задавать координаты не 0 или 400, а FunnyBall._x и т.д. В результате получится var FunnyAnimation:Tween = new Tween (FunnyBall,"_x",Strong.easeOut,FunnyBall._x,400,2,true). Это бывает полезно для эффектов например наведения машки на кнопку и ухода с нее, когда твин не успел доиграть до конца. В этом случае не будет "рывка".
2. Полезным еще будет свойство твина, которое ссылается на объект, для которого применяется анимация.
FunnyAnimation.onMotionFinished = function (){
this.obj._visible = false;
}
this.obj - FunnyBall
Полезно при анимации нескольких одинаковых элементов.
[User Picture]From: [info]asocial_type
2008-05-08 07:58 am (UTC)

Re: Урок хороший!!

(Link)

Пример использовани http://stopkran.at.tut.by/example.fla
[User Picture]From: [info]rohach
2008-05-08 01:12 pm (UTC)

Re: Урок хороший!!

(Link)

угу. сам юзаю это но это довольно логично) поэтому дал просто основу)
[User Picture]From: [info]luckra_
2008-05-08 01:15 pm (UTC)

Re: Урок хороший!!

(Link)

Дзяніс руліць (-:
[User Picture]From: [info]rohach
2008-05-08 01:20 pm (UTC)

Re: Урок хороший!!

(Link)

кусь)
[User Picture]From: [info]eloku
2008-05-08 08:00 am (UTC)

(Link)

Спасибо большущее, Денис! Классная статья!
А за видео-урок — отдельное спасибо :)
[User Picture]From: [info]simila
2008-05-08 08:33 am (UTC)

(Link)

статья супер! спасиба :)
[User Picture]From: [info]7ya
2008-05-08 08:41 am (UTC)

(Link)

Какая замечательная статья!!! Большое спасибо!!! :)
[User Picture]From: [info]hellga_kaktus
2008-05-08 09:30 am (UTC)

(Link)

Клево! Спасибо!
Хочу красный Ferrari возле дома и мировую славу))))
[User Picture]From: [info]ufoby
2008-05-08 10:09 am (UTC)

(Link)

крутой видео-урок!
[User Picture]From: [info]dprus
2008-05-08 10:15 am (UTC)

(Link)

а можно узнать в чем делался видеоурок? очень понравились эффекты наведения)
[User Picture]From: [info]dprus
2008-05-08 02:40 pm (UTC)

(Link)

нашел проблемку.

я делаю две сцены в первую кидаю лоадер. во вторую сам мувик.

если так делать то меню не работает. если лоадер убрать, то работает.

Почему?
[User Picture]From: [info]yoksel
2008-05-08 11:09 am (UTC)

(Link)

оооо.... просто чудесно
[User Picture]From: [info]yoksel
2008-05-08 11:15 am (UTC)

(Link)

распечатать и на стену
[User Picture]From: [info]kissteen
2008-05-08 11:23 am (UTC)

(Link)

А какими ещё библиотеками классов вы пользуетесь?
[User Picture]From: [info]rohach
2008-05-08 12:59 pm (UTC)

(Link)

с большего я совсем не фанат классов. но эти просто очень классные :)
[User Picture]From: [info]asocial_type
2008-05-08 04:03 pm (UTC)

Re: Урок хороший!!

(Link)

еще клевые Tweener есть))
[User Picture]From: [info]katig_
2008-05-08 11:35 am (UTC)

(Link)

спасибо огромное за статью!
и как раз для девушек всё написано. прям чувствую, как становлюсь сногсшибательной ;)
читать ещё несколько раз и уже лапки чешутся. в голове начала вырисовываться концепция наконец-то :)
[User Picture]From: [info]green_liquid
2008-05-08 11:48 am (UTC)

(Link)

хаха) спасибо огромное!
этот блогбастер просто-таки заслуживает оскара!)
[User Picture]From: [info]dprus
2008-05-08 04:15 pm (UTC)

(Link)

http://www.ljplus.ru/img4/d/p/dprus/motion.swf

класс эту статью надо было до сертификации довать. сразу стало все понятно и легко!
[User Picture]From: [info]hellga_kaktus
2008-05-08 07:37 pm (UTC)

(Link)

Сергей Кулинкович велел избегать растяжки текста по ширине блока :)
[User Picture]From: [info]dix_merveilles
2008-05-08 04:20 pm (UTC)

(Link)

Огромное спасибо за статью! ;)
[User Picture]From: [info]the_palm_tree
2008-05-08 05:28 pm (UTC)

(Link)

...посмотрел видео урок...
..чел жжет пости так же как наш гуру...^_^
[User Picture]From: [info]small_beetle
2008-05-08 06:32 pm (UTC)

(Link)

статью выкурили, видео урок посмотрели, ушла ваять сертификацию
вы крут, спасибо %)
[User Picture]From: [info]bicubic79
2008-05-08 07:10 pm (UTC)

(Link)

Туториал чтонадо :) Видео отдельно ))) Там на фоне музычка была - вроде как Richard Cheese )) Короче, Денису +1 за чувство юмора и ТАКУЮ подачу материала, Сергею ++1 за ТАКОЙ тренинг ))
[User Picture]From: [info]lesiay
2008-05-09 10:10 am (UTC)

:)))

(Link)

Почему же я боялась это смотреть , и посмотрела только когда пол работы сделала )))))
Балда))
[User Picture]From: [info]the_palm_tree
2008-05-09 02:19 pm (UTC)

(Link)

а как обратиться ко вложенному муви клипу?
у мну есть main внем вложен main_up надо сначала подвигать main_up а потом main. что писать в object?
[User Picture]From: [info]4annel
2008-05-10 10:16 am (UTC)

(Link)

Я под впечатлением. Обязательно приспособлю этот прием к своему сайту.
Спасибо, Денис!
[User Picture]From: [info]jamaica_rum5
2008-05-10 09:40 pm (UTC)

(Link)

Денис, отдельное спасибо, за позитивный видео-урок!!!
Слушать было, так же интересно, как и смотреть)))
[User Picture]From: [info]jamaica_rum5
2008-05-10 11:42 pm (UTC)

Вопрос: как сделать, чтоб анимация при повторном клике,

(Link)

У меня тут вопрос возник, может кто подскажет, буду признателен.
Допустим при нажатии на кнопу, происходит некая программная анимация, при повторном нажатии на кнопку, она повториться снова, как сделать так, чтоб при повторном нажатии, анимация не повторялась? С обычной анимацией все понятно, проверку поставить, на каком кадре мувик находится в данный момент, и все, а вот как тут быть... пока не дошло
[User Picture]From: [info]rohach
2008-05-11 12:12 pm (UTC)

Re: Вопрос: как сделать, чтоб анимация при повторном кли

(Link)

я обычно делаю так:
создаю переменную, которая отражает текущий раздел (примеру _root.currentPage). и при клике на кнопку просто проверяем если номер кнопки соответсвует _root.currentPage, то функцию не зовём.

ещё правильно делать глушилку всех кнопок, покка анимация не закончилась :)
[User Picture]From: [info]jamaica_rum5
2008-05-11 03:54 pm (UTC)

Re: Вопрос: как сделать, чтоб анимация при повторном кли

(Link)

спасибо :)
правда, не совсем понятно, хотелось бы подробнее
хотя думаю, гугл мне поможет)
[User Picture]From: [info]small_beetle
2008-06-12 02:57 pm (UTC)

пожалуйста подскажите

(Link)

проблема такая:
есть страничка с программной анимацией, как в уроке. например есть 10 кнопок меню - все работают, сменяются при нажатии, уезжают-приезжают. и есть 11-я кнопка, при нажатии на которую с помощью loadMovie подгружается swf-ка в контейнер. с той swf-ки стоит ссылка на главную swf (тоже при помощи loadMovie). только вот возвратившись на стартовую страничку, при нажатии на ссылки они листаются, но показывается содержимое только первого кадра, то есть при нажатии на любую из ссылок приезжает-уезжает все время содержимое только первого кадра, то есть одинаковое содержимое, а не то, которое на разных кадрах - разное
посоветуйте что-нибудь
From: [info]alexgarkuv
2008-10-14 06:29 pm (UTC)

(Link)

ммм
From: (Anonymous)
2008-11-24 01:16 pm (UTC)

спасибо огромное за статью!

(Link)

спасибо огромное за статью!