Отличия клипов от объектов

Клипы появились задолго до ActionScript. И когда в 2000 г. разработчики из Macromedia решили создать полноценный язык сценариев, основываясь на ECMAScript, им пришлось буквально «притянуть за уши» традиционные для JavaScript концепции к реалиям Flash. Web-скрипты не работают ни с чем даже отдаленно похожим на клипы. Из-за этого некоторые понятия ECMAScript оказались неприменимыми к клипам, некоторые настолько запутались в ActionScript, что понять их истинный смысл, не зная стандарта, просто невозможно. Например, если клипы считаются такими же объектами, как и остальные, они должны создаваться при помощи оператора new и конструктора класса:

var clip:MovieClip=new MovieClip(); // Если бы все было так просто...

Приведенная строчка действительно даст объект типа object класса MovieClip:

trace(typeof clip); // Выводит: object
trace(clip instanceof MovieClip); // Выводит: true

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


Частью клипа может быть даже исполнимый код. Как будет показано в этой главе, клипы по своей сути являются маленькими swf-фильмами. Ввиду описанных нюансов клипы относятся к особому, не предусмотренному ЕСМА-262 типу данных movieclip.

Клипы и объекты — чрезвычайно «разновесны». Например, пытаться удалить клип, используя оператор delete — это то же самое, что натравить Моську на слона. Принципиально отличается результат присваивания переменной объекта и клипа. В случае объекта значением переменной является указатель на область памяти, которую он занимает. Если же переменной присваивается клип, ей ставится в соответствие его идентификатор. Это, в частности, означает, что если клип удалить, а вместо него создать новый с таким же именем, то переменная будет указывать уже на него.

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

Можно сделать следующий вывод: клипы — это особые, привилегированные структуры, а объекты — лишь облегчающие работу с ними инструменты. Но, несмотря на имеющиеся существенные отличия, в контексте написания сценариев ActionScript объекты и клипы ведут себя достаточно схоже.


Так, клипам могут быть присвоены свойства и методы. Ссылки на них могут хранить переменные и элементы массивов. У клипов имеются свойства __proto__ и constructor, что означает, что принципы наследования для них совпадают с используемыми в случае объектов.

Особенно выделяет клипы среди других структур ActionScript то, что код помещается на их кадры.

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

1. Обычные свойства клипов как объектов класса MovieClip. Создаются при помощи оператора «.» или «[]» либо наследуются из цепочки прототипов.

2. Свойства, создаваемые интерпретатором на основании определений переменных и функций кода, расположенного на кадрах клипа. В этом случае клип можно рассматривать как объект переменных.

3.


В свойствах клипа сохраняются все объекты, входящие в его внутреннюю структуру. Имена таких свойств совпадают с именами соответствующих объектов.

Чтобы убедиться в справедливости всего вышесказанного, создайте на кадре основной временной шкалы кнопку с именем but и клип с именем mov. На тот же кадр «повесьте» следующий код:

this.prop = "Привет"; // Создаем свойство временной шкалы
var per:String = "Пока"; // Залаем переменную
function func():Void {} // Объявляем функцию

Проверим, какие свойства появились у основной временной диаграммы с учетом добавленных элементов. Для этого используем цикл for-in:

for (var i in this) {
trace(i); // Выводит: per prop func $version but mov

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

• Чтобы получить доступ к клипу (кнопке, текстовому полю, звуку), вложенному в клип, к нему нужно обратиться, как к свойству: его имя должно быть задано в качестве правого операнда оператора «.» или быть прописано в виде строки в операторе «[]».


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

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

• Если нужно обратиться к элементу внутренней структуры вложенного клипа, оператор доступа к свойству должен быть просто использован дважды (или нужное число раз):

trace(_root.mov.mov_intro); // Выводит: level0.mov.mov_intro
trace(_root["mov"]["mov_intro"]); // Выводит: level0.mov.mov_intro

• Если из кода, расположенного на временной диаграмме клипа, нужно обратиться к вложенному в клип объекту, то совсем необязательно использовать его полный «адрес». Достаточно набрать имя объекта. Так как именованные элементы внутренней структуры клипа являются его свойствами, а сам клип входит в цепочку областей видимости размещенного на нем кода, то объект будет найден и по одному своему имени.

trace(_root.mov); // Выводит: _level0.mov (эта запись избыточна,
// если код расположен на _root)
trace(mov); // Выводит: _level0.mov

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


Если это произойдет, то доступ к одному из элементов станет невозможен (так как двух свойств с одним именем быть не может). Для примера создадим клип с именем mov и одноименную ему переменную, хранящую строку «Привет». Посмотрим, какой из этих элементов окажется в приоритете:

trace(mov); // Выводит: Привет (переменная в приоритете)

• Если необходимо проверить или изменить какую-то характеристику всех клипов (кнопок, текстовых полей, звуков), расположенных на временной шкале, можно использовать цикл for—in.

Правда, так как данный цикл перечисляет все свойства объекта, перед проведением нужных действий требуется обязательно проверять тип объекта данных, который хранит очередное свойство:

// Код, удаляющий все клипы с основной временной диаграммы
for (var i in _root) { // Перечисляем все свойства
// Проверяем, указывает ли текущее свойство на клип
if (typeof _root[i] = "movieclip") {
// Помещаем клип на глубину, допускающую удаление
_root[i].swapDepths(100000);
_root[i].removeMovieClip(); // Удаляем клип
}
}

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

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

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

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