В ActionScript 3.0 отсутствуют отдельные классы для различных типов экранных объектов. В ActionScript 1.0 и 2.0 многие из однотипных объектов включены в один и тот же класс MovieClip.
Обособление классов и иерархической структуры списков отображения имеет следующие преимущества:
-
более эффективная визуализация и пониженные требования к памяти;
-
Усовершенствованное управление глубиной
-
Полный обход списка отображения
-
Экранные объекты, не вошедшие в список
-
Упрощенное распределение экранных объектов по подклассам
Более эффективная визуализация и файлы меньшего размера
В ActionScript 1.0 и 2.0 рисовать фигуры можно только в объекте MovieClip. В ActionScript 3.0 существуют более простые классы экранных объектов, в которых можно рисовать фигуры. Поскольку эти классы экранных объектов ActionScript 3.0 не включают полный набор методов и свойств, которые содержит объект MovieClip, они используют меньше ресурсов процессора и памяти.
Например, любой объект MovieClip включает свойства для временной шкалы фрагмента ролика, тогда как объект Shape не включает их. Свойства, относящиеся к управлению временной шкалой, могут требовать много ресурсов процессора и памяти. В ActionScript 3.0 использование объекта Shape приводит к повышению производительности. Объект Shape имеет меньше служебных данных, чем сложный объект MovieClip. Flash Player и AIR не требуется оперировать неиспользованными свойствами объекта MovieClip. Это повышает скорость его обработки и снижает объем используемой памяти.
Усовершенствованное управление глубиной
В ActionScript 1.0 и 2.0 глубина регулировалась с помощью линейной схемы и таких методов, как
getNextHighestDepth()
.
ActionScript 3.0 включает класс DisplayObjectContainer, который обладает более удобными методами и свойствами для управления глубиной экранных объектов.
В ActionScript 3.0 при перемещении экранного объекта на новое положение в списке дочерних объектов экземпляра DisplayObjectContainer другие дочерние объекты в контейнере экранного объекта автоматически смещаются. Им присваиваются соответствующие позиции в указателе дочерних объектов, относящемся к контейнеру экранного объекта.
Также в ActionScript 3.0 всегда можно обнаружить все дочерние объекты любого контейнера экранного объекта. Каждый экземпляр DisplayObjectContainer обладает свойством
numChildren
, в котором перечислено количество дочерних элементов в контейнере экранного объекта. И поскольку список дочерних объектов контейнера экранных объектов всегда является индексированным, вы можете изучить любой объект в списке, начиная с позиции указателя 0 до последней позиции (
numChildren - 1
). Это было невозможно сделать с помощью методов и свойств объекта MovieClip в ActionScript 1.0 и 2.0.
В ActionScript 3.0 можно легко выполнить последовательный обход списка отображения; номера в указателе списка дочерних объектов для контейнера экранного объекта идут один за другим. Обход списка отображения и управление глубиной объектов сильно упрощены по сравнению с ActionScript 1.0 и 2.0. В ActionScript 1.0 и 2.0 фрагмент ролика мог содержать объекты с перемежающимися разрывами в порядке глубины, которые могут усложнить обход списка объекта. В ActionScript 3.0 каждый список дочерних объектов контейнера экранного объекта кэшируется внутри в качестве массива, что приводит к резкому ускорению поиска по указателю. Циклический просмотр всех дочерних объектов контейнера экранного объекта также происходит очень быстро.
В ActionScript 3.0 дочерние объекты можно также вызвать в контейнере экранного объекта путем использования метода
getChildByName()
класса DisplayObjectContainer.
Полный обход списка отображения
В ActionScript 1.0 и 2.0 некоторые объекты (например, векторные фигуры, отрисованные в инструменте разработки Flash) вызвать невозможно. В ActionScript 3.0 все объекты в списке отображения доступны (как объекты, созданные с помощью ActionScript, так и все объекты, созданные в инструменте разработки Flash. Дополнительные сведения см. в разделе «
Обход списка отображения
».
Экранные объекты, не вошедшие в список
В ActionScript 3.0 можно создавать экранные объекты, которые не находятся в выводимом на экран списке отображения. Они называются экранными объектами,
не вошедшими в список
. Экранный объект добавляется в видимый список отображения только при вызове метода
addChild()
или
addChildAt()
экземпляра DisplayObjectContainer, который уже был добавлен в список отображения.
Экранные объекты, не входящие в список, можно использовать для сборки сложных экранных объектов (например, объектов, имеющих ряд контейнеров экранных объектов, в которых содержится несколько экранных объектов). Не внося экранные объекты в список, можно собирать сложные объекты без затрат времени обработки при визуализации этих экранных объектов. После этого можно добавить экранный объект, который входит в список отображения, когда необходимо. Кроме того, можно переместить дочерний объект контейнера экранного объекта в список отображения, выбрав любую позицию списка отображения по желанию.
Упрощенное распределение экранных объектов по подклассам
В ActionScript 1.0 и 2.0 часто приходилось добавлять новые объекты MovieClip в SWF-файл, чтобы создать основные фигуры или показать растровые изображения. В ActionScript 3.0 класс DisplayObject содержит многие встроенные подклассы, включая Shape и Bitmap. Поскольку классы в ActionScript 3.0 больше специализируются на конкретных типах объектов, легче создавать базовые подклассы на основе встроенных классов.
Например, чтобы нарисовать круг в ActionScript 2.0, можно было бы создать класс CustomCircle, который является расширением класса MovieClip при создании экземпляра объекта, принадлежащего к заказному классу. Однако этот класс будет также включать ряд свойств и методов из класса MovieClip (например,
totalFrames
), которые к нему не относятся. Однако в ActionScript 3.0 можно создать класс CustomCircle, который является расширением объекта Shape, и в качестве такового не включает несвязанные свойства и методы, которые содержатся в классе MovieClip. Следующий код является примером класса CustomCircle:
import flash.display.*;
public class CustomCircle extends Shape
{
var xPos:Number;
var yPos:Number;
var radius:Number;
var color:uint;
public function CustomCircle(xInput:Number,
yInput:Number,
rInput:Number,
colorInput:uint)
{
xPos = xInput;
yPos = yInput;
radius = rInput;
color = colorInput;
this.graphics.beginFill(color);
this.graphics.drawCircle(xPos, yPos, radius);
}
}
|
|
|