package creatures { import flash.display.Sprite; import flash.events.Event; import flash.geom.Matrix; import flash.geom.Point; import creatures.parts.*; public class Skeleton extends Sprite { protected var body:Sprite = new Sprite(); protected var planes:Array = new Array(); protected var appendages:Array = new Array(); protected var rotationMatrix:Matrix = new Matrix(); protected var _angle:Number = 0; public function get angle():Number { return _angle; } public function set angle(n:Number):void { _angle = n; } public function get location():Point { return new Point(x, y); } public function set location(p:Point):void { x = p.x; y = p.y; } public function Skeleton() { addChild(body); } public function clone():Skeleton { var copy:Skeleton = new Skeleton(); return copy; } protected function definePlane(plane:Plane):Plane { planes.push(plane); body.addChild(plane); return plane; } protected function defineAppendage(appendage:Appendage, plane:Plane):Appendage { appendages.push(appendage); plane.addAppendage(appendage); return appendage; } public function setAnimation(animation:SkeletonAnimation):SkeletonAnimation { // remove existing animations var appendage:Appendage; for each (appendage in appendages) { appendage.setAnimation(null); } // add animations from passed SkeletonAnimation var anims:Object = animation.segmentAnimations; var props:SkeletonAnimationProperties; var id:String; for (id in anims) { // if this skeleton contains an appendage named after the id appendage = this.hasOwnProperty(id) ? this[id] as Appendage : null; if (appendage) { props = anims[id]; appendage.setAnimation(props.segmentAnimation, props.animationOffset); } } return animation; } public function draw():void { updatePlanes(); renderAppendages(); } /** * updatePlanes * override for each additional rotated, vertical plane (side, front, angles in between) */ protected function updatePlanes():void { var x:Number = Math.cos(angle); var y:Number = Math.sin(angle); rotationMatrix.a = x; rotationMatrix.b = y/2; rotationMatrix.c = -y; rotationMatrix.d = x/2; var plane:Plane; for each(plane in planes) { plane.updateTransform(rotationMatrix); } } protected function renderAppendages():void { var appendage:Appendage; for each(appendage in appendages) { appendage.animate(); appendage.updateTransform(); appendage.draw(); } arrange(); } protected function arrange():void { planes.sortOn("depth", Array.NUMERIC); var i:int = planes.length; while(i--){ if (body.getChildAt(i) != planes[i]) { body.addChildAt(planes[i], i); } planes[i].arrange(); } } } }