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

Предположим, что у нас есть символ Movie Clip (Клип) с именем box symbol и мы хотим создать его экземпляры из кода на языке ActionScript. Рассмотрим необходимую последовательность действий.

1. Выберите символ box_symbol в библиотеке.

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

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

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

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

6. По умолчанию в результате выполнения предыдущих шагов среда разработки Flash выведет окно с предупреждением следующего содержания: A definition for this class could not be found in the classpath, so one will be automatically generated in the SWF file on export (Определение для данного класса не может быть найдено в пути к классам, поэтому он будет автоматически сгенерирован в SWF-файле при экспорте). Нажмите кнопку ОК, чтобы закрыть это предупреждение.

Чтобы создать экземпляр символа box_symbol после выполнения предыдущих шагов, мы используем выражение new Box ( ) на любой временной шкале или в любом классе SWF-файла, содержащего символ box symbol.

Имена экземпляров для отображаемых объектов, создаваемых программным путем

Между прочим, как и в случае с экземплярами, создаваемыми вручную, отображаемым объектам, которые создаются программным путем, можно тоже присваивать имя экземпляра через переменную name. Например, следующий код создает экземпляр класса TextField и присваивает ему имя экземпляра «price», добавляет его в контейнер, а затем по имени получает на него ссылку.

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

Var t:TextField = new TextFi eld( ): t. text = «$99.99″; t. name = «price»

var detailsPage:Sprite = new Sprite( ); detailsPage. addChild(t);

trace(detailsPage. getChildByName(«price»)); // Выводит: [object TextField]

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

^ I Имена экземпляров в основном должны использоваться только при обращении к эк-м$л» земплярам текстовых полей или символов библиотеки, созданным вручную в среде 9&S разработки Flash.

К отображаемым объектам, создаваемым программным путем, следует всегда обращаться по ссылке. Например, следующий код демонстрирует две версии метода displayPrice ( ) (это гипотетический метод, который отображает стоимость товара). В обоих случаях стоимость отображается в объекте TextField. В первой версии (рекомендуемой) объект TextField, который будет отображать стоимость, передается в метод как объектная ссылка. Во второй версии в метод передается объект DisplayObjectContainer, который содержит объект TextField, и метод получает ссылку на объект TextField по имени экземпляра.

// Рекомендуется

public function displayPrice (priceField:TextField, price:Number):void { priceField. text = «$» + price;

// He рекомендуется

public function displayPrice (orderForm;Sprite, price.-Number): void { TextField(orderForm. getChildByName(«price»)).text = «$» + price;

}

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

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

В языке MXML имя экземпляра отображаемого объекта может быть установлено через атрибут id, а обращаться к именованным отображаемым объектам можно также с помощью метода getChildByName ( ). Тем не менее, как и в случае с приложениями, разработанными на чистом ActionScript, вместо имен экземпляров предпочтительнее использовать ссылки.

Связывание нескольких символов с одним суперклассом

Ранее из разд. «Связанные классы для символов Movie Clip (Клип)» мы узнали, как связать класс с символом Movie Clip (Клип). Теперь рассмотрим, как обеспечить

одинаковым программным поведением несколько различных символов Movie Clip (Клип), связав их с одним суперклассом.

В качестве примера создадим простую форму регистрации с двумя различными графическими стилями интерфейса. Подобная форма может потребоваться в приложении, которое предоставляет пользователям возможность выбора дизайна интерфейса, или обложки. Наши формы будут выглядеть по-разному, однако их поведение будет одинаковым.

Мы начнем с создания FLA-файла LoginApp. fla в среде разработки Flash. В нем мы создадим два символа — по одному для каждого графического стиля формы регистрации. Назовем первый символ именем LoginForm Stylel, а второй символ — LoginForm_Style2. В каждый символ формы регистрации добавим два созданных вручную текстовых поля (с именами username и password) и кнопку отправки данных (с именем submi tBtп). Сама по себе кнопка является нарисованным вручную экземпляром символа Movie Clip (Клип). На рис. 29.11 изображены два символа формы регистрации.

Login Form_Style1 —

Login Form_Style2

Рис. 29.11. Символы формы регистрации

Далее создадим класс LoginForm, который управляет поведением символов формы регистрации. Он реагирует на нажатия кнопки отправки данных и передает полученную информацию на сервер. В этом примере снимем флажок компиляции Automatically declare stage instances (Автоматически объявлять экземпляры сцены). Соответственно внутри класса LoginForm объявим созданные вручную элементы из символов формы регистрации в качестве переменных экземпляра. Имена переменных экземпляра — username, password и submi tBt n — соответствуют именам экземпляров в символах формы регистрации.

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

Рассмотрим код для класса LoginForm:

package { import flash. display.*; import flash. text.*; import flash. events.*;

public class LoginForm extends MovieClip { public var username:TextField;

public var password:TextField; public var submitBtn:SimpleButton;

public function LoginForm ( ) { submitBtn. addEventListener(MouseEvent. CLICK. submitListener);

}

private function submitListener (e:MouseEvent):void { submit(username. text, password. text);

}

public function submit (name:String, pass:String):void { traceC’Now submitting user: » + name + » with password: » + pass);

// Теперь передаем полученную информацию // на сервер (код не показан). // Обычно для отправки данных на сервер // используется класс flash. net. URLLoader.

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

}

}

}

