Классы и клипы
Мы с вами разобрались уже практически во всех нюансах 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 символ абсолютно недоступен.