Опубликован: 04.11.2006 | Доступ: свободный | Студентов: 4621 / 581 | Оценка: 4.46 / 3.96 | Длительность: 39:17:00
Урок 6:

Создание и модификация объектов

  1. Командой Управление > Проверить фильм (Control > Test Movie) запустите тест проекта.

С началом воспроизведения фильма вы обнаружите, что у нас проблемы – проект не функционирует. Четыре экземпляра фильма-символа Icons, похоже, не унаследовали возможности Custom1, как мы планировали. Но если нажать кнопку Go to Scene 2, то обнаружится, что теперь экземпляры все унаследовали и работают. Если теперь нажать кнопку Go to Scene 1, мы увидим, что и здесь они заработали. Теперь можно сколько угодно переключаться то на сцену 2, то на сцену 1 – и здесь, и там экземпляры будут работать правильно. Что же получается? В самом начале фильма, в сцене 1, метод registerClass() не имел эффекта, а после переключения сцен заработал. Ладно, давайте сперва внесем нужные исправления, а потом разберем, в чем было дело.

  1. Закройте тестовый фильм, вернувшись в среду разработки. Вы должны снова оказаться на монтажном столе фильма-символа Icons. Выделите кадр 1 и в панели Действия поместите перед кодом, введенным на предыдущих шагах, действие #initclip, а в самом конце – действие #endinitclip:
#initclip
// код, введенный на предыдущих шагах
#endinitclip

Эти действия заключают между собой так называемый блок инициализации. Что это такое, мы сейчас разъясним, но прежде давайте проверим, как работает фильм теперь.

  1. Командой Управление > Проверить фильм (Control > Test Movie) запустите тест проекта.

На сей раз вы увидите, что наши четыре экземпляра функционируют как должно: работает и перетаскивание, и все остальное; экземпляры обладают всеми возможностями класса Custom1. Если перейти в сцену 2, то и там все будет в порядке. Так в чем же тут дело?

Когда мы тестировали фильм в прошлый раз, эффект регистрации фильма-символа Icons как представителя класса Custom1 явно не имел места, а теперь все сработало. Давайте разберем по пунктам, как развивались события при первом тестировании фильма:

  1. Фильм (SWF) загружается и инициализируется.
  2. Загружается кадр 1.
  3. Создаются экземпляры, находящиеся в кадре 1 (в том числе четыре экземпляра клипа Icons).
  4. Выполняются действия, присоединенные к кадру 1 основного монтажного стола.
  5. Выполняются действия, присоединенные к кадру 1 экземпляров (как раз они и включают описание класса Custom1, и здесь же находится вызов метода registerClass() ).
  6. С этого момента новые экземпляры фильма-символа Icons будут наследовать возможности класса Custom1.

Теперь понятно, почему не работали четыре экземпляра – они появились на сцене (третий пункт) до того, как произошла регистрация (пятый пункт). А, как вы помните, регистрация и ее отмены не имеет эффекта для существующих экземпляров фильма-символа – только для новых. Существующие экземпляры сохраняют прежние функциональные возможности. Вот и в нашем фильме к моменту регистрации четыре экземпляра уже были созданы, и потому ничего не унаследовали. Ну, а как же экземпляры во второй сцене? Они-то работали. Верно, работали, поскольку переход в сцену 2 (и создание экземпляров в ней) можно считать седьмым пунктом в нашем перечне событий. Регистрация уже состоялась, и на экземпляры сцены 2 подействовала. Переход обратно в сцену 1 будет восьмым пунктом; экземпляры созданы заново, и регистрация тоже дала нужный результат. Ну вот, мы выяснили, почему так странно (на первый взгляд) работал первоначальный тест. А каким же образом решили проблему два действия, которые мы добавили?

Нам требовался механизм, который обеспечил бы наследование четырьмя экземплярами функций класса Custom1 – то есть выполнил регистрацию – до загрузки кадра 1 и создания этих экземпляров. Так вот, действия #initclip и #endinitclip – и есть такой механизм. Это специальные команды, которые используются только в фильмах-символах (и только в их кадре 1); они позволяют управлять процессом инициализации фильма – иначе говоря, порядком выполнения действий. Вот как это работает.

