package creatures.parts { import flash.display.Sprite; import flash.geom.Matrix; import flash.geom.Point; public class Plane extends Sprite { private var reference:Matrix; private var _location:Point; private var _transformMatrix:Matrix; private var appendages:Array = new Array(); public function get location():Point { return _location.clone(); } public function set location(p:Point):void { _location = p.clone(); } public function get transformMatrix():Matrix { return _transformMatrix; } public function get depth():Number { return _transformMatrix.ty; } public function Plane(reference:Matrix, location:Point = null) { this.reference = reference; _transformMatrix = this.reference.clone(); _location = (location) ? location.clone() : new Point(0, 0); } public function addAppendage(appendage:Appendage):void { appendages.push(appendage); appendage.plane = this; addChild(appendage); } public function updateTransform(spin:Matrix):void { var offset:Point = spin.transformPoint(location); _transformMatrix = reference.clone(); _transformMatrix.tx = offset.x; _transformMatrix.ty = offset.y; } public function arrange():void { var direction:int = (_transformMatrix.b < 0) ? Array.DESCENDING : 0; appendages.sortOn("depth", Array.NUMERIC | direction); var i:int = appendages.length; while(i--){ if (getChildAt(i) != appendages[i]) { addChildAt(appendages[i], i); } } } } }