上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方法来取消正在发生作用的全部触发器。