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

Классы и клипы

Аннотация: Регистрация классов: цели, реализация, правильное размещение кода. Порядок инициализации клипов; рекомендации по пользованию секцией #initclip. Дерево владения и механизм attachMovie. Уровни объектов, swapDepth, распределители уровней. Слежение за переменными. Таймер, не связанный с линейкой времени: функция setInterval.

Мы с вами разобрались уже практически во всех нюансах ActionScript. Однако не нужно забывать, что Flash MX - это все-таки в первую очередь дизайнерская среда. А потому необходимо, чтобы наши классы (унаследованные, скажем, от MovieClip ) обладали всеми преимуществами, которыми обладают обычные клипы. То есть мы должны уметь поместить на сцену экземпляр нового клипа, и при этом Флэш должен сообразить, что этому клипу нужно вызвать новый конструктор и что мы можем пользоваться всеми новыми функциями. Для этого существует механизм, называемый регистрацией классов.

Регистрация классов

Для того чтобы зарегистрировать класс, то есть, фактически, ассоциировать наш класс с каким-то клипом, достаточно выполнить одну строчку кода специального вида. После этого Флэш будет знать, что клип, с которым мы ассоциировали наш класс, является не просто объектом MovieClip, а экземпляром нашего класса (в большинстве случаев унаследованного от MovieClip ) и вести будет себя с ним соответствующим образом: при создании (как с помощью простого помещения на сцену, так и с помощью использования attachMovie ) клипа вызывается конструктор нашего класса; клипы, вложенные в наш клип, становятся доступны как поля класса и т. п.

Код для регистрации

Итак, какой же код регистрирует класс?

За это отвечает единственный "статический" метод класса Object:

Object.registerClass (<LinkageIdentifier>, <ConstructorFunction>);

Здесь <LinkageIdentifier> - это имя идентификатора (строка), заданное в поле Identifier параметров символа клипа, а <ConstructorFunction> - функция-конструктор нашего класса.

Пример:

function MyClass {
//...
}
//....
Object.registerClass ("MyClassSymbol", MyClass);

Где размещаем определение класса

Допустим, мы сделали класс Circle с двумя методами:

function Circle() {
}
Circle.prototype = new MovieClip();
Circle.prototype.show = function () {
   this._visible = true;
}
Circle.prototype.hide = function () {
   this._visible = false;
}

И связали его с клипом CircleClip, который является простым кружком:

Object.registerClass ("CirlceClip", Circle);

Спрашивается: где поместить весь этот код?

Классическое решение для Flash MX - поместить его в первом слое Actions клипа CircleClip в первом кадре.

С одной стороны, это неплохо: в любом случае, определение класса "не потеряется", оно привязано к клипу, с которым связан класс. Но редактировать код таких классов не очень удобно. Более удачным решением будет вынесение собственно кода в отдельный файл, который подключается в указанном выше месте с помощью строки #include <filename>.as. Такой способ ближе к подходу, используемому во Flash MX 2004.

Но это еще не все. В любом случае, определение класса нужно помещать внутри блока #initlclip.

Используем initclip

# initclip означает начало блока инициализации (который заканчивается #endinitclip ). Что такое блок инициализации? Флэш гарантирует, что весь код, помещенный внутрь блоков # initclip , будет выполнен раньше кода, не помещенного в блоки # initclip . Это очень удобно; например, если мы помещаем все определения классов внутрь блоков # initclip (так всегда и следует поступать), то мы всегда можем быть спокойны, что при любом использовании имени класса вне контекста # initclip оно уже известно флэш-плееру.

Поэтому вот как должен выглядеть первый кадр слоя Actions клипа CircleClip (или include -файл, который мы подключаем в этом же месте):

#initclip
function Circle() {
}
Circle.prototype = new MovieClip();
Circle.prototype.show = function () {
   this._visible = true;
}
Circle.prototype.hide = function () {
   this._visible = false;
}
Object.registerClass ("CirlceClip", Circle);
#endinitclip

Включаем необходимые опции

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

В чем же дело? Вспомним, что для того, чтобы к символам библиотеки можно было обращаться программно (из кода ActionScript), нужно включить флажок "Export for ActionScript" в параметрах клипа. Только после этого Identifier, заданный там же, начинает что-то значить для компилятора Флэш МХ, иначе в ActionScript символ абсолютно недоступен.