Преимущества подхода с использованием списка отображенияFlash Player 9 и более поздних версий, Adobe AIR 1.0 и более поздних версий В 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); } } |
|