Помните, в диалоговом окне Свойства связи (Linkage Properties) для фильма-символа Icons (из библиотеки) была установлена опция "Экспорт в первый кадр" ("Export in first frame")? Так вот, это означает, что данный клип будет загружен в память даже раньше, чем кадр 1 основного фильма. Впрочем, в первый раз нам это ничем не помогло; зато во второй – Flash, загружая фильм-символ Icons, обнаружил в его первом кадре блок #initclip#endinitclip и должен был немедленно выполнить все действия заключенные в этом блоке. Таким образом этот скрипт был выполнен до загрузки кадра 1 основного монтажного стола, и порядок событий получился таким:

  1. Фильм загружается и инициализируется.
  2. Выполняются действия в блоке #initclip – #endinitclip (в этом блоке как раз находится описание класса Custom1, а также вызов метода registerClass() ).
  3. С этого момента новые экземпляры фильма-символа Icons будут наследовать возможности класса Custom1.
  4. Загружается кадр 1.
  5. Создаются экземпляры, находящиеся в кадре 1 (в том числе четыре экземпляра клипа Icons ).
  6. Выполняются действия, присоединенные к кадру 1 основного монтажного стола.
  7. Выполняются действия, присоединенные к кадру 1 экземпляров (любые действия, не входящие в блок #initclip – #endinitclip ).

И в результате процесс регистрации состоялся (второй пункт) до того, как были созданы экземпляры кадра 1 (пятый пункт). Наши четыре экземпляра благополучно унаследовали все, что нужно – как и показало второе тестирование.

Конечно, не обязательно программировать создание класса и регистрацию фильма-символа как объекта этого класса именно тем способом, который был описан в данном упражнении. Главное – чтобы вы понимали порядок выполнения скриптов и то, как этот порядок повлияет на процесс регистрации, а способов можно выбрать в зависимости от обстоятельств.

Примечание Показанную здесь схему инициализации (с блоком #initclip – #endinitclip ) используют все компоненты Flash. Желательно, чтобы и вы, создавая собственные компоненты, придерживались этой схемы.

Примечание Если для клипа, содержащего блок #initclip – #endinitclip, не установлена опция "Экспорт в первый кадр" ("Export in first frame") в диалоговом окне Свойства связи (Linkage Properties), то блок инициализации выполняется не перед первым кадром фильма, а перед тем кадром, который содержит первый из экземпляров данного клипа. Например, если первый экземпляр встречается в кадре 47, то блок инициализации исполняется перед загрузкой кадра 47. В результате экземпляр(ы), находящиеся в этом кадре, будут зарегистрированы правильно.

Давайте потренируемся еще на одном примере, добавим в наш проект последний скрипт.

  1. Закройте тестовый фильм, вернувшись в среду разработки. Перейдите в Сцену 1. Командой Окно > Библиотека (Window > Library) откройте панель Библиотека и найдите фильм-символ под названием HeadClip. Щелкните на нем правой кнопкой (или Control - щелчок на Mac) и выберите в появившемся меню команду Связи (Linkage). В открывшемся диалоговом окне Свойства связи (Linkage Properties) установите флажок Экспорт в первый кадр (Export in first frame) и вы видите, что фильм символ имеет идентификатор "headClip".

Этот клип изображает у нас на сцене головы. Мы присваиваем ему идентификатор, чтобы можно было его зарегистрировать как объект еще одного нового класса, который мы сейчас создадим.

  1. Выделите кнопку Go to Scene 2 и добавьте в панель Действия следующий скрипт – внутри обработчика события on(release), перед строкой nextScene();:
_global.Custom2 = function(){
  }
  Custom2.prototype = new MovieClip();
  Custom2.prototype.onEnterFrame = function(){
    this._rotation += 5;
  }
  Object.registerClass("Icons", Custom2);
  Object.registerClass("headClip", Custom2);

В шести первых строках создается новый класс под названием Custom2 ; его экземплярам дается способность поворачиваться на 5 градусов каждый раз при наступлении события enterFrame. Две последние строки регистрируют фильмы-символы Icons и HeadClip как объекты класса Custom2 – после нажатия кнопки их экземпляры унаследуют возможности этого класса. Заметьте – мы поместили эти действия перед действием nextScene(): это сделано для того, чтобы зарегистрировать клипы до перехода в следующую сцену, в которой создаются экземпляры этих символов. Если бы мы поступили наоборот и поместили этот скрипт после действия nextScene(), то сначала произошел бы переход во вторую сцену, были бы созданы экземпляры, и только потом состоялась бы регистрация клипов. При таком порядке событий регистрация не имела бы эффекта – ведь экземпляры клипов уже существуют.

Итак, при нажатии этой кнопки и выполнении скрипта регистрация клипа Icons как объекта класса Custom2 отменяет предыдущую связь его с классом Custom1 (которую мы создавали и обсуждали в предыдущих упражнениях). Таким образом, изначально, в сцене 1, экземпляры клипа Icons будут функционировать как объекты класса Custom1, но после нажатия этой кнопки все последующие экземпляры будут наследовать функциональность Custom2 (как и экземпляры фильма-символа HeadClip ).

Этот скрипт демонстрирует, что как объявление нового класса, так и регистрация могут происходить в любом месте фильма. Соблюдая правильный порядок событий при регистрации, вы можете осуществлять ее, когда и как вам удобно.

  1. Командой Управление > Проверить фильм (Control > Test Movie) запустите тест проекта.

Сразу после начала воспроизведения фильма четыре экземпляра справа от bigHead ведут себя как объекты класса Custom1. Нажмите кнопку перехода в сцену 2, и эти экземпляры, как и экземпляры фильма-символа HeadClip, станут функционировать, как объекты класса Custom2. Их больше нельзя перетаскивать, они просто вращаются, как предписывает класс Custom2.


  1. Закройте тестовый фильм и сохраните свою работу как registerClass2.fla.

Уф, даже не верится – этот урок закончился. Долгим он был, зато вы так много узнали об объектах, наследовании, классах, подклассах, методах и о многом другом. Теперь вам по силам взяться за разработку весьма сложных проектов. А кроме того, все эти знания помогут вам в последующих уроках этой книги.

Салтанат Бектегенова
Салтанат Бектегенова

Дострочное пересдача экзамена

 

Евгений Стародубцев
Евгений Стародубцев

Вот задание:

7. Открыв панель Действия (Actions) и установив ее в Экспертный режим(Expert Mode), выделите кадр 1 слоя Actions и введите следующий скрипт: