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秒,而且是多次调用,完全超出了我们的控制范围,因此这部分需要多加注意.






  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值