Март 2011

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

Обращение к поддоменам Интернета

Из представленной ранее табл. 19.3 известно, что удаленный SWF-файл может загружать данные только из своего удаленного региона происхождения. Из разд. «Локальная область действия, удаленная область действия и удаленные регионы» вы также узнали, что два различных поддомена Интернета, например www. example. com и games. example. com, считаются разными удаленными регионами. Таким образом, SWF-файл, загруженный из источника http://example. com, может загружать любой

файл данных, размещенный в источнике http://example. com, но не может загружать файлы данных, размещенные в любом другом домене, включая поддомены, например games. example. com. Как ни удивительно, но это означает, что SWF-файл, загруженный из источника http://example. com, не может использовать абсолютный URL-адрес для обращения к файлу, размещенному на сайте www. example. com. Для предоставления SWF-файлу, загруженному из источника example. com, разрешения на загрузку элементов с сайта www. example. com используется файл политики безопасности — этот механизм был рассмотрен ранее в разд. «Разрешения распространителя (файлы политики безопасности)».

Следующая последовательность шагов описывает действия владельца сайта example. com, желающего создать файл политики безопасности, который разрешает SWF-файлам, загружаемым из источника example. com, загружать файлы данных с сайта www. example. com и наоборот.

1. Создайте новый текстовый файл с именем crossdomain. xml.

2. Откройте файл crossdomain. xml в текстовом редакторе.

3. Добавьте следующий XML-код в этот файл:




SYSTEM «http://www. adobe. com/xml/dtds/cross-domain-policy. dtd»>





4. Сохраните файл crossdomain. xml.

