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

File: utils/LTimer.js

/** @language chinese
 * <p>LTimer 类是计时器的接口,它使您能按指定的时间序列运行代码。使用 start() 方法来启动计时器。为 timer 事件添加事件侦听器,以便将代码设置为按计时器间隔运行。</p>
 * <p>可以创建 LTimer 对象以运行一次或按指定间隔重复运行,从而按计划执行代码。根据 帧速率或运行时环境(可用内存和其他因素),运行时调度事件的间隔可能稍有不同。例如,如果设置为以每秒 10 帧 (fps)(也就是 100 毫秒的间隔)的速度播放,但计时器设置为在 80 毫秒时触发事件,则将按接近于 100 毫秒的间隔触发事件。大量耗费内存的脚本也可能使事件发生偏差。</p>
 * @class LTimer
 * @extends LEventDispatcher
 * @constructor
 * @param {float} delay 计时器事件间的延迟(以毫秒为单位)。建议 delay 不要低于 20 毫秒。计时器频率不得超过 60 帧/秒,这意味着低于 16.6 毫秒的延迟可导致出现运行时问题。
 * @param {int} repeatCount 指定重复次数。如果为零,则计时器将持续不断重复运行,最长可运行 24.86 天 (int.MAX_VALUE + 1)。如果不为 0,则将运行计时器,运行次数为指定的次数,然后停止。
 * @since 1.9.11
 * @example
 * 	LInit(50, "legend", 800, 480, main);
 * 	function main () {
 * 		LGlobal.setDebug(true);
 * 		var myTimer = new LTimer(1000, 2);
 * 		myTimer.addEventListener(LTimerEvent.TIMER, timerHandler);
 * 		myTimer.start();
 * 	}
 * 	function timerHandler(e){
 * 		trace("timerHandler: " + e);
 * 	}
 * @examplelink <p><a href="../../../api/LTimerEvent/index.html" target="_blank">测试链接</a></p>
 * @public
 */
var LTimer = (function () {
	function LTimer(delay, repeat) {
		var s = this;
		LExtends (s, LEventDispatcher, []);
		s.type = "LTimer";
		/** @language chinese
		 * <p>计时器事件间的延迟(以毫秒为单位)。如果在计时器正在运行时设置延迟间隔,则计时器将按相同的 repeatCount 迭代重新启动。</p>
		 * <p>注意:建议 delay 不要低于 20 毫秒。计时器频率不得超过 60 帧/秒,这意味着低于 16.6 毫秒的延迟可导致出现运行时问题。</p>
		 * @property delay
		 * @type int
		 * @since 1.9.11
		 * @public
		 */
		s.delay = delay;
		/** @language chinese
		 * <p>设置的计时器运行总次数。如果重复计数设置为 0,则计时器将持续不断运行,最长可运行 24.86 天,或直至调用了 stop() 方法或节目停止。如果重复计数不为 0,则将运行计时器,运行次数为指定的次数。如果设置的 repeatCount 总数等于或小于 currentCount,则计时器将停止并且不会再次触发。</p>
		 * @property repeatCount
		 * @type int
		 * @since 1.9.11
		 * @public
		 */
		s.repeatCount = repeat ? repeat : Number.MAX_VALUE;
		/** @language chinese
		 * <p>计时器的当前状态;如果计时器正在运行,则为 true,否则为 false。</p>
		 * @property running
		 * @type Boolean
		 * @since 1.9.11
		 * @public
		 */
		s.running = false;
		/** @language chinese
		 * <p>计时器从 0 开始后触发的总次数。如果已重置了计时器,则只会计入重置后的触发次数。</p>
		 * @property currentCount
		 * @type int
		 * @since 1.9.11
		 * @public
		 */
		s.currentCount = 0;
		s.reset();
		LTimer.TimerManager.add(s);
	}
	LTimer.TimerManager = (function(){
		function TimerManager(){
			this.childList = [];
		}
		TimerManager.prototype = {
			ll_show : function(){
				var s = this, d;
				for(var i = 0;i<s.childList.length;i++){
					d = s.childList[i];
					if(d){
						d.ll_show();
					}
				}
			},
			add : function(child){
				this.childList.push(child);
			},
			remove : function(d){
				var s  = this, c = s.childList, i, l;
				for (i = 0, l = c.length; i < l; i++) {
					if (d.objectIndex == c[i].objectIndex) {
						s.childList.splice(i, 1);
						break;
					}
				}
			}
		};
		return new TimerManager();
	})();
	p = {
		/** @language chinese
		 * 如果计时器尚未运行,则启动计时器。
		 * @method start
		 * @since 1.9.11
		 * @public
		 */
		start : function(){
			this.running = true;
		},
		/** @language chinese
		 * 停止计时器。如果在调用 stop() 后调用 start(),则将继续运行计时器实例,运行次数为剩余的 重复次数(由 repeatCount 属性设置)。
		 * @method stop
		 * @since 1.9.11
		 * @public
		 */
		stop : function(){
			this.running = false;
		},
		/** @language chinese
		 * 如果计时器正在运行,则停止计时器,并将 currentCount 属性设回为 0,这类似于秒表的重置按钮。然后,在调用 start() 后,将运行计时器实例,运行次数为指定的重复次数(由 repeatCount 值设置)。
		 * @method reset
		 * @since 1.9.11
		 * @public
		 */
		reset : function(){
			var s = this;
			s.currentTime = 0;
			s.currentCount = 0;
			s.stop();
		},
		/** @language chinese
		 * 释放计时器,计时器释放后将不可以再次使用。
		 * @method destroy
		 * @since 1.9.11
		 * @public
		 */
		destroy : function(){
			LTimer.TimerManager.remove(this);
		},
		ll_show : function(){
			var s = this;
			if(!s.running || s.currentCount >= s.repeatCount){
				return;
			}
			s.currentTime += LGlobal.speed;
			if (s.currentTime < s.delay) {
				return;
			}
			s.currentTime = 0;
			s.currentCount++;
			s.dispatchEvent(LTimerEvent.TIMER);
			if(s.currentCount >= s.repeatCount){
				s.dispatchEvent(LTimerEvent.TIMER_COMPLETE);
			}
		}
	};
	for (var k in p) {
		LTimer.prototype[k] = p[k];
	}
	LGlobal.childList.push(LTimer.TimerManager);
	return LTimer;
})();
/** @language chinese
 * 每当 LTimer 对象达到根据 LTimer.delay 属性指定的间隔时调度。
 * <p><a href="LTimerEvent.html#property_TIMER">LTimerEvent.TIMER</a></p>
 * @event LTimerEvent.TIMER
 */
/** @language chinese
 * 每当它完成 LTimer.repeatCount 设置的请求数后调度。
 * <p><a href="LTimerEvent.html#property_TIMER_COMPLETE">LTimerEvent.TIMER_COMPLETE</a></p>
 * @event LTimerEvent.TIMER_COMPLETE
 */