Наконец, связываем поведение класса LoginForm с символами формы регистрации. Однако поскольку один класс не может быть связан более чем с одним символом, мы не сможем связать класс LoginForm непосредственно с символами формы регистрации. Вместо этого мы должны связать каждый символ формы регистрации с подклассом класса LoginForm. Этот процесс заключается в выполнении следующих шагов.

1. Выберите символ LoginForm_Stylel в библиотеке файла LoginApp. fla.

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

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

4. В поле Base class (Базовый класс) окна Linkage Properties (Свойства связывания) введите LoginForm.

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

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

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

7. По умолчанию в результате выполнения предыдущих шагов среда разработки Flash выведет окно с предупреждением следующего содержания: A definition for this class could not be found in the classpath, so one will be automatically generated in the SWF file on export (Определение для данного класса не может быть найдено в пути к классам, поэтому он будет автоматически сгенерирован в SWF-файле при экспорте). Нажмите кнопку ОК этого окна.

8. Выберите символ LoginForm_Style2 в библиотеке файла LoginApp. fla, после чего повторите шаги 2-6, заменив значение LoginForm_Stylel значением LoginForm_Style2 на шаге 6.

В результате выполнения предыдущих шагов компилятор Flash на этапе компиляции автоматически создаст два класса — LoginForm_Stylel и LoginForm_Style2, каждый из которых расширяет класс LoginForm. Затем компилятор свяжет символ LoginForm_Stylel с классом LoginForm_Stylel, а символ LoginForm_Style2 — с классом LoginForm_Style2. Таким образом, оба символа наследуют поведение класса LoginForm.

Композиционный подход как альтернатива связанным классам

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

Например, в предыдущем разделе мы связали символы формы регистрации с классом LoginForm, чтобы предоставить этим символам возможность отправлять информацию на сервер программным путем. Однако можно утверждать, что класс LoginForm не является подтипом класса MovieClip. Скорее это простая коммуникационная утилита, которая помогает получить введенные данные из пользовательского интерфейса. Как таковая, она может (и, возможно, должна) быть определена в виде отдельного класса для последующего использования любым символом, который соглашается предоставлять соответствующие данные.

Для простоты сравнения, следующий код демонстрирует новую версию класса LoginForm, переработанного для использования в качестве вспомогательного класса на временной шкале символа. Новый класс имеет новое имя LoginManager, отражающее его новую роль — класс коммуникационной утилиты. Обратите внимание, что конструктор нового класса принимает ссылки на объекты пользовательского интерфейса, поддерживающие пользовательский ввод.

