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

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

Подгрузка других флэш-роликов в текущий

Есть еще один очень важный способ воздействовать на иерархию клипов в ролике, в дополнение к уже описанным. Вы можете взять и загрузить внутрь вашего ролика еще один! (Для этого он должен быть скомпилирован и вы должны знать путь к *.swf-файлу.) Делается это при помощи функции loadMovieNum, первым аргументом которой передается путь к подгружаемому ролику (путь считается относительно подгружающего ролика ), а вторым - номер так называемого уровня, на который подгружается ролик. Все изначальное содержимое нашего исходного ролика считается размещенным на нулевом уровне. Чем выше уровень - тем выше подгруженный ролик находится в z-порядке.

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

_level, _root и _global

Итак, мы выяснили, что внешний ролик может быть подгружен на определенный уровень и что от номеров уровней зависит, какой из роликов будет показываться поверх другого. Корневой клип нашего ролика (к полям и объектам которого мы обращаемся через ссылку _root ), как мы уже говорили, расположен на нулевом уровне. Однако тут возникает интересный вопрос. Ведь у ролика, который мы подгрузим, скажем, на уровень 1, тоже есть какой-то код в кадрах. И вполне вероятно, что этот код обращается к каким-то своим корневым переменным - естественно, через ссылку _root , ведь при разработке подгружаемого ролика не обязательно заранее знали, что его будут подгружать в другой... Не будет ли конфликтов? Оказывается, если все было так, как мы описали, конфликтов как раз не будет. Дело заключается в свойствах ссылки _root . Эта ссылка указывает не на какой-то "корневой клип вообще" - такого и не существует - а именно на корневой клип данного ролика.

Хорошо, а можно ли из одного клипа обратиться к переменным и объектам другого? Да, к этому нет ни малейших препятствий. Для этого существуют ссылки _level 0, _level 1, _level 2 и т.д. - каждая относится к корневому клипу ролика, подгруженного на соответствующий уровень. Очевидно, что в обычном случае (до тех пор, пока мы не начинаем подгружать одни флэш-ролики в другие) _level 0 - это то же самое, что и _root . Но использовать _level 0 вместо _root нежелательно именно потому, что ваш ролик потом могут захотеть подгрузить другие. Используйте ссылки _level только для работы с подгруженными роликами.

Далее возникает еще один вопрос. Предположим, два подгружаемых ролика желают обменяться данными (или вызывать какие-то функции, определенные в другом ролике ), но при этом не знают заранее, на какой уровень кого подгрузят. Как быть в этом случае? Необходимы данные глобального доступа. И, действительно, существует объект _global , в котором лежит множество глобальных функций и в котором можно завести свои функции (и просто переменные ). Этот объект одинаков для всех подгруженных роликов, выполняющихся в одном флэш-плеере. Но именно в силу глобальности этого объекта нужно пользоваться им аккуратно и по возможности добавлять к именам своих методов и переменных уникальные префиксы или суффиксы - в общем, предпринимать все усилия для того, чтобы сделать имена уникальными, иначе неизбежны конфликты.

Наряду с предопределенными ссылками _root , _global и набором ссылок, начинающихся со слова _level , есть еще одна важная предопределенная ссылка. Это ссылка _parent. Мы описываем ее здесь, чтобы подчеркнуть ее родство с остальными предопределенными ссылками (а не со свойствами клипа, например). _parent всегда указывает на клип, который является владельцем текущего клипа (а текущим считается тот клип, в кадре которого содержится выполняемый в данный момент код).

Свойства клипа, путь к нему и setProperty

