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

File: display/LAnimationTimeline.js

/** @language chinese
 * 创建一个新的 LAnimationTimeline 实例。
 * LAnimationTimeline类在LAnimation 类的基础上提供了很多扩展。LAnimation 类需要调用本身的onframe函数才能播放动画,而LAnimationTimeline类则不需要。
 * @class LAnimationTimeline
 * @extends LAnimation
 * @constructor
 * @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>*如果需要直接给对象设定label,可以给元素设定label属性,设定label属性时候,可以同时设定isMirror属性。</p>
 * <p>*也可以给元素设定mirror(true或者false)属性,设定mirror属性的时候需要同时给所有元素设定mirror属性,如果元素和label同时设定了mirror属性,则优先使用元素中设定的mirror属性。</p>
 * <p>如果精灵图表中的每个frame大小都是的,你可以使用LGlobal.divideCoordinate函数来直接对图表进行分割。</p>
 * @example
 * 	LInit(50, "legend", 800, 480, main);
 * 	var imgData = [
 * 		{name : "player-0", path : "./player-0.png"}, 
 * 		{name : "player-1", path : "./player-1.png"}, 
 * 		{name : "player-2", path : "./player-2.png"}, 
 * 		{name : "player-3", path : "./player-3.png"}, 
 * 		{name : "player-4", path : "./player-4.png"}
 * 	];
 * 	function main () {
 * 		LLoadManage.load(imgData, null, gameInit);
 * 	}
 * 	function gameInit(result) {
 * 		var list = LGlobal.divideCoordinate(480, 210, 1, 4);
 * 		var data = new LBitmapData(result["player-0"], 0, 0, 120, 210);
 * 		var playerLeft = new LAnimationTimeline(data, list);
 * 		addChild(playerLeft);
 * 		
 * 		var datas = [];
 * 		var listChild = [];
 * 		for (var i = 0; i < 4; i++) {
 * 			datas.push(new LBitmapData(result["player-" + (i + 1)]));
 * 			listChild.push({dataIndex : i, x : 0, y : 0, width : 120, height : 210, sx : 0, sy : 0});
 * 		}
 * 		var playerRight = new LAnimationTimeline(datas, [listChild]);
 * 		playerRight.x = 200;
 * 		addChild(playerRight);
 * 	}
 * @examplelink <p><a href="../../../api/LAnimationTimeline/index.html" target="_blank">测试链接</a></p>
 * @since 1.8.0
 * @public
 */
