Московский физико-технический институт
Опубликован: 23.12.2005 | Доступ: свободный | Студентов: 2867 / 252 | Оценка: 4.61 / 4.44 | Длительность: 27:18:00
ISBN: 978-5-9556-0051-2
Лекция 3:

Клипы и ролики. Специальные возможности языка

Управление порядком кадров: Actions или методы класса MovieClip? Работа со сценами

Давайте внимательно посмотрим на список функций для управления порядком выполнения кадров. Если вы попытаетесь разыскать эти функции в справке ( Reference ), вы обнаружите, что большинство из них присутствует в двух местах. Во-первых, в разделе Actions. И, во-вторых, в качестве методов - в классе MovieClip . Дело здесь в том, что в ранних версиях Flash не было классов и методов, а были только системные команды, которые назывались Actions. Разумеется, для управления порядком следования кадров в клипе также служили соответствующие Actions. Во Flash MX тоже имеются Actions, более того, этим термином в справочнике называются также фундаментальные инструкции языка, наподобие приемов для работы с циклами. Мы не будем пользоваться такой терминологией; поскольку сейчас нас интересуют те Actions, которые предназначены для управления порядком кадров в клипе, и именно их мы будем под словом Actions подразумевать в этом параграфе. Также мы будем называть их командами. Начиная с пятой версии Flash, синтаксис этих команд совпадает с синтаксисом вызова функций. Правда, во Флэше вызов функций (как и обращение к полям объектов) практически всегда должен делаться с явным указанием объекта, метод которого вызывается. То есть вызов, как правило, делается через точку. Но одним из важных исключений является случай, когда мы вызываем метод того клипа, в котором написан код. Так вот, поскольку клип является объектом класса MovieClip (или объектом наследника MovieClip ), то у него непременно есть методы, отвечающие за управление порядком кадров (те, что перечислены выше). Более того, названия их в точности совпадают с именами соответствующих Actions. Поэтому, когда мы пишем play(), не указывая объекта, метод которого мы вызываем, может создаться впечатление, что мы просто вызвали метод play() у клипа, в котором выполняется код. Или это все-таки вызван Action play() для данного клипа? Есть ли способ это узнать, и существует ли какая-либо разница между этими двумя случаями? Оказывается, разница минимальна, но заметить ее все-таки можно. И состоит она в том, что только с помощью Actions может быть совершен переход между различными сценами ролика.

Давайте разберемся для начала, что же такое сцены. Во Флэш МХ они являются, скорее, рудиментом прежних версий; тем не менее, их использование иногда удобно (скажем, для создания предзагрузчиков; см. главу 14). Итак, сценой называется последовательность сгруппированных вместе кадров корневого клипа . Можно выразиться и по-другому: использование сцен - это способ сгруппировать вместе ряд кадров корневого клипа. Слова про корневой клип здесь существенны: сцены могут создаваться только в нем. В каждой сцене может быть произвольное количество кадров ; но, как только все кадры, которые вы в сцене создали, закончатся, начинает проигрываться следующая сцена. Важно, что графику и экземпляры клипов вы создаете в каждой конкретной сцене отдельно - при переходе к следующей сцене ни один дочерний клип и ни один графический примитив не сохраняется, все нужно создавать заново. В общем-то, для этого сцены и предназначены: они облегчают переход к новому этапу анимации, где нужно начать все "с чистого листа". Удобство сцен состоит в том, что редактируются они совершенно независимо и не влияют друг на друга; чтобы эмулировать подобное поведение (старт "с чистого листа") внутри одной сцены вам понадобилось бы отступить от кадров, относящихся к одной из псевдосцен, какое-то количество пустых кадров и затем начать рисовать следующую псевдосцену. Это гораздо менее удобно: нужно было бы вручную искать, где начинается псевдосцена, после исчерпания пустых кадров вторую псевдосцену отодвигать от первой, вручную делать перескок от конца первой псевдосцены к началу второй и т.д. В лекции 14 показан пример, где сцены особенно полезны, поскольку предварительную и основную сцены пишут разные люди. Вообще-то, в современных анимационных роликах на Флэш МХ сцены используются нечасто. Но знать, что они есть, полезно хотя бы для того, чтобы понимать, что означает надпись Scene 1 в строке под линейкой времени, где отражена иерархия редактируемых клипов.

