Беларусь, рогачёв |
Клипы и ролики. Специальные возможности языка
Подгрузка других флэш-роликов в текущий
Есть еще один очень важный способ воздействовать на иерархию клипов в ролике, в дополнение к уже описанным. Вы можете взять и загрузить внутрь вашего ролика еще один! (Для этого он должен быть скомпилирован и вы должны знать путь к *.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 нам не надо знать заранее, на какой глубине вложенности в другие клипы находится тот клип, путь к которому мы передаем в эту функцию.