var LAnimationTimeline = (function() {
	function LAnimationTimeline(data, list) {
		var s = this;
		LExtends(s, LAnimation, [null, data, list]);
		/** @language chinese
		 * 对象的类型
		 * @property type
		 * @type String
		 * @default LAnimationTimeline
		 * @since 1.8.0
		 * @public
		 */
		s.type = "LAnimationTimeline";
		/** @language chinese
		 * 动画播放速度
		 * @property speed
		 * @type int
		 * @default 0
		 * @since 1.8.0
		 * @example
		 * 	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);
		 * 		var player = new LAnimationTimeline(data,list);
		 * 		player.speed = 10;
		 * 		backLayer.addChild(player);
		 * 		var player2 = new LAnimationTimeline(data.clone(),list);
		 * 		player2.speed = 5;
		 * 		player2.x = 150;
		 * 		backLayer.addChild(player2);
		 * 	}
		 * @examplelink <p><a href="../../../api/LAnimationTimeline/speed.html" target="_blank">测试链接</a></p>
		 * @public
		 */
		s.speed = 0;
		s._speedIndex = 0;
		s.ll_labelList = {};
		for (var i = 0, sublist, j, child; i < list.length; i++) {
			sublist = list[i];
			for ( j = 0; j < sublist.length; j++) {
				child = sublist[j];
				if (child.label) {
					s.setLabel(child.label, i, j, 1, child.isMirror ? true : false);
				}
			}
		}
		s.addEventListener(LEvent.ENTER_FRAME, s._ll_onframe);
	};
	var p = {
		/** @language chinese
		 * 返回一个LAnimationTimeline的克隆对象。
		 * @method clone
		 * @return {LAnimationTimeline} 一个新的 LAnimationTimeline 对象,它与原始对象相同.
		 * @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/LAnimationTimeline/clone.html" target="_blank">测试链接</a></p>
		 */
		clone : function() {
			var s = this, k, o, a = new s.constructor(s.bitmapList, s.imageArray.slice(0));
			a.copyProperty(s);
			a.childList.length = 0;
			a.bitmap = s.bitmap.clone();
			a.addChild(a.bitmap);
			for (k in s.ll_labelList) {
				o = s.ll_labelList[k];
				a.ll_labelList[k] = {
					rowIndex : o.rowIndex,
					colIndex : o.colIndex,
					mode : o.mode,
					isMirror : o.isMirror
				};
			}
			return a;
		},
		setFrameSpeedAt : function(rowIndex, colIndex, speed) {
			var s = this;
			if (!s._ll_stepArray[rowIndex]) {
				s._ll_stepArray[rowIndex] = [];
			}
			s._ll_stepArray[rowIndex][colIndex] = speed;
		},
		_ll_onframe : function(event) {
			var self = event.target;
			if (self._ll_stop) {
				return;
			}
			if (self._speedIndex++ < self.speed) {
				return;
			}
			if(self._send_complete){
				self.dispatchEvent(LEvent.COMPLETE);
				self._send_complete = false;
				if (self._ll_stop) {
					return;
				}
			}
			self._speedIndex = 0;
			self.onframe();
		},
		/** @language chinese
		 * 在LAnimationTimeline实例的时间轴中设置标签。
		 * @method setLabel
		 * @param {String} name 标签名称.
		 * @param {int} rowIndex 行号.
		 * @param {int} colIndex 列号.
		 * @param {int} mode (1,0,-1)分别代表(正序播放,静止,倒序播放)。
		 * @param {Boolean} isMirror 是否使用镜像来水平翻转显示对象。
		 * @since 1.8.0
		 * @public
		 * @example
		 * 	LInit(200,"legend",800,450,main);
		 * 	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);
		 * 		var player = new LAnimationTimeline(backLayer,data,list);
		 * 		player.setLabel("right",2,0,1,true);
		 * 		backLayer.addChild(player);
		 * 		player.gotoAndPlay("right");
		 * 	}
		 * @examplelink <p><a href="../../../api/LAnimationTimeline/setLabel.html" target="_blank">测试链接</a></p>
		 */
		setLabel : function(name, _rowIndex, _colIndex, _mode, _isMirror) {
			this.ll_labelList[name] = {
				rowIndex : _rowIndex,
				colIndex : _colIndex,
				mode : (typeof _mode == UNDEFINED ? 1 : _mode),
				isMirror : (typeof _isMirror == UNDEFINED ? false : _isMirror)
			};
		},
		/** @language chinese
		 * 开始播放 LAnimationTimeline 动画。
		 * @method play
		 * @since 1.8.0
		 * @public
		 * @example
		 * 	LInit(200,"legend",800,450,main);
		 * 	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);
		 * 		var player = new LAnimationTimeline(backLayer,data,list);
		 * 		player.setLabel("right",2,0,1,true);
		 * 		backLayer.addChild(player);
		 * 		player.gotoAndPlay("right");
		 * 	}
		 * @examplelink <p><a href="../../../api/LAnimationTimeline/play_stop.html" target="_blank">测试链接</a></p>
		 */
		play : function() {
			this._ll_stop = false;
		},
		/** @language chinese
		 * 停止播放 LAnimationTimeline 动画。
		 * @method stop
		 * @since 1.8.0
		 * @public
		 * @example
		 * 	LInit(200,"legend",800,450,main);
		 * 	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);
		 * 		var player = new LAnimationTimeline(backLayer,data,list);
		 * 		player.setLabel("right",2,0,1,true);
		 * 		backLayer.addChild(player);
		 * 		player.gotoAndPlay("right");
		 * 	}
		 * @examplelink <p><a href="../../../api/LAnimationTimeline/play_stop.html" target="_blank">测试链接</a></p>
		 */
		stop : function() {
			this._ll_stop = true;
		},
		/** @language chinese
		 * 从指定标签开始播放 LAnimationTimeline 动画。
		 * @method gotoAndPlay
		 * @param {String} label 表示播放头转到的帧标签的字符串。
		 * @since 1.8.0
		 * @public
		 * @example
		 * 	LInit(200,"legend",800,450,main);
		 * 	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);
		 * 		var player = new LAnimationTimeline(backLayer,data,list);
		 * 		player.setLabel("right",2,0,1,true);
		 * 		backLayer.addChild(player);
		 * 		player.gotoAndPlay("right");
		 * 	}
		 * @examplelink <p><a href="../../../api/LAnimationTimeline/gotoAndPlay.html" target="_blank">测试链接</a></p>
		 */
		gotoAndPlay : function(name) {
			var s = this, l = s.ll_labelList[name];
			s.setAction(l.rowIndex, l.colIndex, l.mode, l.isMirror);
			s.play();
			s.onframe();
		},
		/** @language chinese
		 * 将播放头移到影片剪辑的指定标签并停在那里。
		 * @method gotoAndStop
		 * @param {String} label 表示播放头转到的帧标签的字符串。
		 * @since 1.8.0
		 * @public
		 * @example
		 * 	LInit(200,"legend",800,450,main);
		 * 	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);
		 * 		var player = new LAnimationTimeline(backLayer,data,list);
		 * 		player.setLabel("right",2,0,1,true);
		 * 		backLayer.addChild(player);
		 * 		player.gotoAndStop("right");
		 * 	}
		 * @examplelink <p><a href="../../../api/LAnimationTimeline/gotoAndStop.html" target="_blank">测试链接</a></p>
		 */
		gotoAndStop : function(name) {
			var s = this, l = s.ll_labelList[name];
			s.setAction(l.rowIndex, l.colIndex, l.mode, l.isMirror);
			s.stop();
			s.onframe();
		},
		/** @language chinese
		 * 向指定标签位置添加执行脚本。
		 * @method addFrameScript
		 * @param {String} label 指定标签。
		 * @param {Function} func 动画到达指定标签位置时要执行的函数。
		 * @param {Array} params 执行函数时的参数。
		 * @since 1.8.0
		 * @public
		 * @example
		 * 	LInit(200,"legend",800,450,main);
		 * 	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);
		 * 		var player = new LAnimationTimeline(backLayer,data,list);
		 * 		player.setLabel("right",2,0,1,true);
		 * 		player.addFrameScript("right",scriptTest,["testParams1","testParams2"]);
		 * 		backLayer.addChild(player);
		 * 		player.gotoAndPlay("right");
		 * 	}
		 * 	function scriptTest(param1,param2){
		 * 		trace("scriptTest Run : " + param1 + "," + param2);
		 * 	}
		 * @examplelink <p><a href="../../../api/LAnimationTimeline/addFrameScript.html" target="_blank">测试链接</a></p>
		 */
		addFrameScript : function(name, func, params) {
			var l = this.ll_labelList[name];
			var arr = this.imageArray[l.rowIndex][l.colIndex];
			if (!arr.script) {
				arr.script = [];
			}
			arr.script.push({func : func, params : params, name : name});
		},
		/** @language chinese
		 * 删除指定标签位置的执行脚本。
		 * @method removeFrameScript
		 * @param {String} label 指定标签。
		 * @since 1.8.0
		 * @public
		 * @example
		 * 	LInit(200,"legend",800,450,main);
		 * 	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);
		 * 		var player = new LAnimationTimeline(backLayer,data,list);
		 * 		player.setLabel("right",2,0,1,true);
		 * 		player.addFrameScript("right",scriptTest,["testParams1","testParams2"]);
		 * 		backLayer.addChild(player);
		 * 		player.gotoAndPlay("right");
		 * 	}
		 * 	function scriptTest(param1,param2){
		 * 		trace("scriptTest Run : " + param1 + "," + param2);
		 * 	}
		 * @examplelink <p><a href="../../../api/LAnimationTimeline/removeFrameScript.html" target="_blank">测试链接</a></p>
		 */
		removeFrameScript : function(name) {
			var l = this.ll_labelList[name], obj, script, i;
			script = this.imageArray[l.rowIndex][l.colIndex].script;
			if (!script) {
				return;
			}
			for(i = 0; i < script.length; i++){
				obj = script[i];
				if(obj.name == name){
					script.splice(i, 1);
					break;
				}
			}
		}
	};
	for (var k in p) {
		LAnimationTimeline.prototype[k] = p[k];
	}
	return LAnimationTimeline;
})();