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

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

Порядок инициализации клипов

Интересно, в каком порядке инициализируются клипы? Например, у нас есть несколько клипов: Сircle, Triangle и Rectangle, а также связанные с ними классы, код которых мы поместили в первые кадры клипов. О каких классах Флэшу раньше становится известно?

А какая нам разница? В данном случае, видимо, никакой.

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

Трудности с порядком инициализации

Пусть у нас есть клип RoundedRectangle, который мы хотим наследовать от Rectangle.

Например, пусть в клипе Rectangle (первый кадр слоя Actions ) имеем такой код:

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

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

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

Мы запускаем программу, и может оказаться, что с классом RoundedRectanlge какие-то проблемы, он как будто не отнаследовался от Rectangle. Почему?

Дело в том, что в тот момент, когда флэш-плеер наткнулся на строчку

RoundedRectangle.prototype = new Rectangle();

он еще не знал, что такое Rectangle, а следовательно, не смог создать его экземпляр.

В таких случаях порядком инициализации нужно управлять. Это делается с помощью инструкций # initclip специального вида.

Что означают числа в initclip

Как мы помним, Флэш гарантирует, что весь код, помещенный внутрь блоков # initclip , будет выполнен раньше кода, не помещенного в эти блоки.

А что, если мы используем имя класса внутри другого контекста # initclip ? Это и есть проблема из предыдущего параграфа. Мы использовали имя Rectangle в одном блоке # initclip , а RoundedRectangle - в другом, поэтому мы можем получить уже описанную выше проблему.

Все, что нам нужно, - это как-то сообщить Флэшу, что один блок # initclip нужно обрабатывать прежде, чем другой.

Для этого и существует вторая форма использования директивы # initclip :

# initclip N, где N - целое число.

Флэш гарантирует, что блок с меньшим числом будет обработан раньше.

алексеи федорович
алексеи федорович
Беларусь, рогачёв
Тамара Ионова
Тамара Ионова
Россия, Нижний Новгород, НГПУ, 2009