5. Выгрузите файл crossdomain. xml в корневую директорию сайта example. com (чтобы этот файл был доступен по адресу http://example. com/crossdomain. xml).

Обращение к переменной экземпляра content класса Loader

Когда отображаемый элемент из внешнего источника загружается с помощью объекта Loader, экземпляр загруженного элемента помещается в переменную content объекта Loader. Как было сказано ранее в подразд. «Обращение к содержимому в виде данных» разд. «Ограничения на загрузку содержимого, обращение к содержимому в виде данных, кросс-скриптинг и загрузку данных», обращение к значению переменной content считается либо операцией обращения к содержимому в виде данных (если объект, содержащийся в переменной content, является изображением), либо операцией кросс-скриптинга (если объект, содержащийся в переменной content, является экземпляром основного класса SWF-файла). Таким образом, в соответствии с ограничениями типов безопасности песочниц, представленными в табл. 19.3-19.5, обращение к загруженному элементу с помощью переменной content без необходимого разрешения приведет к возникновению ошибки безопасности в ситуациях, когда:

? удаленный SWF-файл использует переменную content для обращения к ресурсу, загружаемому из другого удаленного региона;

? локальный SWF-файл с поддержкой сети использует переменную content для обращения к ресурсу, загружаемому из удаленной области действия;

? локальный SWF-файл с поддержкой сети использует переменную content для обращения к локальному SWF-файлу с установленным доверием;

? локальный SWF-файл с поддержкой файловой системы использует переменную content для обращения к локальному SWF-файлу с установленным доверием.

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

Если вы столкнетесь с любой из описанных ситуаций в своем коде, то должны рассмотреть возможность полностью избежать использования переменной content. Если ваше приложение должно только отображать загруженный элемент на экране, то обращаться к переменной content совершенно не обязательно. Чтобы отобразить загруженный элемент на экране, не обращаясь к переменной content, просто добавьте объект Loader этого элемента — а не значение переменной content — прямо в список отображения. Дополнительную информацию и пример кода можно найти в подразд. «Отображение загруженного элемента на экране» разд. «Использование класса Loader для загрузки отображаемых элементов на этапе выполнения» гл. 28.

Стоит отметить, однако, что в следующих ситуациях использование переменной content обязательно, и, чтобы избежать ситуаций нарушения безопасности, должны быть установлены соответствующие разрешения создателя или распространителя:

? SWF-файлу, загружающему элемент, требуется доступ к данным элемента, например, чтобы прочитать пикселы растрового изображения;

? SWF-файлу, загружающему элемент, необходимо выполнить операцию кросс-скриптинга для загруженного элемента;

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

Дополнительную информацию о классе Loader можно найти в гл. 28, про список отображения вы прочитаете в гл. 20.

К части II!

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

ЧАСТЬ II

Отображение и интерактивность

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

Прочитав часть И, вы сможете добавлять графическое содержимое и интерактивные возможности в ваши собственные приложения.

? Глава 20 «АР1 отображения и список отображения».

? Глава 21 «События и иерархии отображения».

? Глава 22 «Интерактивность».

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

? Глава 23 «Обновления экрана».

? Глава 24 «Программная анимация».

? Глава 25 «Рисование с помощью векторов».

? Глава 26 «Программирование растровой графики».

? Глава 27 «Отображение и ввод текста».

? Глава 28 «Загрузка внешних отображаемых элементов».

ПИВА 21

API отображения и список

отображения

Одной из основных задач в программировании на языке ActionScript является отображение объектов на экране. В этой связи платформа Flash предлагает широкий набор инструментов для создания и управления графическим содержимым. Данные инструменты можно разделить на две общие категории.

? API отображения среды выполнения Flash — набор классов для работы с интерактивными графическими объектами, растровыми изображениями и векторным содержимым.

? Готовые компоненты пользовательского интерфейса:

• набор компонентов пользовательского интерфейса платформы разработки Flex — развитый набор настраиваемых компонентов пользовательского интерфейса, построенный на базе API отображения;

• набор компонентов пользовательского интерфейса среды разработки Flash — набор компонентов пользовательского интерфейса, благодаря которым уменьшается размер файла приложения и снижается потребление памяти, однако данные компоненты обладают более ограниченными возможностями по сравнению с набором компонентов пользовательского интерфейса платформы разработки Flex.

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

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

Набор компонентов пользовательского интерфейса платформы разработки Flex является частью платформы разработки Flex — внешней библиотеки классов, поставляемой вместе с приложением Adobe Flex Builder. Эта библиотека также доступна для бесплатной загрузки по адресу http://www. adobe. com/go/flex2_sdk. Набор компонентов графического интерфейса платформы разработки Flex разработан для построения приложений с относительно стандартными элементами управления пользовательского интерфейса (полосами прокрутки, раскрывающимися меню, таблицами данных и т. д.). Элементы интерфейса платформы разработки Flex обычно используются в приложениях MXML, но могут включаться и в приложения, разработанные в основном с использованием языка ActionScript. Подробности использования платформы разработки Flex в приложениях на языке ActionScript можно найти в гл. 30.

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

В приложении Flash Player 8 и более старых версиях язык ActionScript предоставлял следующие четыре основных строительных блока для создания и управления графическим содержимым.

? Клип — контейнер для графического содержимого, реализующий интерактивные возможности, простейшее рисование, иерархическое размещение элементов и анимационные возможности.

? Текстовое поле — прямоугольная область, содержащая отформатированный текст.

? Кнопка — элемент ввода, представляющий собой очень простую интерактивную кнопку.

? Растровое изображение (появилось в приложении Flash Player 8) — графическое изображение в растровом формате.

Перечисленные элементы остаются доступными в интерфейсе API отображения, однако представляющие их классы в языке ActionScript 3.0 (MovieClip, TextField, SimpleButton и Bitmap) были улучшены, переработаны и приобрели больше возможностей.

Обзор API отображения

В языке ActionScript все графическое содержимое создается и управляется с помощью классов интерфейса API отображения. Даже элементы интерфейса платформы разработки Flex и среды разработки Flash используют интерфейс API отображения в качестве графической основы. Многие классы API отображения непосредственно представляют конкретный тип графического содержимого, выводимого на экран. Например, класс Bitmap представляет растровые изображения, класс Sprite — интерактивную графику, а класс TextField — отформатированный текст.

При обсуждении мы будем называть классы, которые непосредственно представляют отображаемое на экране содержимое (и суперклассы этих классов), базовыми классами отображения. Остальные классы API отображения определяют вспомогательную графическую информацию и функциональность, но сами не представляют содержимое на экране. Например, классы CapStyle и JointStyle определяют константы, представляющие настройки для рисования линий, в то время как классы Graphics и BitmapData задают множество примитивных операций рисования. Мы будем называть такие классы, не отображающие информацию на

экране, вспомогательными классами отображения. Большинство базовых и вспомогательных классов API отображения находятся в пакете flash. display.

Базовые классы отображения, представленные на рис. 20.1, образуют иерархию, которая отражает три базовых уровня функциональности: отображение, пользовательскую интерактивность и содержание. Соответственно тремя важнейшими классами API отображения являются: DisplayObject, InteractiveObject и DisplayObjectContainer. Непосредственно создать экземпляры этих классов невозможно, однако они определяют абстрактную функциональность, которая реализуется различными конкретными подклассами.

Как уже говорилось в гл. 6, ActionScript 3.0 не поддерживает настоящие абстрактные классы. Поэтому на рис. 20.1 классы DisplayObject, InteractiveObj ect и DisplayOb j ectContainer показаны не как абстрактные классы, а как классы абстрактного типа. Тем не менее, несмотря на эту техническую деталь, для краткости в оставшейся части этой главы мы будет использовать термин «абстрактный» при описании архитектурной роли, которую играют классы DisplayObject, InteractiveObject и DisplayObjectContainer.

I 1 Конкретный класс

отображения | | Содержимое, доступное

Рис. 20.1. Иерархия базовых классов отображения

Класс DisplayOb j ect — корневой элемент в иерархии базовых классов отображения, он определяет первый уровень графической функциональности API отображения — вывод на экран. Все классы, унаследованные от DisplayOb j ect, получают общий набор основных графических характеристик и возможностей. Например, для любого потомка класса DisplayOb j ect можно изменить его позицию, размеры и угол поворота с помощью переменных х, у, width, height и rotation. Класс

DisplayOb j ect — это не просто базовый класс; это источник многих расширенных возможностей в API отображения, включая следующие, но не ограничиваясь ими:

? преобразование координат (ознакомьтесь с описанием методов экземпляра localToGlobal ( ) и globalToLocal ( ) класса DisplayOb j ect в справочнике по языку ActionScript корпорации Adobe);

? определение пересечений между объектами и точками (ознакомьтесь с описанием методов экземпляра hitTestObject ( ) и hitTestPoint ( ) класса DisplayOb j ect в справочнике по языку ActionScript);

? применение фильтров, трансформаций и масок (ознакомьтесь с описанием переменных экземпляра filters, transform и mask класса DisplayObject в справочнике по языку ActionScript);

? непропорциональное изменение масштаба для «растягиваемых» графических элементов (ознакомьтесь с описанием переменной экземпляра scale 9gr id класса DisplayOb j ect в справочнике по языку ActionScript корпорации Adobe).

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

Обратите внимание, что иногда в этой книге используется неофициальный термин «отображаемый объект», который обозначает любой экземпляр класса, унаследованного от класса DisplayOb j ect.

Конкретные непосредственные подклассы класса DisplayOb j ect — Video, Bitmap, Shape, MorphShape и StaticText — представляют простейший тип отображаемого содержимого: базовую графику, выводимую на экран, которая не может получать вводимые данные или содержать другое вложенное графическое содержимое. Класс Video представляет потоковое видео. Класс Bitmap визуализирует растровые изображения, созданные и управляемые вспомогательным классом BitmapData. Класс Shape предоставляет простой, облегченный холст для векторного рисования. Специальные классы MorphShape и StaticText представляют соответственно фигуры с преобразуемой формой и статический текст, созданные в среде разработки Flash. Ни класс MorphShape, ни класс StaticText не могут быть созданы на языке ActionScript.

Единственный абстрактный подкласс InteractiveObj ect класса DisplayOb j ect образует второй уровень функциональности в API отображения — интерактивность. Все унаследованные от него классы получают возможность отвечать на события ввода от мыши и клавиатуры пользователя.

Конкретные непосредственные подклассы TextField и SimpleButton класса InteractiveObj ect представляют два различных типа интерактивного графического содержимого. Класс TextField представляет прямоугольную область для отображения отформатированного текста и получения вводимых пользователем данных. Класс SimpleButton представляет символы Button (Кнопка), создаваемые в среде разработки Flash, а также позволяет быстро создавать интерактивные кнопки из кода на языке ActionScript. Обрабатывая события ввода, передаваемые классами TextField или SimpleButton, программист может добавлять интерактивность в приложение. Например, экземпляр класса TextField может быть запрограммирован так, чтобы в ответ на событие FocusEvent. FOCUS IN изменялся цвет фона этого экземпляра, а экземпляр класса S impleBut t on может быть запрограммирован так, чтобы в ответ на событие MouseEvent. CLICK форма отправлялась на сервер.

Абстрактный подкласс DisplayOb j ectContainer класса InteractiveObj ect представляет основу третьего и последнего функционального уровня в API отображения — содержание. Все унаследованные от него классы получают возможность содержать любой другой экземпляр класса DisplayOb j ect.

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

При описании объектов в иерархии отображения в этой книге применяется стандартная терминология для описания древовидных структур. Например, объект, который содержит другой объект в иерархии отображения, называется родителем этого объекта, а содержащийся объект называется ребенком этого родителя. В многоуровневой иерархии отображения объекты, расположенные выше данного объекта в иерархии, называются предками этого объекта. С другой стороны, объекты, расположенные ниже данного объекта в иерархии, называются потомками этого объекта. Наконец, объект самого верхнего уровня в иерархии (объект, потомками которого являются все остальные объекты) называется корневым объектом.

Не путайте объекты-предки и объекты-потомки в иерархии отображения с классами-предками и классами-потомками в иерархии наследования. Для ясности в этой книге иногда используются термины «предки отображения» и «потомки отображения» для описания объектов-предков и объектов-потомков в иерархии отображения.

Каждый из подклассов класса DisplayOb j ectContainer — Sprite, MovieClip, Stage и Loader — обеспечивает уникальный тип пустой содержащей структуры, ожидающей заполнения содержимым. Класс Sprite — это важнейший элемент среди классов-контейнеров. Являясь потомком классов InteractiveObj ect и DisplayOb j ectContainer, класс Sprite предоставляет отличную основу для построения собственных элементов пользовательского интерфейса с нуля. Класс MovieClip — это расширенный тип класса Sprite, представляющий анимиро-ванное содержимое, которое было создано в среде разработки Flash. Класс Stage представляет основную область отображения (видимую область внутри границ окна приложения) среды выполнения Flash. Наконец, класс Loader используется для загрузки внешнего графического содержимого из локального источника или через Интернет.

_

До появления языка ActionScript 3.0 класс MovieClip использовался как универсальный графический контейнер (подобно использованию класса Sprite в языке ActionScript 3.0). — С появлением версии 3.0 ActionScript класс MovieClip применяется только для управления

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

сто этого любое графическое содержимое, создаваемое программным путем, должно являться экземпляром одного из подходящих базовых классов отображения (Bitmap, Shape, Sprite, TextField и т. д.).

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

Расширение иерархии базовых классов отображения. Хотя в большинстве случаев базовые классы отображения могут эффективно использоваться без внесения каких-либо изменений, большинство нетривиальных программ расширяют функциональность базовых классов отображения, создавая подклассы для собственных целей. Например, программа, рисующая геометрические фигуры, может определить классы Ellipse, Rectangle и Triangle, расширяющие класс Shape. Подобным образом, в приложении для просмотра новостей может быть определен класс Heading, который расширяет класс TextField, а в гоночной игре может быть определен класс Саг, который расширяет класс Sprite. На самом деле элементы пользовательского интерфейса в платформе разработки Flex являются потомками класса Sprite. В последующих главах мы увидим множество примеров пользовательских классов отображения. По мере изучения базовых классов отображения задумайтесь о том, как можно расширить их функциональность. Зачастую программисты на языке ActionScript расширяют и улучшают базовые классы отображения с помощью собственного кода. Дополнительную информацию можно найти далее, в разд. «Пользовательские графические классы».

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

Список отображения

Как уже говорилось, базовые классы отображения представляют типы графического содержимого, доступного в языке ActionScript. Чтобы создать реальную графику из этих теоретических типов, мы создаем экземпляры базовых классов отображения, а затем добавляем эти экземпляры в список отображения. Список отображения — это иерархия всех графических объектов, отображаемых средой выполнения Flash в настоящий момент. Когда отображаемый объект добавляется в список отображения и помещается в видимую область, среда Flash визуализирует содержимое этого объекта на экране.

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

отображаемой графики; переменная scaleMode задает способ масштабирования графики при изменении размеров области отображения; переменная f rameRate определяет текущую предпочтительную скорость (кадров в секунду) для всех анимационных роликов. Как будет рассказано в этой главе, обращение к экземпляру класса Stage всегда осуществляется через некоторый объект в списке отображения с помощью переменной экземпляра stage класса DisplayObject. Например, если output txt — экземпляр класса TextField, который в настоящий момент находится в списке отображения, обратиться к экземпляру класса Stage можно выражением output_txt. stage.

До появления языка ActionScript 3.0 класс Stage не содержал объекты из списка отображения. Более того, ко всем его методам и переменным можно было обращаться непосредственно через сам класс, как показано в следующем коде:

trace(Stage. align);

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

Access of possibly undefined property ‘align’ through a reference with static type ‘Class’

На русском языке она будет звучать так: Обращение к возможно неопределенному свойству ‘align’ через ссылку на статический класс ‘Class’.

Чтобы избежать появления этой ошибки, обращайтесь к экземпляру класса Stage с помощью следующего подхода:

t race(некийОтображаемыйОбъект. stage. align):

Здесь некийОтображаемыйОбъект — это объект, который в настоящий момент находится в списке отображения. Архитектура класса Stage в языке ActionScript 3.0 позволяет в будущем иметь несколько экземпляров класса Stage, а также вносит вклад в систему безопасности приложения Flash Player (поскольку неавторизованные объекты, загруженные из внешних источников, не имеют глобальной точки для обращения к экземпляру класса Stage).

На рис. 20.2 представлено состояние списка отображения для пустой среды выполнения Flash до момента открытия SWF-файла. Левая часть рисунка демонстрирует символическое представление среды выполнения Flash, а правая часть — соответствующую иерархию списка отображения. Когда среда Flash пуста, иерархия списка отображения содержит всего один элемент (единственный экземпляр класса Stage). Но скоро появятся другие элементы!

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

^ I Напомним, что основной класс SWF-файла должен быть унаследован либо от класса Sprite, м$ а « тбо от класса MovieClip, каждый из которых является потомком класса DisplayObject. 4 _3л4 Методики определения основного класса SWF-файла рассматриваются в гл. 7.

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

Проигрыватель Flash

Список отображения

Экземпляр класса Stage

Экземпляр класса Stage

1

Рис. 20.2. Список отображения для пустой среды выполнения Flash

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

$4

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

Рассмотрим пример, который демонстрирует, как создается владелец сцены. Предположим, мы запустили автономную версию приложения Flash Player и открыли файл с именем GreetingApp. swf, основным классом которого является GreetingApp. Если файл GreetingApp. swf содержит только этот класс и класс GreetingApp не создает никакой графики, то список отображения приложения Flash Player будет включать всего два элемента: экземпляр класса Stage и экземпляр класса GreetingApp (содержащийся в экземпляре класса Stage). Это показано на рис. 20.3.

Проигрыватель Flash

Список отображения

Экземпляр класса Stage

Экземпляр класса GreetingApp файла GreetingApp. swf

Экземпляр класса Stage

Экземпляр класса GreetingApp файла GreetingApp. swf

Рис. 20.3. Список отображения для файла GreetingApp. swf

Как только экземпляр основного класса SWF-файла будет добавлен в экземпляр класса Stage, программа сможет добавлять новое содержимое на экран в такой последовательности.

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

1. Создать отображаемый объект (то есть экземпляр любого базового класса отображения или любого класса, который расширяет базовый класс отображения).

2. Вызвать метод экземпляра addChild ( ) класса DisplayOb j ectContainer либо над экземпляром класса Stage, либо над экземпляром основного класса и передать в метод addChild ( ) отображаемый объект, созданный на шаге 1.

Попробуем выполнить вышеописанные общие шаги, создав класс GreetingApp, а затем добавив прямоугольник, круг и текстовое поле в список отображения с помощью метода addChild ( ). Сначала приведем основу класса GreetingApp:

package { import flash. display.*: import flash. text. TextField:

public class GreetingApp extends Sprite { public function GreetingApp ( ) { }

}

}

В нашем классе GreetingApp будут использованы классы Shape и Sprite, поэтому мы импортируем целиком весь пакет flash. display, который содержит эти классы. Подобным образом в классе GreetingApp будет использован класс TextField, поэтому мы импортируем пакет flash. text. TextField.

Обратите внимание на то, что класс GreetingApp по необходимости расширяет класс Sprite. GreetingApp должен расширять либо класс Sprite, либо класс MovieClip, поскольку он является основным классом программы.

| В языке ActionScript 3.0 основной класс SWF-файла должен расширять либо класс Sprite, нг л «, ли6° класс MovieClip, либо их любой подкласс.

1 -

Когда основной класс представляет корневую временную шкалу FLA-файла, он должен расширять класс MovieClip. Во всех остальных случаях основной класс должен расширять класс Sprite. В нашем примере класс GreetingApp расширяет класс Sprite, поскольку он не ассоциирован с FLA-файлом. В результате компиляции этого класса должно получиться автономное приложение ActionScript.

Теперь создадим прямоугольник и круг в методе-конструкторе класса Gr ее t ingApp. И прямоугольник, и круг мы нарисуем внутри одного объекта Shape. Объекты Shape (и все графические объекты) создаются с помощью оператора new, как и объекты любого другого типа. Вот код, который используется для создания нового объекта Shape:

new ShapeC )