package { import flash. display.*; import flash. text.*; import flash. events.*:

public class LoginManager { private var username:TextField; private var password:TextField;

public function LoginManager (username:TextField,

password:TextField. submitBtn:SimpleButton) {

this. username = username: this. password = password;

submitBtn. addEventListener(MouseEvent. CLICK, submitListener);

private function submitListener (e:MouseEvent):void { submit(username. text, password. text);

}

public function submit (name:String, pass:String):void { traceC’Now submitting user: » + name + » with password: » + pass);

// Теперь передаем полученную информацию на сервер (код не показан). // Обычно для отправки данных на сервер используется класс // flash. net. URLLoader.

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

}

}

}

Чтобы использовать класс LoginManager, в каждом из символов формы регистрации из предыдущего раздела должен быть определен сценарий кадра со следующим кодом (предположительно, в кадре 1, но в случае с анимированной формой, возможно, далее на временной шкале). В следующем коде аргументы username, password и submi tBt п являются именами экземпляров текстовых полей и кнопки в символе формы регистрации:

var loginManager:LoginManager = new LoginManager(username,

password, submitBtn);

Различие между подходом с использованием класса LoginManager и подходом с использованием класса LoginForm из предыдущего раздела, по сути дела, аналогично различию между композицией и наследованием (дополнительные сведения можно найти в подразд. «Наследование в сравнении с композицией» разд. «Теория наследования» гл. 6). Потенциальными преимуществами подхода с использованием композиции являются следующие.

? Класс LoginManager может наследоваться от любого произвольного класса, в отличие от класса LoginForm, который должен наследоваться от класса MovieClip.

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

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

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

Предварительная загрузка классов

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

Чтобы избежать этого, мы можем экспортировать классы SWF-файла после кадра 1 на основной временной шкале, а затем создать простой сценарий временной шкалы, который отображает информацию о ходе загрузки классов.

В качестве примера изменим наш файл sky. fla таким образом, чтобы классы, которые он использует, не загружались до кадра 15. Стоит отметить, однако, что класс документа SWF-файла — и любой класс, на который прямо или косвенно ссылается класс документа, — всегда загружается в кадре 1. Таким образом, чтобы предотвратить загрузку класса Star до кадра 1, мы должны сначала удалить имена всех созданных вручную экземпляров класса Star и определения переменных starl — star5 из кода класса Sky. Чтобы удалить имена экземпляров, мы выбираем каждый экземпляр символа Star на сцене и удаляем его имя на палитре Properties (Свойства).

Далее описывается, как загрузить классы файла sky. fla в кадре 15 и отобразить соответствующее сообщение в процессе загрузки классов.

Сначала выполним следующие шаги, чтобы указать компилятору Flash на необходимость экспортирования классов файла sky. fla в кадре 15.

1. Откройте файл sky. fla в среде разработки Flash.

2. Выберите команду меню File > Publish Settings (Файл > Настройки публикации).

3. В окне Publish Settings (Настройки публикации) нажмите кнопку Settings (Параметры), расположенную возле параметра ActionScript version (Версия ActionScript) с установленным значением ActionScript 3.0 на вкладке Flash.

4. В поле Export Classes in Frame (Экспортировать классы в кадре) окна ActionScript Settings (Параметры ActionScript) введите 15.

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

5. Нажмите кнопку ОК, для того чтобы закрыть окно ActionScript Settings (Параметры ActionScript).

6. Снова нажмите кнопку ОК, чтобы закрыть Publish Settings (Настройки публикации).

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

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

Сначала на основной временной шкале файла sky. fla мы дважды щелкаем кнопкой мыши на имени слоя Layer 1 (Слой 1) и изменяем его на sky. Затем мы увеличиваем размер временной шкалы до 15 кадров следующим образом.

