SpriteSheet制御メソッドを公開しました。 (AdobeAIR Flash
最近のFlashには「スプライトシートを生成」なる、いかにもスマフォのパフォーマンスが改善されそな右クリックメニューが存在しており、生成すれば勝手にロードしてくれるに違いないと思いきや、どうもそうではなさそうですね。。
ググっても実は即座に導入できるようなノウハウではなさそうだったので、3行で諸々完結する、簡易メソッドを公開しました。スプライトシート画像と、一緒に生成するjsonファイル内の座標+サイズ配列の2点さえあれば使えます。
sampleのfla … http://p.tl/zxbI
sampleのswf … http://p.tl/JZ_w
This is Adobe AIR& Flash's simple sprite sheet animation method.
import flash.display.BitmapData; import flash.display.Bitmap; import flash.geom.Rectangle; import flash.geom.Point; import flash.display.DisplayObjectContainer; import flash.system.System; //あらかじめ生成したスプライトシートを、ライブラリのリンケージで登録しておくのが早いと思う。 var spriteSheetBmd:BitmapData = new TestSprite(); //対応するjson内の、座標とサイズ配列。これはjsonからコピペか、生成メソッド別途必要かも。 var xywhArray:Array = [[0, 0, 255, 254], [0, 254, 255, 254]]; var ins = initSpriteSheet(this, spriteSheetBmd, xywhArray, false, true); //1秒後に開始テスト setTimeout(function():void{ ins.play(); }, 1000); //2秒後に停止テスト setTimeout(function():void{ ins.pause(); }, 2000); //3秒後に再開テスト setTimeout(function():void{ ins.play(); }, 3000); //4秒後に終了テスト setTimeout(function():void{ ins.remove(); }, 4000); //xywhArray = [[x, y, width, height],...] function initSpriteSheet(p:DisplayObjectContainer, spriteSheetBmd:BitmapData, xywhArray:Array, isPlay:Boolean=true, isLoop:Boolean=true, fps:int=60):Object{ var ins:Object = {}; var bmd:BitmapData; var bmp:Bitmap; var point:Point = new Point(); var animeID:int; var drawFuncArrayIndex:int = 0; const len:uint = xywhArray.length; const drawFuncArray:Vector.<Function> = new Vector.<Function>(len, true); init(); function init():void{ var i:uint; var maxW:Number = 0; var maxH:Number = 0; var a:Array; //最大サイズの取得 for(i=0; i<len; i++){ a = xywhArray[i]; if(maxW < a[2]){ maxW = a[2]; } if(maxH < a[3]){ maxH = a[3]; } } bmd = new BitmapData(maxW, maxH, true, 0); bmp = ins.bmp = new Bitmap(bmd); p.addChild(bmp); //各フレーム描画処理の設定 for(i=0; i<len; i++){ a = xywhArray[i]; setFunc(a, i); } function setFunc(a:Array, i:uint):void{ var rect:Rectangle = new Rectangle(a[0], a[1], a[2], a[3]); drawFuncArray[i] = function():void{ bmd.copyPixels(spriteSheetBmd, rect, point); }; } } ins.stop = function():void{ clearInterval(animeID); drawFuncArrayIndex=0; } ins.pause = function():void{ clearInterval(animeID); } ins.play = function():void{ clearInterval(animeID); animeID = setInterval(function():void{ next(); }, 1/fps*1000); function next():void{ drawFuncArray[drawFuncArrayIndex++](); if(drawFuncArray.length <= drawFuncArrayIndex){ if(!isLoop){ clearInterval(animeID); }else{ drawFuncArrayIndex = 0; } } } } ins.remove = function():void{ clearInterval(animeID); if(bmp.parent){ bmp.parent.removeChild(bmp); } bmd.dispose(); spriteSheetBmd.dispose(); } if(isPlay){ ins.play(); } return ins; }
使用したテクスチャシート