Ссылки на клипы

Обратиться к клипу непосредственно по имени можно лишь в том случае, если он располагается на той же временной диаграмме, что и соответствующий код. Иначе необходимо указывать его полный адрес. Важно понимать, что код, размещенный на кадре клипа, «видит» лишь только «родную» временную диаграмму. Напрямую обратиться из него к свойствам любого другого клипа невозможно. Так, в цепочку областей видимости кода вложенного клипа не входит клипхозяин. Даже основная временная диаграмма «не видна» для кода клипа. Во всех этих случаях нужно использовать ссылки. Правила их эффективного задания, описывающиеся в этом разделе, совсем несложны. Постарайтесь им следовать, и это сделает ваш код более мобильным и производительным.

Адресоваться экземпляры клипов могут абсолютными или относительными ссылками. Ссылка на клип называется абсолютной, если в ней отображаются все уровни вложенности, которые необходимо пройти, чтобы добраться до нужного объекта. Абсолютную ссылку всегда начинает идентификатор основной временной диаграммы фильма. Это может быть _root, если обращение к клипу производится из того же фильма, к которому он принадлежит сам. Если же нужно получить доступ к клипу фильма из другого фильма, необходимо использовать абсолютный адрес главной временной диаграммы, хранимый свойством _leveln.


Соответственно ссылки могут быть абсолютными в рамках одного фильма или же плейера в целом:

_root.mov.mov1 // Ссылка, абсолютная в рамках одного фильма
_level3.mov.mov1 // Ссылка, абсолютная для всех фильмов в плейере

Свойство _root присуще всем клипам, в том числе и самой основной временной диаграмме. Поэтому следующие ссылки вполне работоспособны:

trace(_root._root); // Выводит: _level0
trace(mov._root); // Выводит: _level0
trace(_root.mov._root.mov); // Выводит: _level0.mov

Относительные ссылки подразумевают, что клип адресуется относительно временной диаграммы, на которой располагается код. Самая простая относительная ссылка может быть образована одним лишь именем клипа. Она используется, если клип размещается на той же временной диаграмме, что и код. Если клип вложен в другой клип, который в свою очередь находится в области видимости кода, то относительная ссылка будет образована уже двумя звеньями:

_root.mov.mov1 // Абсолютная ссылка (избыточна, если код расположен
// на _root)
mov.mov1 // Относительная ссылка

Так как степень вложенности клипов не ограничена, то, в принципе, ссылки могут иметь сколь угодно много звеньев.


Однако на практике редко встречаются даже абсолютные ссылки, состоящие более чем из трех звеньев.

Какие ссылки использовать предпочтительнее? Конечно, относительные. При этом не только сокращается объем кода, а следовательно, и нес фильма, но и уменьшается количество операций, которые приходится проделывать интерпретатору, чтобы получить доступ к адресуемому клипу.

Кроме того, использование относительных ссылок делает код более мобильным, облегчает его переделку для повторного применения. Поэтому всегда, когда это возможно, нужно делать выбор в пользу относительных ссылок. А возможно это в том случае, если код располагается на временной диаграмме клипа, входящего в качестве звена в абсолютный путь к нужному клипу.

Вывод, сделанный в предыдущем абзаце, справедлив, если для задания ссылок используются только имена клипов, свойства _root и _leveln, Но в ActionScript имеется мощное средство, используя которое, можно задавать все ссылки в рамках одного фильма относительными. Это свойство _parent.

Свойство _parent указывает на клип, который содержит клип данный, т. е. оно позволяет сделать шаг вверх по лестнице вложенности. Например:

_root.createEmptyMovieClip("clipl", 0); // Создаем на основной временной
// диаграмме клип clip1
_root.clip1.createEmptyMovieClip("clip2", 0); // Вкладываем в клип
// clip2
trace(_root.clip1.clip2._parent); // Выводит: _leveI0.clip1 (один шаг вверх)
trace(_root.clipl.clip2,_parent._parent); // Выводит: _level0
// (два шага вверх)

Создавая код, который потенциально может быть использован повторно, нужно стремиться применять как можно меньше явных имен, стараясь заменить их «местоимениями».


Так, без использования имени временной диаграммы, на которой расположен код, как правило, можно обойтись.

Также хороший стиль программирования подразумевает, что вы не будете использовать имена клипов, расположенных в иерархии вложенности выше, чем клип, содержащий код. Это, в частности, означает, что применение свойства _root не является рекомендованным и от него лучше отказаться. Как же достичь выполнения всех описанных условий? Приведем несколько правил, которым полезно следовать:

• Все ссылки должны быть относительными. Используя свойство _parent, это условие можно с легкостью выполнить всегда (для адресации в рамках одного фильма).

• Если необходимо указать на клип, содержащий данный код, нужно использовать ключевое слово this. Чаще всего реально такой необходимости не существует, так как любой идентификатор, к которому происходит обращение в сценарии временной диаграммы, воспринимается как ее свойство (точнее, клип-носитель кода входит в используемую им цепочку областей видимости).

