API Docs for: 最后更新日期:2014年8月25日
Google搜索   
Show:

File: display/LAnimation.js

/** @language japanese
 * 新しい LAnimation インスタンスを作成します。
 * LAnimation クラスは、スプライトシートでアニメーションをつくる。。
 * @class LAnimation
 * @extends LSprite
 * @constructor
 * @param {LSprite} layer LSprite オブジェクト。
 * @param {LBitmapData} data LBitmapData オブジェクト(スプライトシート),アニメーションのひとコマひとコマをひとつにまとめた画像ファイルです。
 * @param {Array} list <p>frameごとの属性。</p>
 * <p>フォーマットは{x : 0, y : 0, width : 100, height : 100, sx : 0, sy : 0}の通りです。 x, y, width, heightはLBitmapData オブジェクトの各属性の値です,sx, syはひとコマのアニメーションを表示する時の座標です。</p>
 * <p>もしスプライトシートのframeの大きさが全部同じであれば、LGlobal.divideCoordinate関数を使って画像を分割することができます。</p>
 * @example
 * 	LInit(50, "legend", 800, 480, main);
 * 	function main () {
 * 		var loader = new LLoader();
 * 		loader.addEventListener(LEvent.COMPLETE, loadBitmapdata); 
 * 		loader.load("player.png", "bitmapData");
 * 	}
 * 	function loadBitmapdata(event){
 * 		var backLayer = new LSprite();
 * 		addChild(backLayer);
 * 		var list = LGlobal.divideCoordinate(480,630,3,4);
 * 		var data = new LBitmapData(event.currentTarget,0,0,120,210);
 * 		player = new LAnimation(backLayer,data,list);
 * 		backLayer.addEventListener(LEvent.ENTER_FRAME,onframe);
 * 	}
 * 	function onframe(){
 * 		player.onframe();
 * 	}
 * @examplelink <p><a href="../../../api/LAnimation/index.html" target="_blank">実際のサンプルを見る</a></p>
 * @since 1.3.1
 * @public
 */
