Приветствую Вас Гость | RSS

Flash. Обо всем по маленьку

Вторник, 23.12.2025, 06:43
Главная » Статьи » Уроки ActionScript

Урок 7-4. Динамические объекты отображения
Когда вы создавали динамические клипы в ActionScript 2, в основном у вас было 3 варианта: вы могли скопировать существующий на экране клип, используя метод duplicateMovieClip(), вы могли создать пустой клип с рабочей области с помощью метода createEmptyMovieClip(), или вы могли создать экземпляр символа клипа внутри своей библиотеки через метод attachMovie().

В ActionScript 3 все гораздо проще. Все что вам нужно сделать для получения динамического клипа, это создать его новый экземпляр, как экземпляр любого другого класса, используя ключевое слово new. Для получения новых пустых экземпляров MovieClip вы просто используете new MovieClip(), или лучше new Sprite(), так как пустым экземплярам MovieClip не могут быть даны новые кадры (а Sprite просто представляет собой MovieClip без кадров).

// Create a new, dynamic, off-list Sprite
var mySprite:Sprite = new Sprite();

Так как объекты отображения в ActionScript 3 могут существовать за пределами экрана (таблицы отображения), создание в такой манере нового динамического экземпляра не означает, что новый экземпляр будет виден на экране. Прежде, чем он станет видимым, его нужно добавить в активную таблицу отображения. Чтобы проделать это, нужно воспользоваться одним из двух методов: метод addChild(), добавляет объект отображения в конец таблицы отображения, или метод addChildAt(), который добавляет объект отображения в определенное место внутри таблицы отображения.

// Create a new, dynamic, Sprite and add
// it to the current timeline's display list
// (ActionScript 3 equivalent to createEmptyMovieClip)
var mySprite:Sprite = new Sprite();
addChild(mySprite);

Тем не менее, новые экземпляры Sprite по умолчанию не содержат контента. Даже несмотря на то, что в приведенном выше примере, Sprite помещается на экран, он не может быть виден, так как в нем ничего нет. Вероятнее всего, во флеш вы можете захотеть динамически создать экземпляр символа клипа в своей FLA библиотеке. Прежде чем вы сможете создать экземпляр клипа, существующего в вашей библиотеке в качестве символа, сперва вам понадобится дать этому символу имя класса внутри диалога Linkage (Связь) (щелкните правой кнопкой мыши, или Command, на этом символе и выберите Linkage…) для этого символа.

В диалоге Linkage имеются чекбоксы, предоставляющие некоторые опции для символа. Под Linkage имеются две главные опции, Export for ActionScript (Экспорт в ActionScript) и Import for runtime sharing. Import for runtime sharing позволяет загрузить символы из внешних SWF файлов. Для динамических клипов нужно использовать Export for ActionScript. Дополнительные опции, относящиеся к Export for ActionScript, включают опцию Export for runtime sharing, которая относится к Import for runtime sharing, и Export in first frame (Экспортировать в первый кадр), которая гарантирует, что ваш SWF файл загрузит этот клип во флеш плеер прежде любого из ваших скриптов в кадрах, делая его доступным для динамического создания в любое время.

Как только выбрана опция Export for ActionScript, в диалоге Linkage появляются два текстовых поля, Class (Класс) и Base class (Базовый класс). Поле Class – наиболее важное поле для создания динамических экземпляров клипов из вашей библиотеки. Оно необходимо для того, чтобы уникальным образом отождествлять символ с классом (который будет автоматически генерироваться для вас вне сцен), так чтобы он мог быть создан с помощью ключевого слова new. Поле Base class распознает класс, наследником которого является символ. Так как вы работаете с символами клипа, обычно это будет MovieClip, значение по умолчанию. При работе с пользовательскими классами, вы можете решить назначить свой собственный класс в качестве Base class.

Рисунок: Привязка имени пользовательского класса к клипу в библиотеке

Как только для символа клипа определено имя класса, вы можете создать его экземпляр с помощью ключевого слова new, а затем добавить его в активную таблицу отображения, используя метод addChild или addChildAt. Назначенное вами имя класса представляет версию ActionScript 3 идентификатора связи ActionScript 2.

// Create a new, dynamic movie clip from the library
// and add it to the current timeline's display list
// (ActionScript 3 equivalent to attachMovie)
var myMovie:CustomMovieClass = new CustomMovieClass();
addChild(myMovie);

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

К сожалению, в ActionScript 3 не существует эквивалента методу duplicateMovieClip. Но в реальности она не является функцией, от которой бы во многом зависел флеш мир, начиная с появления attachMovie во Flash 5. Разработчикам ActionScript 3 пришлось обходиться без нее.

Растровые изображения

Растровые изображения являются другим типом медиа данных, который может существовать в вашей флеш библиотеке. Они тоже могут быть созданы и добавлены на экран динамически с помощью ActionScript 3. Тем не менее, изображения, так как они существуют в библиотеке, не транслируются напрямую на объекты отображения на экране, как это делают клипы. Вместо этого, изображения в библиотеке представляют экземпляры BitmapData (flash.display.BitmapData) в ActionScript. Чтобы быть видимыми на экране, эти данные должны быть переданы экземпляру Bitmap (flash.display.Bitmap).

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

