Казахстан, Алматы, Гимназия им. Ахмета Байтурсынова №139, 2008 |
Классы и клипы
Порядок инициализации клипов
Интересно, в каком порядке инициализируются клипы? Например, у нас есть несколько клипов: С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 - целое число.
Флэш гарантирует, что блок с меньшим числом будет обработан раньше.