Безусловно, в дальнейшем нам придется обращаться к этому объекту, чтобы нарисовать в нем элементы, поэтому присвоим его переменной rectAndCircle: var rectAndCircle-.Shape = new ShapeC );

Для рисования векторов в языке ActionScript применяется вспомогательный класс отображения Graphics. Каждый объект Shape хранит свой собственный экземп-

ляр класса Graphics в переменной экземпляра graphics. Таким образом, чтобы нарисовать прямоугольник и круг внутри нашего объекта Shape, мы вызываем соответствующие методы над объектом rectAndCircle. graphics. Вот этот код:

// Задаем толщину линии, равную одному пикселу rectAndCi rclе. graphi cs.1i neStyle(1):

// Рисуем синий прямоугольник

rectAndCi rcle. graphics. beginFi11(OxOOOOFF, 1):

rectAndCircle. graphics. drawRect(125. 0. 150. 75):

// Рисуем красный круг

rectAndCi rcle. graphics. begi nFi11(OxFFOOOO, 1); rectAndCircle. graphics. drawCircle(50. 100. 50):

*\ -’-

I Дополнительную информацию о вектррном рисовании в языке ActionScript 3.0 можно м& найти в гл. 25.

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

Операции векторного рисования не ограничиваются классом Shape. Класс Sprite также предоставляет ссылку на объект Graphics через свою переменную экземпляра graphics, поэтому, чтобы нарисовать прямоугольник и круг, вместо объекта Shape мы могли бы создать объект Sprite. Тем не менее, поскольку для хранения объекта Sprite требуется больше памяти, чем для объекта Shape, лучше использовать объект Shape при создании векторной графики, не содержащей дочерних объектов и для которой не требуется интерактивности.

