API Docs for: 1.10.1 最后更新日期:2016年03月28日
Google搜索   
Show:

File: display/LAnimation.js

/** @language chinese
 * 创建一个新的 LAnimation 实例。
 * LAnimation 类可以利用一组精灵图表来制作动画。
 * @class LAnimation
 * @extends LSprite
 * @constructor
 * @param {LSprite} layer 一个LSprite对象。
 * @param {LBitmapData | Array} data 一个LBitmapData对象,既包含一组或多组frame的精灵图表。或者是一个LBitmapData对象的数组。
 * @param {Array} list <p>每个frame的属性值。</p>
 * <p>每个数组元素格式为{x : 0, y : 0, width : 100, height : 100, sx : 0, sy : 0, dataIndex : 0}。 x, y, width, height分别对应LBitmapData对象的属性值,sx, sy是图像显示时的起始点坐标,当data是一个LBitmapData对象的数组的时候,dataIndex表示该数组的索引,用来指定使用哪个LBitmapData对象。</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.target,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 chinese
		 * 对象的类型
		 * @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;
		if (Array.isArray(data)) {
			s.bitmapList = data;
		} else {
			s.bitmapList = [data];
		}
		/** @language chinese
		 * 一个LBitmap对象,LAnimation对象用它来显示纹理图
		 * @property bitmap
		 * @type LBitmap
		 * @since 1.3.1
		 * @public
		 */
		s.bitmap = new LBitmap(s.bitmapList[0]);
		s.imageArray = list;
		s.addChild(s.bitmap);
		if (layer != null) {
			layer.addChild(s);
		}
		s.onframe();
		s.colIndex = 0;
	}
	var p = {
		/** @language chinese
		 * 设置播放的贞动画。
		 * @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.target,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;
				s._send_complete = false;
			}
		},
		/** @language chinese
		 * 获取当前播放的贞动画的属性。
		 * @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.target,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 chinese
		 * 播放下一贞动画。
		 * @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.target,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, sx = 0, 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.dataIndex == "number" && Array.isArray(s.bitmapList) && arr.dataIndex < s.bitmapList.length) {
					s.bitmap.bitmapData = s.bitmapList[arr.dataIndex];
				}
				if (arr.script) {
					for(i = 0; i < arr.script.length; i++){
						obj = arr.script[i];
						l = s.ll_labelList[obj.name];
						if(l && l.rowIndex == s.rowIndex && l.colIndex == s.colIndex && l.mode == s.mode && l.isMirror == (s.bitmap.scaleX == -1)){
							obj.func(s, obj.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) {
					sx = arr.sx;
				}
				if ( typeof arr.sy != UNDEFINED) {
					s.bitmap.y = arr.sy;
				}
				if ( typeof arr.mirror != UNDEFINED) {
					s.bitmap.rotateCenter = false;
					s.bitmap.scaleX = arr.mirror ? -1 : 1;
				}
				s.bitmap.x = sx + (s.bitmap.scaleX == 1 ? 0 : s.bitmap.getWidth());
			}
			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;
				if (s.constructor.name == "LAnimationTimeline") {
					s._send_complete = true;
				} else {
					s.dispatchEvent(LEvent.COMPLETE);
				}
			}
		},
		/** @language chinese
		 * 返回一个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.target,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 s.constructor(null, s.bitmapList, 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 chinese
 * 一组动画播放完成事件。
 * <p><a href="LEvent.html#property_COMPLETE">LEvent.COMPLETE</a></p>
 * @event LEvent.COMPLETE
 */