Применение this оправданно лишь для методов класса MovieClip, для которых имеются одноименные глобальные функции.

• Если нужно обратиться к временной диаграмме из функции расположенного на ней кода, использовать this можно не всегда.


Если функция активизируется как метод, то свойству this ее объекта активации будет соответствовать вызвавший ее объект, а не нужный клип. В таких случаях необходимо создавать специальную переменную (лучше — глобальную), значением которой будет указатель на клип-носитель кода. Например:

// Переменная main_clip должна использоваться, как имя клипа-носителя
// метода
_global.main_clip=this;

Можно сделать вывод, что использовать абсолютные ссылки нужно лишь, если происходит обращение к клипу другого фильма. Во всех остальных случаях ссылки должны быть относительными.

За их точку отсчета необходимо принимать клип, содержащий код. Чтобы подняться вверх по иерархии вложенности, следует использовать свойство _parent. Для ссылок на клип-носитель кода нужно применять свойство this или специальную переменную.

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

Свойство _lockroot
Одной из основных причин, по которым еще во Flash MX не рекомендовалось применять абсолютные ссылки, является огромная практическая важность и распространенность операции подгрузки одного фильма в другой.


Ведь если _root всегда указывает на основную временную диаграмму фильма, то после подгрузки swf-файла в клип свойство _root в его коде изменит значение.

Если раньше оно указывало на основную диаграмму самого загружаемого фильма, то после его импорта в клип будет ссылаться на главную временную шкалу фильма-хозяина. Это с большой долей вероятности будет означать, что код импортированного фильма перестанет работать корректно. Чтобы этого не произошло", в коде загружаемого фильма не должно быть абсолютных ссылок (ссылок, содержащих указатель _root). Все ссылки должны быть относительными.

Объективно говоря, обойтись без применения _root можно, но это зачастую чревато резким усложнением кода, снижением его читабельности. Во Flash MX 2004 появилась возможность использовать абсолютные ссылки в подгружаемых фильмах. Ее носителем является глобальное свойство _lockroot. Если оно равно false, то указатель _root в коде клипа (а также в скрипте вложенных в него клипов) будет, как и принято по умолчанию, ссылаться на основную временную диаграмму фильма. Если же ему присвоить значение true, то величиной _root будет ссылка на сам клип:

createEmptyMovieClip("clip", 0);
trace(clip._root); // Выводит: _level0
clip._lockroot = true; // Пытаемся "изолировать" клип
trace(clip._root); // Выводит: _level0.clip

Применяя свойство _lockroot, вы повышаете изолированность импортированного фильма. А это гарантирует, что внутри другого фильма он будет работать столь же корректно, как и будучи «свободным».

Определение пути к клипу
Возможность определения имени клипа мы уже разбирали. Но иногда нужно знать не только идентификатор экземпляра, но и где он расположен. Свойство _name в этом случае бесполезно.

Чтобы определить точный адрес клипа, нужно использовать глобальную функцию targetPath(), Ее синтаксис:

targetPath(clip),
где clip — ссылка на клип, путь к которому должен быть возвращен.

Результатом использования функции targetPath() является строка, содержащая абсолютный путь к клипу. Например:

var per:MovieClip=createErnptyMovieClip("clip", 0);
trace(targetPath(per)); // Выболит: _level0.clip

По сути функция targetPath() выполняет простое преобразование клипа в строку. В общем, данная операция достаточно формальна, однако проводится она весьма часто. Так, приведением к строковому типу сопровождается трассирование клипа или сопоставление его с другим клипом при помощи операторов сравнения. Провести преобразование клипа в строку можно и явно, использовав функцию String():

var per:MovieClip=createEmptyMovieClip("clip",0);
trace(targetPath(pert=String(per)); // Выводит: true

Bo Flash 4 звенья пути к клипу отделялись друг от друга не точками, а символами «/». Возвратить строку с адресом клипа в такой форме записи можно, обратившись к свойству _target:

// Создаем пустой клип в другом пустом клипе
var per=createEmptyMovieClip("clipl",0).createEmptyMovieClip("clip2",0);
trace(per._target); // Выводит: /clipl/clip2
trace(per); // Выводит: _level0.clipl.clip2

Практического значения свойство target не имеет. Скорее, оно интересно с исторической точки зрения.

Чтобы восстановить по строке, содержащей путь, работоспособную ссылку на клип, нужно воспользоваться функцией eval():

createEmptyMovieClip("clip1",0).createEmptyMovieClip("clip2",0);
trace(typeof eval("_level0.clip1.clip2")); // Выводит: movieclip

Оцените статью: (0 голосов)
0 5 0

Статьи из раздела Action Script на эту тему:
Виртуальные слои клипов
Задание формулы цвета
Имена экземпляров клипов
Импорт внешних фильмов и изображений
Клипы как носители кода

Вернуться в раздел: Action Script / 10. Клипы