30
2015
01

(十二)倒计时

计时是游戏中经常用到的功能,尤其是倒计时。实际上计时器、倒计时原理都是一样的。

这里我们介绍两种计时方式,基于enterFrame的和基于setTimeout的。

1、先看基于enterFrame的倒计时。

enterFrame事件应该已经比较熟悉了,flash默认的帧频是24,也就是播放每一帧的时间是1/24秒,大约是40毫秒。当然我们能够改成自己认为合适的帧频。如果使用24帧,我们要实现按秒倒计时的话,只需要每24帧减1秒就可以了。

先看效果:

获得 Adobe Flash Player

实现代码如下:

  1. stop();

  2. var t:int=10;

  3. var f:int=stage.frameRate;//帧频,也可以直接写24(或者你设置的帧频)

  4. var n:int=0;

  5. tf.text=t+"";

  6. addEventListener(Event.ENTER_FRAME,enterFrameHandler);

  7. function enterFrameHandler(e:Event){

  8. n++;

  9. if(n>=f){

  10. n=0;

  11. t=t-1;

  12. tf.text=t+"";

  13. if(t==0){

  14. removeEventListener(Event.ENTER_FRAME,enterFrameHandler);

  15. tf.text="计时结束";

  16. }

  17. }

  18. }

  19. //实现重新计时

  20. btn.addEventListener(MouseEvent.CLICK,clickHandler);

  21. function clickHandler(e:MouseEvent){

  22. t=10;

  23. n=0;

  24. tf.text=t+"";

  25. addEventListener(Event.ENTER_FRAME,enterFrameHandler);

  26. }

其中tf是一个动态文本,btn是一个按钮。

计时实现:我们定义了一个变量t来记录时间(秒),初始设为10;定义变量n来计数;然后侦听enterFrame事件,每次让n加1,并判断n的值,当n等于24的时候,说明过了1秒,让t减1,把n重新设置成0,更新文本框的显示,同时判断t的值,如果t的值为0,计时结束,移除侦听。

重新计时实现:当点击按钮时,我们把t的值重新设置为10,把n的值设置为0,更新文本框的内容。然后启动侦听enterFrame事件。

注意:不需要侦听事件的时候,记得移除。addEventListener(Event.ENTER_FRAME,enterFrameHandler);这句代码,我们可以同时写好多遍,但是无论写多少遍,效果和写一个是一样的。

2、setTimeout倒计时

自帮助里搜一下setTimeout,官方说明如下:

在指定的延迟(以毫秒为单位)后运行指定的函数。参数解释的也很清楚,至少有两个参数,第一个是一个Function,第二个是一个数字。

如setTimeout(a,1000);表示1000毫秒之后执行函数a.

setTimeout实现的计时器如下:

获得 Adobe Flash Player

代码如下:

  1. stop();

  2. var t:int=10;

  3. var iterval:uint;

  4. tf.text=t+"";

  5. iterval=setTimeout(enterFrameHandler,1000);

  6. function enterFrameHandler(){

  7. t=t-1;

  8. tf.text=t+"";

  9. if(t==0){

  10. tf.text="计时结束";

  11. }

  12. else{

  13. iterval=setTimeout(enterFrameHandler,1000);

  14. }

  15. }

  16. btn.addEventListener(MouseEvent.CLICK,clickHandler);

  17. function clickHandler(e:MouseEvent){

  18. t=10;

  19. tf.text=t+"";

  20. clearTimeout(iterval);

  21. setTimeout(enterFrameHandler,1000);

  22. }

这个比较简单了,延时1000毫秒(1秒)执行函数enterFrameHandler,在enterFrameHandler里边,我们更新时间,然后判断t的值,如果t的值是0,显示结束计时,否则,再次用setTimeout延时1000毫秒执行enterFrameHandler。

需要注意的是setTimeout函数有返回值,uint类型的(就是非负整数),我们定义了一个变量了储存这个返回值,用于移除setTimeoout。比如本例中,当我们点击按钮,重新计时的时候,如果计时还没有结束,就需要取消之前设置的setTimeout延迟执行。这个一定要掌握。

也可以用setInterval来实现,setInterval和setTimeout类似,自己查一下帮助对比一下吧。

源码包中setTimeout的例子里边有setInterval实现的源码,注释了,可以拿来参考一下。


打包下载源码

« 上一篇下一篇 »

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。