Интерблог

Анимация при наведении в ActionScript
Автор: Ognezmej. Опубликовано: 19 Апреля 2011

"А хотите, я его стукну, и он станет фиолэтовым в крапинку?" ("Тайна Третьей планеты")

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

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

Но ведь оно же всё правильно прописано! Смотришь код - нет, никаких ошибок. Вот здесь onRollOver, здесь onRollOut. Запускаешь трассировку - вот те раз - некоторые действия и вправду не выполняются.

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

На этом лирическое отступление заканчиваем. Итак, мы выяснили, что при быстром перемещении мыши (и клике, кстати, тоже, такое бывает), одним словом, при определённом количестве событий в секунду Flash перестаёт на них реагировать должным образом. Заметим, что количество глюков зависит от производительности компьютера - чем медленнее машина, тем легче испортить анимацию. Теперь упрощаем задачу. Итак, имеется некое множество элементов, при наведении и убирании мыши с которых должно происходить нечто. Прописываем это самое нечто в виде одной строчки, выполняющей некое простейшее действие, хотя бы ту же трассировку. Проверяем на быструю мышь - работает! Делаем вывод - компьютер не способен просчитать большое количество сложной анимации одновременно, однако простейшие действия выполняет. Теперь наше простейшее действие прописываем более утилитарно - изменением либо свойства элемента, либо просто какой-нибудь переменной. Ещё раз проверяем на быструю мышь. Эти самые свойства элемента и переменные - и есть тот хвост, за который мы поймали зверя, и теперь вытащим его на свет.

А вытаскиваем  мы нашего зверя при помощи onEnterFrame. Функция, которая гарантированно срабатывает с регулярностью, равной frame rate, который у нас меняется от 0.01 до 120. В зависимости от производительности компьютера его можно увеличить или уменьшить - не забывая, что у разных пользователей разные компьютеры. Я предпочитаю значение, равное 50.

Теперь всё просто. Внутри onEnterFrame анализируем наши переменные или свойства элементов, и выполняем необходимые действия.

Вопрос - почему onEnterFrame работает, а onRollOver и onRollOut - не работают? Ответ очевиден. В первом случае с регулярностью вызывается ОДНА функция, во втором - столько функций, сколько Вы за это время успели попасть мышкой по каждому элементу. Много сложной анимации одновременно покамест не по зубам даже очень мощному компьютеру - проверял на таком.

Удачи!

 

Метки: ActionScript, Кодинг, Советы

Популярные записи

Принцип неопределённости в РНР

Принцип неопределённости в MYSQL

Недолёт

А ещё AJAX нужен для...

Принцип неопределённости в PHP - праздник продолжается!

Эмуляция плавности в ActionScript.

Программная анимация в ActionScript

Анимация при наведении в ActionScript

Использование кодировки UTF-8

Буквицца

Архив записей  

2019

Янв  

2018

Янв  Фев  Мар  Апр  Май  Июн

Июл  Авг  Сен  Окт  Ноя  Дек

2017

Янв  Фев  Мар  Апр  Май  Июн

Июл  Авг  Сен  Окт  Ноя  Дек

2016

Янв  Фев  Мар  Апр  Май  Июн

Июл  Авг  Сен  Окт  Ноя  Дек

2015

Янв  Фев  Мар  Апр  Май  Июн

Июл  Авг  Сен  Окт  Ноя  Дек

2014

Янв  Фев  Мар  Апр  Май  Июн

Июл  Авг  Сен  Окт  Ноя  Дек

2013

Янв  Фев  Мар  Апр  Май  Июн

Июл  Авг  Сен  Окт  Ноя  Дек

2012

Янв  Фев  Мар  Апр  Май  Июн

Июл  Авг  Сен  Окт  Ноя  Дек

2011

Янв  Фев  Мар  Апр  Май  Июн

Июл  Авг  Сен  Окт  Ноя  Дек

2010

Янв  Фев  Мар  Апр  Май  Июн

Июл  Авг  Сен  Окт  Ноя  Дек

2009

Янв  Фев  Мар  Апр  Май  Июн

Июл  Авг  Сен  Окт  Ноя  Дек