Строго говоря, если бы мы хотели добиться минимального расходования памяти в примере приложения GreetingApp, мы бы рисовали наши фигуры непосредственно внутри экземпляра класса GreetingApp (помните, что класс GreetingApp расширяет класс Sprite, поэтому он поддерживает векторное рисование). Наш код выглядел бы следующим образом:

package { import flash. display.*: public class GreetingApp extends Sprite { public function GreetingApp ( ) { graphics. lineStyle(l):

// Прямоугольник

graphics. beginFill(OxOOOOFF. 1): graphics. drawRect(125. 0. 150. 75):

// Круг

graphi cs. begi nFi11(OxFFOOOO. 1); graphics. drawCircle(50. 100. 50):

}

}

}

Этот код успешно рисует прямоугольник и круг на экране, но данный подход менее гибок, чем подход с помещением фигур в отдельный объект Shape. Помещение

рисунков в объект Shape позволяет переносить их, размещать по слоям, модифицировать и удалять независимо от остального графического содержимого в приложении. Например, возвращаясь к нашему предыдущему подходу с рисованием в экземпляре класса Shape (rectAndCircle), для перемещения фигур в новую позицию мы могли бы использовать следующий код:

// Перемещаем объект rectAndCircle вправо на 125 пикселов // и вниз на 100 пискелов rectAndCirclе. х = 125: rectAndCirclе. у = 100:

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

