egret的timer使用总结
Posted _Unique_
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了egret的timer使用总结相关的知识,希望对你有一定的参考价值。
相信大家都知道,egret是一款H5游戏引擎,而且,随着手机性能的提高,H5游戏也逐渐多了起来,好多人在用这款引擎进行H5游戏开发,博主也尝试了一下,但是,在使用过程中,还是发现了有不如意的地方,其中之一,就是该引擎的一个总要部分——计时器,这部分一定要给后来者说明一下,最大的坑,就是这个Timer停不下来,相信好多小伙伴们已经发现了这个问题.
博主在自己的demo中想实现一个按钮的长按事件,当按下一个按钮的时候,就每隔0.3秒调用一个已经写好的方法,当手指从按钮上移除的时候,就取消长按事件,不再调用这个方法,在初始化方法中,创建计时器:
this.timer = new egret.Timer(300, 0);
this.timer.addEventListener(egret.TimerEvent.TIMER, this.timerCallFunc, this);
这里创建一个Timer,并设置了调用间隔事件为300毫秒,后面的0表示一直调用timer的回调方法,然后,是给timer添加事件,回调方法名叫做timerCallFunc.这里的设计思路是在按钮开始点击的事件TOUCH_BEGIN中,启动timer,然后,在TOUCH_END中,停止计时器,因此,添加事件监听方法:
this.button.addEventListener(egret.TouchEvent.TOUCH_BEGIN, this.begin, this);
this.button.addEventListener(egret.TouchEvent.TOUCH_END, this.end, this);
在begin方法中,调用this.timer.start();在end方法中调用this.timer.stop();于是乎,问题来了,当我TOUCH_END的时候,确实调用了end方法,这里是没问题的,也执行了timer的stop()方法,但是还是会每隔300毫秒执行一次timerCallFunc方法,这问题就严重了,要是我要实现一个功能,在游戏的商城中,设置一个按钮的长按事件,玩家长按按钮,就消耗金币,多次购买药水,然后,手指从按钮上移开之后,就不再购买,那如果出现上面的问题,当手指从按钮上面移开之后,玩家打开了其他的页面,结果后台一直在运行这个timer,那玩家的金币岂不是全都用没了,这就太坑人了.为了避免这个问题,一个简单的方法就是设置一个变量,用来标记是否调用回调函数.我们定义一个变量:
private flag:number = 0;
表示是否长按了这个按钮,0表示没有长按,1表示长按了,当我们点击按钮时,首先调用的是TOUCH_BEGIN的事件监听方法begin(),我们在begin中设置flag = 1;然后在TOUCH_END中设置flag = 0;同时,在timerCallFunc中判断flag的值,如果是1,才执行购买的操作,否则,直接return;这样就不会出现这样的问题了,由于timer的回调间隔是0.3秒,所以,当手指或者鼠标开始点击按钮的时候,过了0.3秒才会执行timerCallFunc,因此,不必担心是否进行的操作到底是不是长按.这里还有一个问题要指出,就是timer的初始化的方法一定不要写在按钮的TOUCH_BEGIN中,这样会出大问题:因为无法停掉timer,所以,每次点击一次开始按钮,都会重新创建一个timer,这样,点了多次之后,就要创建好多好多个timer,timerCallFunc就会多次被调用,就算我们设置了flag值,也是有问题的,当有多个timer同时调用一个方法的时候,只要长按按钮不松手,那么,flag == 1就成立,那么,这么多的timer都按照0.3秒的间隔调用这个回调方法,就会产生多次调用,而且,时间间隔会小于0.3秒,而且是多次调用,完全超出了我们的控制范围,因此这部分需要多加注意.
以上是关于egret的timer使用总结的主要内容,如果未能解决你的问题,请参考以下文章
Egret的TimerEvent.TIMER和Event.ENTER_FRAME的区别
Egret自定义计时器(决战沙城TimerManager和Laya.timer)