Когда вы создаете новые экземпляры BitmapData с помощью ActionScript, требуется, чтобы для нового экземпляра поддерживались и ширина, и высота, так как он определяет размер для этого экземпляра. Так как изображения в вашей библиотеке основаны на классе BitmapData, то при создании новых экземпляров необходимо, чтобы для них была установлена ширина и высота. Тем не менее, изображения в вашей библиотеке уже имеют определенную ширину и высоту, поэтому значения, используемые при создании новых экземпляров растровых изображений вашей библиотеки, ничего не меняют. Если вы знаете размер изображения, то вам нужно его использовать; в противном случае, замечательно сработает 0.

После создания экземпляра изображения из вашей библиотеки, вам понадобится передать его экземпляру Bitmap, прежде чем он будет виден на экране. Это можно сделать через конструктор Bitmap, или установив свойство bitmapData экземпляра Bitmap. Этот экземпляр Bitmap нужно будет добавить в активную таблицу отображения прежде, чем он будет виден во флеш.

// Create an instance of a library bitmap
// given the Class name of MyImage
var imageData:MyImage = new MyImage(0, 0);

// Give the instance to a Bitmap through its
// constructor, then add it to the display list
var imageBmp:Bitmap = new Bitmap(imageData);
addChild(imageBmp);

Удаление

После появления объекта отображения на экране наступает время для его удаления, для чего вы можете воспользоваться одним из двух методов удаления, removeChild(), который удаляет определенный объект отображения из таблицы отображения, и removeChildAt(), который удаляет потомка из определенного места в таблице отображения.
 
// Add movie clip from the library to display list
var myMovie:CustomMovieClass = new CustomMovieClass();
addChild(myMovie);

// Remove movie clip from the library from display list
removeChild(myMovie);

В ActionScript 3 существуют два важных пункта относительно удаления объекта отображения:

  • Удаление осуществляется через родительский контейнер объекта отображения, а не потомка, как в случае с методом removeMovieClip() в ActionScript 2 (parentObject.removeChild(childObject) в противоположность childObject.removeMovieClip()).
  • Удаление объекта отображения из таблицы отображения не уничтожает объект отображения, или не удаляет его из памяти флеш. До тех пор, пока у вас имеется ссылка на него, он будет существовать за пределами таблицы отображения, даже если он не является потомком любой другой временной шкалы или контейнера.

Последний пункт особенно важен для ветеранов ActionScript 2, которые привыкли к тому, что ссылки на клип перестают  работать после удаления объекта с экрана. Это больше не действует в ActionScript 3, так как экземпляр остается действующим, правда за пределами таблицы отображения. Чтобы действительно избавиться от экземпляра объекта, нужно удалить все ссылки на него (если он динамический), либо установить его значение в null, просто как в случае с любым другим типом неотображаемого объекта в ActionScript.

Первый пункт также нельзя рассматривать как неважный. Это отражение того, как вам следует работать с ActionScript – начиная с внешней стороны, заглядывая внутрь, в противоположность нахождению во внутренней стороне, выглядывая наружу, что стало популярным подходом для многих разработчиков ActionScript 2, особенно команды, такие как removeMovieClip, которые работают из потомка, удаляющего самого себя из своего собственного родителя. В основном это означает, что при работе с клипами и временными шкалами, лучший способ заключается в написании кода не внутри клипа, ссылающегося на данные и методы, существующие за его пределами, а с оглядкой на клипы-потомки и позволяя родительским контейнерам заглядывать в эти клипы. Чем меньше любой клип, или временная шкала, зависит от объектов за его пределами, тем лучше.

Другие свойства и методы в дополнение к методам добавления и удаления, которые пригодятся при работе с клипами, включают методы и свойства из класса DisplayObjectContainer (flash.display.DisplayObjectContainer). Сюда входят:

numChildren
getChildAt
getChildByName
getChildIndex
setChildIndex
swapChildren
swapChildrenAt

Большинство говорят сами за себя. Для получения большей информации обратитесь к документации DisplayObjectContainer.

  • Заметка: Уменьшение количества ссылок на объекты отображения
  • Так как метод removeChild не удаляет объект отображения из памяти, только путем удаления всех ссылок вы можете ограничить обращения к динамическим объектам отображения, не создавая какого-либо из них. Вместо этого, вы можете использовать преимущество того, что метод addChild возвращает ссылку на добавленный объект отображения и использует ее для определения имени нового добавленного объекта (который может быть создан напрямую внутри вызова метода addChild). Затем, если вам понадобится обратиться к объекту отображения, вы можете использовать метод getChildByName.

  • // Minimize display object references
    addChild(new CustomMovieClass()).name = "myMovie";
    getChildByName("myMovie").x = 100;
  • Если никаких ссылок не делалось, то удаление потомка из его родителя приведет к его удалению из памяти (при условии, что он попадет в корзину; для получения большей информации по поводу работы корзины во флеш, смотрите статью Гранта Скиннера AS3: Resource Management).

Категория: Уроки ActionScript | Добавил: anti_k (25.02.2010)
Просмотров: 2521 | Рейтинг: 4.5/2
Всего комментариев: 0
Добавлять комментарии могут только зарегистрированные пользователи.
[ Регистрация | Вход ]