Обратите внимание, что предыдущее позиционирование объекта rectAndCircle осуществляется до того, как этот объект будет помещен в список отображения! Каждый отображаемый объект сохраняет свое собственное состояние, независимо от родителя, с которым он связан, — фактически независимо от того, добавлен объект в список отображения или нет. Когда объект rectAndCircle будет добавлен в контейнер отображения, он будет автоматически помещен в позицию (125; 100) координатного пространства этого контейнера. Если в дальнейшем объект rectAndCircle будет удален из этого контейнера и добавлен в другой контейнер, он будет помещен в позицию (125; 100) координатного пространства нового контейнера.

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

* л

^ I Любой отображаемый объект сохраняет свои характеристики при перемещении из одного л « контейнера в другой и даже при удалении из списка отображения.

—3tj_

Теперь наступает момент, которого мы с нетерпением ожидали. Чтобы отобразить фигуры на экране, мы вызываем метод addChild ( ) над экземпляром класса GreetingApp внутри конструктора GreetingApp и передаем в этот метод ссылку на экземпляр класса Shape, хранящуюся в переменной rectAndCircle.

// Отображаем объект rectAndCircle на экране, добавляя его // в список отображения addChi1d(rectAndCircle):

В результате приложение Flash Player добавляет объект rectAndCircle в список отображения в качестве ребенка экземпляра класса GreetingApp.

