Cocos2d-x游戏开发实战精解
上QQ阅读APP看书,第一时间看更新

6.3 定时器的注册与取消

在之前的内容中,介绍过使用定时器的方法,其中出现过如下方法:

scheduleUpdate();
schedule(schedule_selector(HelloWorld::myupdate),0.2f);

这便是在Cocos2d-x中注册一个定时器,在实际使用时往往还需要进行一些别的操作,比如说需要在定时器执行10次操作之后停止,那么显然就需要一个操作来取消定时器了。

新建一个项目命名为ChapterSix03,并在其中按照前两节的样式加入update和myupdate两个方法,并引入一个整形变量i,其中具体的实现如范例6-1所示。

【范例6-1】定时器的注册与取消。

01 bool HelloWorld::init()
02      {
03          if ( !Layer::init() )
04          {
05              return false;
06          }
07              i = 5;                                  //对变量i进行初始化
08              scheduleUpdate();                       //注册定时器,调用update
09              CCLOG("update startted!");              //输出提示信息
10          return true;
11      }
12      void HelloWorld::update(float dt)
13      {
14              if (i > 0)
15              {
16                      CCLOG("now the number i is %d",i);      //输出i
17                      i--;
18              }
19              else
20              {
21                      unscheduleUpdate();     //当i的值为0,取消定时器,不再调用update
22                      CCLOG("update ended!");
23                      schedule(schedule_selector(HelloWorld::myupdate), 0.2f);
                        //注册新的定时器
24                      CCLOG("myupdate startted!");
25              }
26      }
27      void HelloWorld::myupdate(float dt)
28      {
29              if (i < 5)
30              {
31                      i++;
32                      CCLOG("now the number i is %d", i);             //输出i
33              }
34              else
35              {
36                      unschedule(schedule_selector(HelloWorld::myupdate));
                        //取消定时器
37                      CCLOG("myupdate ended!");
38              }
39      }

运行程序后输出的内容如图6-4所示。

图6-4 运行程序后输出的内容

首先需要确定的是范例中第21、36行的代码,作用就是取消所对应的定时器。正如图6-4中所展示的那样,当定时器被取消之后,其对应的触发器便不会被调用,而且也可以看出,注册与取消触发器所使用的方法是一种一一对应的关系。

提示:也可能会有人同时注册多个触发器以达到类似多线程的效果,这当然可以,但无疑会给开发带来很大的难度。当注册了多个触发器时,可以使用unscheduleAllSelectors方法来取消正在发生作用的全部触发器。