欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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);//移除循环触发器