#^

I Как подкласс класса Sprite, класс GreetingApp является потомком класса DisplayObjectContainer

м? л* и, следовательно, наследует метод addChild() и возможность содержать детей. Чтобы

Щ вспомнить иерархию классов API отображения, вернитесь к рис. 20.1.

Отображение объектов на экране — это забавно! Проделаем это еще раз. Добавление следующего кода в конструктор класса GreetingApp приведет к отображению на экране текста «НеПо world»:

// Создаем объект TextField, который будет содержать некий текст var greeting_txt:TextField = new TextField( );

// Указываем отображаемый текст greeting_txt. text = «Hello world»;

// Задаем позицию объекта TextField greeting_txt. x = 200; greeting_txt. y = 300;

// Отображаем текст на экране, добавляя объект greeting_txt // в список отображения addCh i1d(greeti ng_txt);

Когда объект будет добавлен в контейнер отображения, обратиться к этому контейнеру можно будет через переменную экземпляра parent класса DisplayOb j ect. Например, в конструкторе класса GreetingApp следующее выражение является допустимой ссылкой на экземпляр класса GreetingApp:

greeti ng_txt. parent

Если отображаемый объект еще не был добавлен в список отображения, его переменная parent имеет значение null.



Полезные ссылки
Случайные записи
  • 24.07.2013">Обустройство пола в доме
  • 12.07.2011">На базе WordPress уже более чем 50 миллионов сайтов
  • 02.03.2011">Руководство по actionscript. часть 5, стр. 083
  • 02.03.2011">Руководство по actionscript. часть 5, стр. 089
  • 09.05.2010">Самоучитель по креативному веб-дизайну. Книга 1, стр.154
  • 10.05.2010">Самоучитель по креативному веб-дизайну. Книга 1, стр.61
  • 25.02.2011">Руководство по actionscript. часть 6, стр. 092
  • 10.03.2011">Руководство по actionscript. часть 4, стр. 027
  • 17.05.2010">Самоучитель по креативному веб-дизайну. Книга 2, стр.135
  • 03.06.2010">Самоучитель по креативному веб-дизайну. Книга 3, стр.85
  • 19.03.2011">Руководство по actionscript. часть 2, стр. 099
  • 01.03.2011">Руководство по actionscript. часть 5, стр. 119
  • 18.05.2010">Самоучитель по креативному веб-дизайну. Книга 2, стр.106
  • 23.01.2011">Руководство по actionscript. часть 1, стр. 052
  • 10.05.2010">Самоучитель по креативному веб-дизайну. Книга 1, стр.100
Опрос

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

View Results

Loading ... Loading ...