Как создать новую сцену? Для этого существует панель Scene ; вызовите ее и нажмите на плюсик в нижней ее части. Переключаться между сценами можно с помощью этой же панели. Можно также воспользоваться списком сцен, выпадающим при нажатии на "кинематографическую хлопушку", расположенную под линейкой времени с правой стороны (в правой части строки, где выведена иерархия редактируемых клипов ).

Так каким же образом при помощи работы со сценами мы сможем отличить воздействие Actions и методов MovieClip на порядок кадров? Оказывается, очень просто. Actions могут работать со сценами (точнее, это могут делать четыре из них: gotoAndPlay, gotoAndStop, prevScene и nextScene ), а методы MovieClip - нет. Написав в корневом клипе nextScene без дополнительного указания объекта, для которого производится вызов, мы обнаружим, что переход между сценами работает. И отсюда сделаем вывод, что вызвался именно Action, а не несуществующий метод _root.nextScene. В остальном же разницы нет никакой. Заметим также, что, поскольку сцены бывают только внутри корневого клипа, то при вызове nextScene или аналогичной инструкции не из клипа _root ничего не произойдет. И, таким образом, выяснить, что же происходит внутри любого не корневого клипа - вызывается ли Action или метод клипа - напрямую мы не можем. Но есть косвенный метод: оказывается, можно переопределить, например, метод play класса MovieClip и заставить его выдавать сообщение всякий раз, когда его вызывают. И тогда станет видно, что когда исполняется команда play без указания объекта, к которому она относится, выполняется именно Action, а вовсе не метод клипа. Еще раз подчеркнем, что мы имеем дело с исключением. Если бы не было Actions с именами, совпадающими с именами методов, в данном случае вызывались бы именно методы клипа.

Окончательный вывод таков: если вы пишете, скажем, stop, не указывая объекта, к которому он относится, будет вызван Action stop для текущего клипа (а не его метод stop ). Но разницу вы не почувствуете, если не предпримете специальных ухищрений. Единственное отличие Actions - их набор несколько богаче, чем набор соответствующих методов MovieClip , поскольку включает в себя способы работы со сценами.

Однако не стоит думать, что методы управления порядком кадров класса MovieClip ущербны в том смысле, что вы не сможете с их помощью переключить сцену. Оказывается, как для этих методов, так и для Actions типа gotoAndPlay (в случае, когда имя желаемой сцены не указано), нумерация кадров в сценах является сквозной. Чтобы пояснить это, предположим, что у нас имеются две сцены Scene 1 и Scene 2 по 10 кадров в каждой. Тогда команда gotoAndPlay(15) переведет клип на 5 кадр второй сцены (так же как и gotoAndPlay("Scene 2", 5) ). И в этом случае уже все равно, писать ли просто gotoAndPlay(15), или же _root.gotoAndPlay(15).

Напоследок дадим один совет. Даже если вы пишете на Флэш преимущественно программный код, вам придется, скорее всего, работать с анимациями, сделанными кем-то еще. А при создании анимаций неизбежно использование многих из вышеприведенных методов. Так вот, хотим предупредить: по возможности, пореже передавайте в методы gotoAndStop или gotoAndPlay номер кадра. И проследите, чтобы этого не делал никто в вашем проекте. Вместо использования номеров оперируйте метками кадров. (Чтобы присвоить метку ключевому кадру, выделите его в линейке времени, и в левой верхней части панели Properties введите идентификатор в текстовое поле с названием Frame подсказкой <Frame Label> ). Дело в том, что вам может понадобиться сдвинуть кадры вперед или назад по линейке времени. Метка в этом случае сдвинется вместе с кадрами, а вот номера кадров, естественно, поменяются. Поэтому способ с метками гораздо устойчивее к исправлениям.