var LAnimation = (function () {
	function LAnimation(layer, data, list){
		var s = this;
		LExtends(s, LSprite, []);
		/** @language japanese
		 * オブジェクトのタイプ
		 * @property type
		 * @type String
		 * @default LAnimation
		 * @since 1.3.1
		 * @public
		 */
		s.type = "LAnimation";
		s.rowIndex = 0;
		s.colIndex = 0;
		s._ll_stepIndex = 0;
		s._ll_stepArray = [];
		s.mode = 1;
		s.isMirror = false;
		s.bitmap =  new LBitmap(data);
		s.imageArray = list;
		s.addChild(s.bitmap);
		if (layer != null) {
			layer.addChild(s);
		}
		s.onframe();
		s.colIndex = 0;
	}
	var p = {
		/** @language japanese
		 * 再生するフレームを設定します。
		 * @method setAction
		 * @param {int} rowIndex 行番号。
		 * @param {int} colIndex 列番号。
		 * @param {int} mode 下記の三つの値を設定することができます。(1,0,-1):(正シーケンス進める,ストップ,逆シーケンス進める)。
		 * @param {Boolean} isMirror 水平方向に反転するかどうか。
		 * @since 1.3.1
		 * @public
		 * @example
		 * 	LInit(200,"legend",800,450,main);
		 * 	var player;
		 * 	var player2;
		 * 	function main(){
		 * 		var loader = new LLoader();
		 * 		loader.addEventListener(LEvent.COMPLETE, loadBitmapdata); 
		 * 		loader.load("player.png", "bitmapData");
		 * 	}
		 * 	function loadBitmapdata(event){
		 * 		var backLayer = new LSprite();
		 * 		addChild(backLayer);
		 * 		var list = LGlobal.divideCoordinate(480,630,3,4);
		 * 		var data = new LBitmapData(event.currentTarget,0,0,120,210);
		 * 		player = new LAnimation(backLayer,data,list);
		 * 		player2 = new LAnimation(backLayer,data.clone(),list);
		 * 		player.setAction(2,0,1,true);
		 * 		player2.setAction(2,0,1,false);
		 * 		player2.x = 150;
		 * 		backLayer.addEventListener(LEvent.ENTER_FRAME,onframe);
		 * 	}
		 * 	function onframe(){
		 * 		player.onframe();
		 * 		player2.onframe();
		 * 	}
		 * @examplelink <p><a href="../../../api/LAnimation/setAction.html" target="_blank">実際のサンプルを見る</a></p>
		 */
		setAction : function (rowIndex, colIndex, mode, isMirror){
			var s = this, changed = false;
			if (rowIndex != null && rowIndex >= 0 && rowIndex < s.imageArray.length) {
				s.rowIndex = rowIndex;
				changed = true;
			}
			if (colIndex != null && colIndex >= 0 && colIndex < s.imageArray[rowIndex].length) {
				s.colIndex = colIndex;
				changed = true;
			}
			if (mode != null) {
				s.mode = mode;
				changed = true;
			}
			if (isMirror != null) {
				s.isMirror = isMirror;
				if (s.isMirror) {
					s.bitmap.x = s.bitmap.getWidth();
					s.bitmap.scaleX = -1 * Math.abs(s.bitmap.scaleX);
				}else{
					s.bitmap.x = 0;
					s.bitmap.scaleX = Math.abs(s.bitmap.scaleX);
				}
				changed = true;
			}
			if (changed) {
				s._ll_stepIndex = 0;
			}
		},
		/** @language japanese
		 * 今動いているフレームのプロパティを取得。
		 * @method getAction
		 * @return {Array} フレームのプロパティ:[rowIndex,colIndex,mode,isMirror]([行番号,列番号,(正|逆)モード,水平方向に反転するかどうか])。
		 * @since 1.3.1
		 * @public
		 * @example
		 * 	LInit(200,"legend",800,450,main);
		 * 	var player;
		 * 	function main(){
		 * 		var loader = new LLoader();
		 * 		loader.addEventListener(LEvent.COMPLETE, loadBitmapdata); 
		 * 		loader.load("player.png", "bitmapData");
		 * 	}
		 * 	function loadBitmapdata(event){
		 * 		var backLayer = new LSprite();
		 * 		addChild(backLayer);
		 * 		var list = LGlobal.divideCoordinate(480,630,3,4);
		 * 		var data = new LBitmapData(event.currentTarget,0,0,120,210);
		 * 		player = new LAnimation(backLayer,data,list);
		 * 		backLayer.addEventListener(LEvent.ENTER_FRAME,onframe);
		 * 	}
		 * 	function onframe(){
		 * 		player.onframe();
		 * 		var result = player.getAction();
		 * 		trace(result);	
		 * 	}
		 * @examplelink <p><a href="../../../api/LAnimation/getAction.html" target="_blank">実際のサンプルを見る</a></p>
		 */
		getAction : function () {
			var s = this;
			return [s.rowIndex, s.colIndex, s.mode, s.isMirror];
		},
		/** @language japanese
		 * 次のフレームのアニメーションを表示します。
		 * @method onframe
		 * @since 1.3.1
		 * @public
		 * @example
		 * 	LInit(200,"legend",800,450,main);
		 * 	var player;
		 * 	function main(){
		 * 		var loader = new LLoader();
		 * 		loader.addEventListener(LEvent.COMPLETE, loadBitmapdata); 
		 * 		loader.load("player.png", "bitmapData");
		 * 	}
		 * 	function loadBitmapdata(event){
		 * 		var backLayer = new LSprite();
		 * 		addChild(backLayer);
		 * 		var list = LGlobal.divideCoordinate(480,630,3,4);
		 * 		var data = new LBitmapData(event.currentTarget,0,0,120,210);
		 * 		player = new LAnimation(backLayer,data,list);
		 * 		backLayer.addEventListener(LEvent.ENTER_FRAME,onframe);
		 * 	}
		 * 	function onframe(){
		 * 		player.onframe();
		 * 	}
		 * @examplelink <p><a href="../../../api/LAnimation/onframe.html" target="_blank">実際のサンプルを見る</a></p>
		 */
		onframe : function (){
			var s = this, arr, stepFrame = null;
			if (s.colIndex >= s.imageArray[s.rowIndex].length) {
				s.colIndex = 0;
			}
			arr = s.imageArray[s.rowIndex][s.colIndex];
			if (s._ll_stepArray[s.rowIndex] && s._ll_stepArray[s.rowIndex][s.colIndex]) {
				stepFrame = s._ll_stepArray[s.rowIndex][s.colIndex];
			} else {
				stepFrame = 0;
			}
			if (s._ll_stepIndex == 0) {
				if (typeof arr.script == "function") {
					arr.script(s, arr.params);
				}
				if (typeof arr.width != UNDEFINED && typeof arr.height != UNDEFINED) {
					s.bitmap.bitmapData.setProperties(arr.x, arr.y, arr.width, arr.height);
				} else {
					s.bitmap.bitmapData.setCoordinate(arr.x, arr.y);
				}
				if (typeof arr.sx != UNDEFINED) {
					s.bitmap.x = arr.sx;
				}
				if (typeof arr.sy != UNDEFINED) {
					s.bitmap.y = arr.sy;
				}
			}
			if (s._ll_stepIndex++ < stepFrame) {
				return;
			}
			s._ll_stepIndex = 0;
			s.colIndex += s.mode;
			if (s.colIndex >= s.imageArray[s.rowIndex].length || s.colIndex < 0) {
				s.colIndex = s.mode > 0 ? 0 : s.imageArray[s.rowIndex].length - 1;
				s.dispatchEvent(LEvent.COMPLETE);
			}
		},
		/** @language japanese
		 * 新しい LAnimation オブジェクトとして、元のインスタンスのクローンを返します。オブジェクトはまったく同じコピーになります。
		 * @method clone
		 * @return {LAnimation} 元のオブジェクトと同一の新しい LAnimation オブジェクトです。
		 * @since 1.8.8
		 * @public
		 * @example
		 * 	LInit(200,"legend",800,450,main);
		 * 	var player;
		 * 	var player2;
		 * 	function main(){
		 * 		var loader = new LLoader();
		 * 		loader.addEventListener(LEvent.COMPLETE, loadBitmapdata);
		 * 		loader.load("player.png", "bitmapData");
		 * 	}
		 * 	function loadBitmapdata(event){
		 * 		var backLayer = new LSprite();
		 * 		addChild(backLayer);
		 * 		var list = LGlobal.divideCoordinate(480,630,3,4);
		 * 		var data = new LBitmapData(event.currentTarget,0,0,120,210);
		 * 		player = new LAnimation(backLayer,data,list);
		 * 		player2 = player.clone();
		 * 		player2.setAction(2,0);
		 * 		player2.x = 150;
		 * 		backLayer.addChild(player2);
		 * 		backLayer.addEventListener(LEvent.ENTER_FRAME,onframe);
		 * 	}
		 * 	function onframe(event){
		 * 		player.onframe();
		 * 		player2.onframe();
		 * 	}
		 * @examplelink <p><a href="../../../api/LAnimation/clone.html" target="_blank">実際のサンプルを見る</a></p>
		 */
		clone : function () {
			var s = this, a = new LAnimation(null, s.bitmap.bitmapData, s.imageArray.slice(0));
			a.copyProperty(s);
			a.childList.length = 0;
			a.bitmap = s.bitmap.clone();
			a.addChild(a.bitmap);
			return a;
		}
	};
	for (var k in p) {
		LAnimation.prototype[k] = p[k];
	}
	return LAnimation;
})();
/** @language japanese
 * アニメーションは最後のフレームを実行する時。
 * <p><a href="LEvent.html#property_COMPLETE">LEvent.COMPLETE</a></p>
 * @event LEvent.COMPLETE
 */