Egret 学习(四)—— 时间控制:帧事件 和 Timer
程序员文章站
2024-03-16 15:13:04
...
在游戏开发中,时常会遇到需要在帧函数中循环调用的情况。如完成动画或者特定计算等。实现方法有两种:注册帧事件监听ENTER_FRAME和调用startTick全局函数。监听ENTER_FRAME将会按照帧频进行回调,而startTick一般以60帧回调
帧事件
- ENTER_FRAME事件:将在进入新的一帧开始时回调,它的回调速率跟帧率有关。用addEventListener函数注册监听,用removeEventListener来移除监听。
private timeOnEnterFrame:number=0; private initFrame():void { this.addEventListener(egret.Event.ENTER_FRAME,this.Update,this); this.timeOnEnterFrame=egret.getTimer(); } private Update(e:egret.Event) { let now=egret.getTimer(); let time=this.timeOnEnterFrame; let pass=now-time; this.show.text="OnEnterFrame:"+(1000/pass).toFixed(5); this.timeOnEnterFrame=egret.getTimer(); }
- startTick(停止对应stopTick)全局函数将以60帧速率回调函数,需要注意的是startTick函数的第一个参数是它的回调函数,但是要求有返回值,返回值为true将在回调函数执行完成之后立即重绘,为false则不会重绘,另一个参数是this对象,通常传入this即可
private time:number=0; private initFrame():void { this.time=egret.getTimer(); egret.startTick(this.tickUpdate,this); } private tickUpdate(timeStamp:number):boolean { let now=timeStamp; let time=this.time; let pass=now-time; this.show.text="startTick:"+(1000/pass).toFixed(5); this.time=now; return false; }
Timer计时器
-
Timer的使用方法很简单,两个属性delay与repeatCount,计时器的间隔时间(以毫秒为单位)和计时器重复的次数,如果repeatCount为0表示一直循环执行;
-
通过start()、reset()、stop()函数控制计时器的启动,重计和停止
-
TimerEvent.TIMER 启动计时事件(调用次数由repeatCount确定)和 TimerEvent.TIMER_COMPLETE ,计时结束事件只调用一次
private timerInit() { var timer:egret.Timer=new egret.Timer(1000,10); timer.addEventListener(egret.TimerEvent.TIMER,this.onTimerStart,this); timer.addEventListener(egret.TimerEvent.TIMER_COMPLETE,this.onTimerComplete,this); timer.start(); } private onTimerStart() { this.show.text="启动计时器:"; this.num++; this.show.text="this.num = "+this.num; } private onTimerComplete() { this.show.text="计时结束"; }
全局计时器
Egret提供了全局函数setTimout()延时函数,以及循环触发函数setInterval();但是因为是全局的,因此需要在界面关闭时取消掉
var timeOut=egret.setTimeout(this.onTimerComplete,this,300);//延时300毫秒触发
var inter=egret.setInterval(this.onTimerStart,this,30);//隔30毫秒触发一次
egret.clearTimeout(timeOut);//移除定时触发器
egret.clearInterval(inter);//移除循环触发器