Мы уже рассказали о том, как управлять порядком кадров внутри клипа. Теперь пора поговорить о том, как программно управлять разными свойствами клипа как целого, которые мы можем настроить и из редактора, но потом, возможно, захотим поменять алгоритмическими средствами. Примеры таких свойств - месторасположение клипа, угол разворота, растяжение или сжатие по взаимно перпендикулярным осям, прозрачность. Синтаксис для работы со свойствами такой же простой, как и для работы с обычными переменными, например: clip._x = 10. Но, в отличие от обычной переменной, присваивание нового значения свойству вызывает соответствующее действие (например, результатом выполнения присваивания clip._x = 10 будет передвижение клипа clip в такое положение, чтобы его начало координат имело в координатах родительского клипа абсциссу, равную 10). Далее мы приведем несколько наиболее употребительных свойств клипов с комментариями.

  • _alpha - прозрачность, а точнее - непрозрачность. В процентах. Значение 100 соответствует нормальному виду клипа, значение 0 - полностью прозрачному.
  • _height - размер клипа по вертикали в пикселях.
  • _name - строковое имя экземпляра клипа.
  • _rotation - угол поворота клипа относительно начального положения (откладывается против часовой стрелки, измеряется в градусах).
  • _target (только для чтения) - строка, описывающая расположение данного клипа в иерархии. Вместо точек (как обычно) уровни иерархии разделяются прямой косой чертой (прямой слэш). Если путь к клипу начинается с _level 0, само слово _level 0 опускается и путь начинается прямо с косой черты (например, вместо _level 0/clip пишется просто /clip ). Если же путь к клипу начинается с _level 1, _level 2 или любого другого уровня, кроме нулевого, то уровень указывается явно. Напомним, что ненулевой уровень означает ролик, подгруженный из отдельного *.swf-файла. Заметьте, что при указании полного пути к клипу слово _root является бесполезным, так как оно действует только внутри одного конкретного ролика и не описывает ролики, подгруженные друг в друга. А вот слово _level в данном случае гораздо более информативно (и потому применяется именно оно).
  • _url (только для чтения) - это URL того *.swf-файла, в котором размещен данный клип. Полезность этого свойства станет более понятной, если мы снова обратим внимание на тот факт, что существует возможность подгружать в некоторый ролик другие ролики (в виде готовых *.swf-файлов). Подгружен дополнительный ролик может быть совсем не из того места, откуда запущен исходный (более того, адрес, откуда подгружать ролик, может быть сформирован динамически, то есть в процессе выполнения).
  • _visible - булевское свойство, которое означает, показывается клип или полностью скрыт. От случая _alpha == 0 случай _visible == false отличается тем, что в последнем случае клип не получает сообщения о том, что на нем произошло нажатие мыши (и аналогичные, для которых важно, находится мышь над клипом, или нет). Код, записанный в кадрах символа, выполняется для любого экземпляра, независимо от значения свойства _visible.
  • _width - размер клипа по горизонтали в пикселях.
  • _x - абсцисса положения начала координат данного клипа, выраженного в координатах родителя.
  • _xmouse (только для чтения)
  • _xscale - отношение текущего размера по горизонтали к исходному (выраженное в процентах). Свойства _xscale и _width связаны между собой: при изменении одного изменяется и другое.
  • _y - ордината положения начала координат данного клипа, выраженного в координатах родителя.
  • _ymouse (только для чтения)
  • _yscale - отношение текущего размера по вертикали к исходному (выраженное в процентах). Свойства _yscale и _height связаны между собой: при изменении одного изменяется и другое.

Все свойства, которые не помечены здесь как "только для чтения", можно изменять. Даже свойство _name, через которое доступно имя экземпляра клипа! В самом деле, давайте создадим Флэш-ролик, на сцену которого положим произвольный клип (и назовем этот экземпляр clip ). Затем в первом кадре _root напишем следующий код:

a = clip;
trace("clip._name = " + clip._name);
trace("newName._name = " + newName._name);

clip._name = "newName";
trace("--------");
trace("a._name = " + a._name);
trace("clip._name = " + clip._name);
trace("newName._name = " + newName._name);

После запуска ролика ( Ctrl+Enter ) получим в консоли следующее:

clip._name = clip
newName._name =
--------
a._name = newName
clip._name =
newName._name = newName

Имя клипа действительно изменилось! И по новому имени мы можем к нему обратиться, а по старому - нет! Показательно то, что ссылка, сделанная нами на клип до смены имени, осталась рабочей.

А теперь зададимся вопросом, можно ли обращаться к свойствам в том случае, когда мы узнаем имя объекта или свойства только во время выполнения программного кода? То есть когда имена объекта и/или свойства записаны у нас в некоторой переменной (или просто являются результатом вычисления некоего выражения)? Оказывается, можно, и для этого существует функция setProperty. Она принимает следующие параметры: строку с именем клипа, название свойства (без кавычек!), значение, устанавливаемое свойству. Например:

setProperty ("clip", _visible, false);

Можно ли сделать то же самое при помощи недокументированных но удобных квадратных скобок? Да. Пишется это так:

clip["_visible"] = false;

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

_root["clip"]["_visible"] = false;

Зато setProperty удобнее тем, что в первый аргумент можно передать путь в виде, скажем " clip1.innerClip.innerInnerClip " (или в формате со слэшами " clip1/innerClip/innerInnerClip "). То есть для вызова setProperty нам не надо знать заранее, на какой глубине вложенности в другие клипы находится тот клип, путь к которому мы передаем в эту функцию.