読者です 読者をやめる 読者になる 読者になる

RetroWeb ~iPhoneとAndroidでハイブリッドゲームアプリ開発~

AIR for iOS+AndroidでSmartPhone Game ハイブリッドアプリ開発

最近作ったアプリ
100億本の抜け毛 100億匹のモナー DQ3闘技場アプリ モナーペット(進化)

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;
}

使用したテクスチャシート
f:id:hisashi_vc:20140224215001p:plain