Опубликован: 23.12.2005 | Уровень: специалист | Доступ: платный | ВУЗ: Московский физико-технический институт
Лекция 9:

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

Примеры правильного и неправильного использования

Приведем пример неправильного использования # initclip (такое вполне можно сделать по ошибке). Для каждого нового класса-клипа заводим уникальный номер # initclip . В результате очень быстро эти номера начинают идти через 10 (потому что никто не помнит, какой последний - 13-й или 14-й), затем через 100 - и через некоторое время появляются # initclip с номерами 100000.

Ничего особо плохого, кроме путаницы, в этом нет, но ничего хорошего - тоже.

Правильной же стратегией является следующая:

  • Нигде, если это не необходимо, номера # initclip не ставятся.
  • Если нужно указать, что один клип должен быть инициализирован первым (видимо, это означает, что он является базовым классом для второго клипа или каким-нибудь другим образом от него зависит), для первого нужно указать # initclip 0, для второго - # initclip 1 и т. п.
  • Для каждой новой иерархии классов нумерацию нужно начинать с 0.

Исправим наш пример:

Клип Rectangle (первый кадр слоя Actions ):

#initclip 0
function Rectangle() {
//....
}
Rectangle.prototype = new MovieClip();
Rectangle.prototype.getArea() {
   return this.width * this.height;
}
//...
#endinitclip

Клип RoundedRectangle (первый кадр слоя Actions ):

#initclip 1
function RoundedRectangle () {
//....
}
RoundedRectangle.prototype = new Rectangle();
RoundedRectangle.prototype.getArea() {
   //...
   return somethingMoreComplex;
}
//...
#endinitclip

Дерево владения и механизм attachMovie

Механизм attachMovie - это еще одно средство динамического создания объектов (наравне с duplicateMovieClip ) во Флэш, который появился в версии Флэш 5. Хотя, пожалуй, для всех программистов это наиболее понятный и естественный способ: создание объекта из класса, или экземпляра символа из символа библиотеки.

Создается объект следующим образом:

myMovieClip.attachMovie(idName, newName, depth [, initObject] );

Здесь myMovieClip - это клип, в который нужно поместить новый клип, idName -идентификатор, указанный в свойствах символа, экземпляр которого вы хотите создать (строка), newName - имя нового объекта, depth - уровень, на который нужно поместить экземпляр символа (см. ниже), а initObject - что-то вроде параметров конструктора, а точнее, уже созданный объект, полями которого нужно проинициализировать вновь создаваемый объект (см. ниже).

Пример:

_root.attachMovie ("MySymbol", "my_mc", 1);

Для того чтобы использовать attachMovie , нужно обязательно установить галочку Export For ActionScript в свойствах символа.

Заметим, что объекты, созданные с помощью attachMovie , помещаются в то же дерево владения, что и объекты, перенесенные на сцену непосредственно, а также объекты, созданные с помощью duplicateMovieClip.

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

Разница между attachMovie и дублированием клипов

Когда же следует использовать attachMovie , а когда - duplicateMovieClip?

Если формально, то разницы практически нет, за исключением того, что для использования duplicateMovieClip нужно иметь уже готовый объект, а для использования attachMovie - нет. Причем, если готовый объект был помещен на сцену непосредственным перетаскиванием, вы его не сможете удалить с помощью removeMovieClip, а это иногда может быть неудобно.

Кроме того, используя attachMovie , можно положить новый объект в любое место, в то время как duplicateMovieClip позволяет создать его только в том же клипе, в котором лежит исходный клип.

Инициализация объектов, initObject

А как же передать параметры конструктору, если мы создаем объект с помощью attachMovie (или duplicateMovieClip )? К сожалению, такого механизма не существует. Flash MX предлагает некоторую замену, а именно дополнительный параметр функций attachMovie и duplicateMovieClip - initObject , в качестве которого можно передать готовый объект, полями которого затем будет проинициализирован вновь создаваемый объект.

Правда, нам эта функциональность кажется несколько сомнительной, и мы предлагаем следующее.

Если вы хотите добиться функциональности конструктора, сделайте отдельную функцию init вашему классу и вызывайте ее после создания клипа.

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

Зарина Каримова
Зарина Каримова
Казахстан, Алматы, Гимназия им. Ахмета Байтурсынова №139, 2008
Akiyev Begench
Akiyev Begench
Беларусь, Полоцк, полоцкий государственный университет