root/as3/Utils/src/org/libspark/utils/display/Sprite3DContainer.as

リビジョン 2337, 2.4 kB (コミッタ: yossy, コミット時期: 3 年 前)

Sprite3DContainer: zSort 機能つき Sprite

Line 
1 package org.libspark.utils.display
2 {
3         import flash.display.DisplayObject;
4         import flash.display.DisplayObjectContainer;
5         import flash.display.Sprite;
6        
7         public class Sprite3DContainer extends Sprite
8         {
9                 private var _children:Array = [];
10                
11                 override public function addChild(child:DisplayObject):DisplayObject
12                 {
13                         return addChildObject(super.addChild(child));
14                 }
15                
16                 override public function addChildAt(child:DisplayObject, index:int):DisplayObject
17                 {
18                         return addChildObject(super.addChildAt(child, index));
19                 }
20                
21                 override public function removeChild(child:DisplayObject):DisplayObject
22                 {
23                         return removeChildObject(super.removeChild(child));
24                 }
25                
26                 override public function removeChildAt(index:int):DisplayObject
27                 {
28                         return removeChildObject(super.removeChildAt(index));
29                 }
30                
31                 private function addChildObject(child:DisplayObject):DisplayObject
32                 {
33                         if (child != null) {
34                                 _children.push(new ChildObject(child));
35                         }
36                         return child;
37                 }
38                
39                 private function removeChildObject(child:DisplayObject):DisplayObject
40                 {
41                         var children:Array = _children;
42                         var l:uint = children.length;
43                         for (var i:int = 0; i < l; ++i) {
44                                 if ((children[i] as ChildObject).child == child) {
45                                         children.splice(i, 1);
46                                         --i;
47                                         --l;
48                                 }
49                         }
50                         return child;
51                 }
52                
53                 private function getRootParent():DisplayObjectContainer
54                 {
55                         var d:DisplayObjectContainer = this;
56                         while (d.parent != null) {
57                                 d = d.parent;
58                         }
59                         return d;
60                 }
61                
62                 public function zSort():void
63                 {
64                         var root:DisplayObjectContainer = getRootParent();
65                         var children:Array = _children;
66                         var l:uint = children.length;
67                         var i:uint = 0;
68                         for (i = 0; i < l; ++i) {
69                                 (children[i] as ChildObject).updateZ(root);
70                         }
71                        
72                         children.sortOn('z', Array.NUMERIC | Array.DESCENDING);
73                        
74                         for (i = 0; i < l; ++i) {
75                                 setChildIndex((children[i] as ChildObject).child, i);
76                         }
77                 }
78         }
79 }
80
81 import flash.display.DisplayObject;
82 import flash.display.DisplayObjectContainer;
83 import flash.geom.Matrix3D;
84
85 internal class ChildObject
86 {
87         public function ChildObject(child:DisplayObject)
88         {
89                 this.child = child;
90         }
91        
92         public var child:DisplayObject;
93         public var z:Number;
94        
95         public function updateZ(parent:DisplayObjectContainer):void
96         {
97                 var matrix:Matrix3D = child.transform.getRelativeMatrix3D(parent);
98                 if (matrix != null) {
99                         z = matrix.position.z;
100                 }
101         }
102 }
Note: リポジトリブラウザについてのヘルプは TracBrowser を参照してください。