package generator { import flash.display.*; import flash.geom.*; import frame.*; import job.*; import util.*; public class AnimatedSpriteGenerator implements IFramesSource { private var src:MovieClip; private var def:GraphicExportDef; private var sequences:Array = new Array(); // [[AnimatedSpriteFrame]] private var callback; public function GetFrames():Array { var ret:Array = []; for (var i in sequences) { ret = ret.concat(sequences[i].map(function(spriteFrame:AnimatedSpriteFrame, i, arr) { return spriteFrame.info; })); } return ret; } public function GetData() { return { scale:def.scale, sequences:sequences.map( function(s:Array, i, sArr) { return { frames: s.map( function(f:AnimatedSpriteFrame, i, fArr) { var r = {x:f.info.rect.x, y:f.info.rect.y, w:f.info.rect.width, h:f.info.rect.height}; var c = {x:f.offset.x, y:f.offset.y}; return {rect:r, center:c, resource:f.info.sheetIndex}; } ) }; } ) }; } public function AnimatedSpriteGenerator(src:MovieClip, def:GraphicExportDef) { this.src = src; this.def = def; } public function Go(callback) { this.callback = callback; for (var i = 0; i < src.totalFrames; i++) { Utils.WeirdGotoFrame(src, i + 1); Utils.RecursivelyStop(src); for (var j = 0; j < src.numChildren; j++) { var c = src.getChildAt(j); if (c is MovieClip) { sequences.push(GetAnimation(c, i)); break; } } } callback(true); } private function GetAnimation(m:MovieClip, seq:int):Array { var ret:Array = new Array(); for (var i = 0; i < m.totalFrames; i++) { Utils.WeirdGotoFrame(m, i + 1); Utils.RecursivelyStop(m); var bounds:Rectangle = Utils.GetAccurateBounds(m, new Matrix(def.scale, 0, 0, def.scale)); var frameBounds:Rectangle = new Rectangle(def.padding, def.padding, bounds.width, bounds.height); var drawMatrix:Matrix = new Matrix(def.scale, 0, 0, def.scale, -bounds.left + def.padding, -bounds.top + def.padding); var b:BitmapData = new BitmapData(bounds.width + def.padding * 2, bounds.height + def.padding * 2, true, 0x0); b.drawWithQuality(m, drawMatrix, null, null, frameBounds, false, StageQuality.BEST); var info:FrameInfo = new FrameInfo(b, drawMatrix, bounds); var frameInfo:AnimatedSpriteFrame = new AnimatedSpriteFrame(); frameInfo.info = info; frameInfo.sequence = seq; frameInfo.frame = i; frameInfo.offset = new Point(-bounds.left + def.padding, -bounds.right + def.padding); ret.push(frameInfo); } return ret; } } } class AnimatedSpriteFrame { import flash.display.*; import flash.geom.*; import frame.FrameInfo; public var info:FrameInfo; public var sequence:int = 0; public var frame:int = 0; public var offset:Point = new Point(); }