Февраль 2011

Руководство по actionscript. часть 6, стр. 085

В противном случае автоматически устанавливаемым связанным классом будет автоматически генерируемый подкласс класса MovieClip.

После завершения операции связывания символа с классом создаваемые вручную экземпляры этого символа будут перенимать программные поведения, определяемые связанным классом. С другой стороны, экземпляры, создаваемые программным путем, будут перенимать аудиовизуальное содержимое связанного символа. Таким образом, символ и класс являются одним целым: символ определяет графическое содержимое, а класс — программное поведение.

В качестве примера свяжем наш символ Movie Clip (Клип) звезды из предыдущего раздела с подклассом Star класса MovieClip. Класс Star будет случайным образом изменять прозрачность (значение канала Alpha) каждого экземпляра звезды через каждые 100 мс.

package { import flash. display. MovieClip; import flash. utils. Timer; import flash. events. TimerEvent;

public class Star extends MovieClip { private var timer;Timer;

public function Star ( ) { timer = new TimerdOO, 0);

timer. addEventListener(TimerEvent. TIMER. timerListener); timer. start( );

}

private function timerListener (e:TimerEvent):void { randomFade( );

}

private function randomFade ( );void { // Присваиваем переменной alpha случайное значение с плавающей запятой // в диапазоне от 0 до (но не включая) 1. Переменная экземпляра alpha // наследуется от класса DisplayObject (являющегося предком класса // MovieClip). alpha = Math. random( );

}

// Предоставляет способ остановить таймер. Как рассматривалось // в разд. «Деактивация объектов» гл. 14, внешний код должен // использовать этот метод перед удалением экземпляра звезды // из программы.

Руководство по actionscript. часть 6, стр. 086

Public function dispose ( );void { timer. stop( );

Чтобы связать класс Star с символом Movie Clip (Клип) звезды, выполните следующие действия.

1. Сохраните файл, содержащий символ звезды, под именем sky. fla.

2. Сохраните класс Star в той же папке, где находится файл sky. fla, в текстовом файле под именем Star. as.

3. Выберите символ звезды в библиотеке файла sky. fla.

4. Откройте меню Options (Свойства) палитры Library (Библиотека), щелкнув кнопкой мыши на значке в правом верхнем углу палитры, и выберите команду Linkage (Связывание).

5. В области Linkage (Связывание) окна Linkage Properties (Свойства связывания) установите флажок Export for ActionScript (Экспорт для ActionScript).

6. В поле Class (Класс) окна Linkage Properties (Свойства связывания) введите значение Star.

7. Нажмите кнопку ОК.

На рис. 29.8 показано окно Linkage Properties (Свойства связывания) в том виде, в котором оно находится после выполнения шага 6 предыдущей процедуры.

Руководство по actionscript. часть 6, стр. 087

Рис. 29.8. Связывание символа Star с классом Star

Чтобы создать экземпляры символа звезды в среде разработки Flash, мы перетаскиваем название символа из библиотеки на сцену основной временной шкалы (или на сцену любого другого символа, но в данном случае у нас нет других символов в документе). Эта процедура проиллюстрирована на рис. 29.9, где изображены пять экземпляров символа звезды, перетаскиваемых на сцену первого кадра основной временной шкалы файла sky. fla.

Поместив экземпляры символа звезды на основную временную шкалу, мы можем экспортировать файл s ky. swf из файла sky. fla и понаблюдать за эффектом мерцания (определяемым символом звезды) и эффектом затухания (определяемым классом Star).

Рис. 29.9. Создание экземпляров символа звезды

Теперь, когда мы знаем, как вручную создавать экземпляры символов Movie Clip (Клип), рассмотрим, как обращаться к этим экземплярам и управлять ими.

Обращение к созданным вручную экземплярам символов

На этапе выполнения каждый экземпляр символа, который помещен на любую временную шкалу в FLA-файле, автоматически становится отображаемым ребенком объекта языка ActionScript, представляющего данную временную шкалу.

Например, в предыдущем разделе мы добавили пять экземпляров символа звезды на основную временную шкалу файла sky. fla. В результате на этапе выполнения эти пять экземпляров становятся отображаемыми объектами-детьми экземпляра класса документа файла sky. Да. Чтобы доказать это, создадим класс документа для файла sky. Да и воспользуемся методом getChildAt ( ) для получения списка всех детей основной временной шкалы.

package { import flash. display. MovieClip;

public class Sky extends MovieClip { public function Sky ( ) { for (var i:int=0; i < numchildren; i++) { tracec"found child: " + getchi1dat(i));

}

}

}

}

В случае с предыдущим классом документа, когда приложение sky. swf будет экспортировано и воспроизведено в режиме Test Movie (Проверка фильма) среды разработки Flash, в окне Output (Вывод) появятся следующие строки:

Found child: [object Star]

Found child: [object Star]

Found child: [object Star]

Found child: [object Star]

Found child: [object Star]

I Код в методе-конструкторе класса документа SWF-файла может обращаться к любым м?; 4 щ дочерним элементам, размещенным вручную в первом кадре SWF-файла, но не во втором ___3л* или последующих кадрах (поскольку элементы, размещенные в последующих кадрах, не добавляются в список отображаемых детей до тех пор, пока головка воспроизведения не достигнет этих кадров).

Руководство по actionscript. часть 6, стр. 088

С точки зрения языка ActionScript пять экземпляров символа звезды на основной временной шкале являются экземплярами класса Star, который наследуется от класса MovieClip, поэтому мы можем управлять звездами с помощью переменных и методов класса DisplayOb j ect (или любого другого предка класса MovieClip). Например, следующий код использует переменную экземпляра х класса DisplayObject для выравнивания звезд по вертикальной линии, проходящей через координату 100 по оси X:

for (var i:int=0; i < numchildren; i++) { getchi1dat(i).x = 100;

}

Тем не менее метод getChildAt ( ), применяемый в предыдущем коде, имеет одно ограничение. Поскольку в среде разработки Flash глубины отдельных экземпляров символов не совсем очевидны, использование метода getChildAt ( ) для выборочного управления конкретным экземпляром символа оказывается весьма затруднительным. Чтобы без труда идентифицировать конкретный экземпляр и управлять им из кода, мы присваиваем ему имя экземпляра.

Имена экземпляров

Имя экземпляра — это простое строковое имя, присваиваемое экземпляру символа. Чтобы присвоить имя созданному вручную экземпляру символа, мы используем палитру Properties (Свойства). Например, чтобы присвоить имена экземплярам

символа звезды из предыдущего раздела, выполните такую последовательность действий.

1. Откройте палитру Properties (Свойства) (команда меню Window > Properties (Окно > Свойства)).

2. Выберите экземпляр звезды на сцене.

3. Вместо значения (Имя экземпляра) введите значение star 1.

Руководство по actionscript. часть 6, стр. 089

4. Повторите шаги 2-3, чтобы присвоить имена оставшимся экземплярам звезды, начиная со значения star2 и заканчивая значением star5.

При выполнении шага 3 предыдущей процедуры палитра Properties (Свойства) будет выглядеть так, как показано на рис. 29.10 (в нижней его части).

11У1НШ-111М-Г

Rle?&t View Insert Modify Text Commands Control Qebug Window Help

щ

P i\

T

\

sky. fla |St».as

«* La? er 1

51 s> i

10 15

del

f? Scene 1

Worksq One item in fibrarY

Л Properties x |

Movie Cfip

starl

\y\ Instanceof: star

Рис. 29.10. Присваивание имени экземпляру символа звезды

Обратиться по имени к созданному вручную экземпляру символа из кода на языке ActionScript можно с помощью метода экземпляра getChildByName ( ) класса DisplayObjectContainer. Например, следующий код использует метод getChildByName ( ), чтобы переместить экземпляр 11 star3м (звезда с именем экземпляра ffstar3ff)B точку с координатой (0; 0):

package { import flash. display. MovieClip;

public class Sky extends MovieClip { public function Sky ( ) { getChildByName(«star3″).x =0;

getChildByName(«star3″).у = 0;

}

}

}

На этапе выполнения к имени экземпляра можно обратиться через переменную экземпляра name класса DisplayOb j ect. Например, следующий код отображает имена всех экземпляров, размещенных в первом кадре основной временной шкалы файла sky. fla:

for (var i:int=0; i < numchildren; i++) { trace(getchildat(i).name);

}

Кроме того, на этапе выполнения имя экземпляра объекта можно изменить, присвоив новое значение его переменной name, как показано в следующем коде:

HeKHtiOObeKTDisplayObject. name = «некоеИмя»:

Тем не менее изменение имен экземпляров на этапе выполнения обычно усложняет отладку кода, поэтому вы должны избегать использования подобной практики в своих программах.

Руководство по actionscript. часть 6, стр. 090

Соответствие переменных именам экземпляров

Метод getChildByName ( ) из предыдущего раздела позволяет успешно обращаться к конкретному экземпляру символа, однако он не совсем удобен. Чтобы упростить обращение к создаваемым вручную экземплярам символов из кода на языке ActionScript, компилятор Flash предоставляет два автоматических сервиса. Во-первых, когда компилятор встречает именованный экземпляр на временной шкале, он автоматически присваивает его переменной экземпляра класса документа временной шкалы или связанного класса, имеющей такое же имя, как у данного экземпляра. Во-вторых, в некоторых случаях, когда соответствующая переменная экземпляра еще не существует в классе документа временной шкалы или связанном классе, компилятор автоматически создает ее. Рассмотрим эти два автоматических сервиса на примере.

Возвращаясь к примеру с файлом s ky. Да из предыдущего раздела, вспомним, что классом документа файла s ky. fla является S ky и что основная временная шкала файла s к у. fla содержит пять экземпляров символа звезды с именами 11 star 111 — 11 star511. Когда компилятор Flash осуществляет компиляцию файла sky. swf, он автоматически добавляет в класс Sky код, который присваивает эти пять экземпляров звезды пяти переменным экземпляра с именами starl — star5. Результат эквивалентен добавлению следующего кода в начало конструктора класса Sky:

package { import flash. display. MovieClip;

public class Sky extends MovieClip { public function Sky ( ) { starl = getChildByName(«starl»); star2 = getChildByName(«star2″); star3 = getChildByName(«star3″); star4 = getChildByName(«star4″);

star5 = getChildByName(«star5″);

}

}

}

Конечно, в данном случае никаких переменных с именами starl — star5B классе Sky на самом деле не определено. Следовательно, предыдущее автоматическое присваивание экземпляров переменным потенциально опасно.

Руководство по actionscript. часть 6, стр. 091

Возникнет ли ошибка, зависит от параметра компиляции под названием Automatically declare stage instances (Автоматически объявлять экземпляры сцены), устанавливаемого для каждого FLA-файла. Данный параметр находится в области Stage (Сцена) окна ActionScript Settings (Параметры ActionScript), открыть которое можно, выбрав команду меню File > Publish Settings (Файл > Настройки публикации) и нажав кнопку Settings (Параметры), расположенную возле параметра ActionScript version (Версия ActionScript) на вкладке Flash. Когда флажок Automatically declare stage instances (Автоматически объявлять экземпляры сцены) установлен (по умолчанию), компилятор не только присваивает экземпляры сцены соответствующим переменным, но и автоматически объявляет эти переменные. Например, если мы установим флажок Automatically declare stage instances (Автоматически объявлять экземпляры сцены) для файла sky. fla, то компилятор автоматически объявит переменные экземпляра с именами starl — star5B классе Sky. Результат эквивалентен добавлению следующего кода в класс Sky (обратите внимание, что для автоматически объявляемых переменных используется модификатор управления доступом public):

package { import flash. display. MovieClip;

public class Sky extends MovieClip { public var starl-.Star; public var star2:Star; public var star3:Star; public var star4:Star; public var star5:Star;

public function Sky ( ) { starl = getChildByName(«starl»); star2 = getChildByName(«star2″); star3 = getChildByName(«star3″); star4 = getChildByName(«star4″); star5 = getChildByName(«star5″);

}

}

} .

Благодаря предыдущему автоматически сгенерированному коду внутри класса Sky мы можем ссылаться на экземпляры звезд из основной временной шкалы файла sky. fla непосредственно по имени экземпляра. Например, следующий код перемещает экземпляр 11 star3м (звезда с именем экземпляра ffstar3ff)B точку с координатой (0; 0):

package { import flash. display. MovieClip;

public class Sky extends MovieClip { public function Sky ( ) { star3.x = 0; star3.y = 0;

}

}

}

Подобным образом обращаться к экземплярам звезд непосредственно по имени экземпляра можно также из любого сценария кадра на основной временной шкале файла sky. fla. Например, если поместить следующий код в сценарий первого кадра файла sky. fla, то экземпляр ffstar5ff будет повернут на 30°:

star5.rotation = 30;

Ловко, да?

Однако с учетом вышеописанного автоматического поведения, если флажок Automatically declare stage instances (Автоматически объявлять экземпляры сцены) установлен, программист должен проявлять осторожность, чтобы не определить переменные экземпляра, имена которых совпадают с именами экземпляров символов. Например, следующий код определяет переменную экземпляра starl, имя которой совпадает с именем экземпляра символа с основной временной шкалы файла sky. fla:

package { import flash. display. MovieClip;

public class Sky extends MovieClip { public var starl:Star;

public function Sky ( ) { }

}

}

Определение переменной экземпляра в предыдущем коде вызывает следующую ошибку на этапе компиляции:

A conflict exists with definition starl in namespace internal.

Руководство по actionscript. часть 6, стр. 092

На русском языке она будет выглядеть так: Существует конфликт с определением starl в пространстве имен internal.

В отличие от этого, когда флажок Automatically declare stage instances (Автоматически объявлять экземпляры сцены) снят, компилятор не объявляет соответствующие переменные для экземпляров сцены. Например, если мы снимем данный флажок для файла sky. fla, то компилятор не объявит переменные экземпляров с именами starl — star5 в классе Sky. Тем не менее он по-прежнему присваивает тем переменным ссылки на пять экземпляров символа звезды, размещенных на основной временной шкале. В итоге мы должны добавить объявления соответствующих

переменных в класс Sky, как показано в следующем коде. Обратите внимание, что по необходимости переменные объявлены с использованием модификатора управления доступом public.

package { import flash. display. MovieClip;

public class Sky extends MovieClip { public var starl:Star; public var star2:Star; public var star3:Star; public var star4:Star; public var star5:Star;

public function Sky ( ) {

}

}

}

Если убрать объявления переменных из предыдущего кода, то возможны два результата в зависимости от того, объявлен класс с атрибутом dynamic или нет (обратитесь к разд. «Динамические переменные экземпляра» гл. 15). Если класс объявлен без использования атрибута dynamic (как в случае с классом Sky), на этапе выполнения возникнет следующая ошибка, поскольку инструкции присваивания, автоматически добавленные компилятором, ссылаются на несуществующие переменные:

ReferenceError: Error #1056: Cannot create property star5 on Sky.

Руководство по actionscript. часть 6, стр. 093

По-русски она будет выглядеть следующим образом: Ошибка обращения: невозможно создать свойство star5 в классе Sky.

Если, с другой стороны, класс объявлен с использованием атрибута dynamic, то автоматически добавляемые инструкции присваивания на этапе выполнения просто создают новые динамические переменные экземпляра (с именами starl — star5) для каждого экземпляра класса.

Несмотря на то что по умолчанию флажок Automatically declare stage instances (Автоматически объявлять экземпляры сцены) установлен, многие программисты предпочитают не устанавливать его. Как мы только что узнали, если он не установлен, то нединамические классы, связанные с временными шкалами, должны объявлять переменные, которые соответствуют всем именованным экземплярам сцены. Подобные ^явные объявления проливают свет на природу появления переменных в использующем их классе и исключают возникновение ошибок компиляции при редактировании данного класса в других средах разработки (например, в приложении Flex Builder 2).

Стоит отметить, что автоматически генерируемые классы документа и автоматически генерируемые связанные классы всегда компилируются с установленным флажком Automatically declare stage instances (Автоматически объявлять экземпляры сцены). Следовательно, обратиться к именованным экземплярам сцены любой временной шкалы, связанной с автоматически генерируемым классом документа или автоматически генерируемым связанным классом, можно через соответствующие переменные экземпляра.

Обращение к созданному вручную тексту

В предыдущих разделах мы познакомились с тремя инструментами, которые позволяют обращаться к созданным вручную экземплярам символов из кода на языке ActionScript, а именно:

? метод getChildAt ( );

? метод getChildByName ( );

? автоматически присваиваемые переменные экземпляра.

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

Руководство по actionscript. часть 6, стр. 094

В среде разработки Flash текстовые поля создаются с помощью инструмента Text (Текст). Созданные вручную текстовые поля типа Dynamic Text (Динамический текст) или Input Text (Вводимый текст) на этапе выполнения представляются экземплярами класса flash, text. TextField. Как и в случае с экземплярами символов, поля типа Dynamic Text (Динамический текст) и Input Text (Вводимый текст) становятся отображаемыми детьми объекта, представляющего временную шкалу, на которой они размещаются. Кроме того, как и в случае с экземплярами символов, текстовым полям описанных типов могут присваиваться имена экземпляров, которые соответствуют именам автоматически присваиваемых переменных экземпляра.

Например, приведенная ниже последовательность действий описывает, как переместить созданное вручную текстовое поле типа Dynamic Text (Динамический текст) в точку с координатой (200; 300), используя код на языке ActionScript.

1. В среде разработки Flash создайте новый FLA-файл и назовите его mes sage. fla.

2. На палитре Tools (Инструменты) выберите инструмент Text (Текст).

3. Щелкните кнопкой мыши на сцене первого кадра основной временной шкалы файла message. fla.

4. В появившемся поле введите слово hello.

5. На палитре Properties (Свойства) (команда меню Window > Properties (Окно > Свойства)) измените значение Static Text (Статический текст) на Dynamic Text (Динамический текст).

6. На палитре Properties (Свойства) вместо значения (Имя экземпляра) введите msg.

7. Щелкните кнопкой мыши на первом кадре основной временной шкалы файла message. fla (выделите его).

8. Откройте палитру Actions (Действия) (команда меню Window > Actions (Окно > Действия)).



Полезные ссылки
Случайные записи
  • 11.03.2011">Руководство по actionscript. часть 4, стр. 008
  • 23.01.2011">Руководство по actionscript. часть 1, стр. 046
  • 06.07.2011">Хoрoший дизaйн сайта инструмент для достижения прибыли.
  • 07.03.2011">Руководство по actionscript. часть 4, стр. 112
  • 22.01.2011">Руководство по actionscript. часть 1, стр. 098
  • 04.06.2010">Самоучитель по креативному веб-дизайну. Книга 3, стр.22
  • 03.06.2010">Самоучитель по креативному веб-дизайну. Книга 3, стр.61
  • 09.03.2011">Руководство по actionscript. часть 4, стр. 068
  • 08.03.2011">Руководство по actionscript. часть 4, стр. 093
  • 09.03.2011">Руководство по actionscript. часть 4, стр. 059
  • 17.05.2010">Самоучитель по креативному веб-дизайну. Книга 2, стр.113
  • 23.02.2011">Руководство по actionscript. часть 7, стр. 029
  • 18.03.2011">Руководство по actionscript. часть 2, стр. 127
  • 12.03.2011">Руководство по actionscript. часть 3, стр. 116
  • 16.03.2011">Руководство по actionscript. часть 3, стр. 022
Опрос

Какие цвета вы предпочитаете?

View Results

Loading ... Loading ...