1. На основной временной шкале щелкните на кадре 1 слоя sky, чтобы выделить этот кадр.

2. Щелкните кнопкой мыши на ключевом кадре 1 и, удерживая кнопку мыши, перетащите его на кадр 15 временной шкалы.

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

Далее мы добавим новый слой для кода и назовем его scripts.

1. Выберите команду меню Insert > Timeline > Layer (Вставка > Временная шкала > Слой).

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

2. Дважды щелкните кнопкой мыши на имени нового слоя и измените его на scripts.

После этого мы добавим слой labels с двумя метками кадров — loading и main. Они обозначают состояние загрузки и стартовую точку для приложения соответственно.

1. Выберите команду меню Insert > Timeline > Layer (Вставка > Временная шкала > Слой).

2. Дважды щелкните кнопкой мыши на имени нового слоя и измените его на labels.

3. В кадрах 4 и 15 слоя labels добавьте новые ключевые кадры (используя команду меню Insert > Timeline > Keyframe (Вставка > Временная шкала > Ключевой кадр)).

4. Выбрав кадр 4 на слое labels, в поле Frame (Кадр) палитры Properties (Свойства) вместо (Метка кадра) введите loading.

5. Выбрав кадр 15 на слое labels, в поле Frame (Кадр) палитры Properties (Свойства) вместо (Метка кадра) введите main.

Теперь добавим сценарий предварительного загрузчика на слой scripts.

1. В кадре 5 слоя scripts добавьте новый ключевой кадр (используя команду меню Insert > Timeline > Keyframe (Вставка > Временная шкала > Ключевой кадр)).

2. Выбрав кадр 5 слоя scripts, введите следующий код на палитре Actions (Действия):

if (framesLoaded == total Frames) {

gotoAndStopCmain»); } else {

gotoAndPlay(«1oadi ng»);

}

Наконец, добавим сообщение о загрузке, отображаемое в процессе загрузки классов файла star. fla:

1. Выбрав кадр 1 слоя scripts, введите следующий код на палитре Actions (Действия):

import flash. text.*:

var loadMsg:TextField = new TextField( ); loadMsg. text = «Loading…Please wait.»: loadMsg. autoSize = TextFieldAutoSize. LEFT: loadMsg. border = true: loadMsg. background = true: loadMsg. selectable = false: addChild(loadMsg):

2. В кадре 15 слоя scripts добавьте новый ключевой кадр (используя команду меню Insert > Timeline > Keyframe (Вставка > Временная шкала > Ключевой кадр)).



Полезные ссылки
Случайные записи
  • 07.03.2011">Руководство по actionscript. часть 4, стр. 103
  • 18.10.2019">Игровой автомат Always Hot в Azino
  • 03.06.2010">Самоучитель по креативному веб-дизайну. Книга 3, стр.94
  • 24.08.2011">Новые функции микроблогов Twitter
  • 27.02.2011">Руководство по actionscript. часть 6, стр. 033
  • 26.02.2011">Руководство по actionscript. часть 6, стр. 073
  • 03.06.2010">Самоучитель по креативному веб-дизайну. Книга 3, стр.67
  • 18.03.2011">Руководство по actionscript. часть 2, стр. 129
  • 23.08.2011">Британский ученый призывает запретить сливочное масло.
  • 18.05.2010">Самоучитель по креативному веб-дизайну. Книга 2, стр.58
  • 10.05.2010">Самоучитель по креативному веб-дизайну. Книга 1, стр.51
  • 17.06.2012">«Лаборатория Касперского» отметила сокращение количества спама
  • 18.03.2011">Руководство по actionscript. часть 2, стр. 119
  • 22.01.2011">Руководство по actionscript. часть 1, стр. 115
  • 11.03.2011">Руководство по actionscript. часть 4, стр. 016
Опрос

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

View Results

Loading ... Loading ...