我是定时器(第04章)—停止update和触发器
有时候我们并不想不断地执行一个函数,我们只希望在20秒后执行一个函数,然后就不执行了。比如,我们用微波炉烤西红柿,3分钟之后要叮地响一下,但是只要响一下就好了,不要每隔3分钟都响,那太烦人了!
(小若:西红柿?!为毛是西红柿?微波炉啊,烤西红柿?!= =)
笨木头花心贡献,啥?花心?不呢,是用心~
转载请注明,原文地址:http://blog.csdn.net/musicvs/article/details/8552045
正文:
1. 取消自定义update的调用
当我们想停止update调用的时候,可以这么做:
void HelloWorld::MutUpdate( float fDelta ) { CCLOG("MutUpdate"); this->unschedule(schedule_selector(HelloWorld::MutUpdate)); }
unschedule,顾名思义了,un一般是代表取消的意思。但是要注意一点,不管我们注册update函数的时候,用的是一个参数,还是两个参数,在取消的时候都是不需要传其他参数的,只要传递函数就OK了。
(小若:我总觉得,听你解释不如直接看代码。)
大家用调试模式运行项目,就会发现,日志只打印了一次。
2. 取消默认update的调用
如果是要取消默认的update函数调用,也很简单:
this->unscheduleUpdate();
取消和注册是对应的,从函数名称就可以看出来了,不唠叨了,我不太喜欢唠叨。
(小若:才怪啊!)
3. 更暴力的,取消全部update函数的调用
我们来试试一件好玩的事情,就是两种update函数一起注册:
bool HelloWorld::init() { bool bRet = false; do { CC_BREAK_IF(! CCLayer::init()); this->scheduleUpdate(); /* 指定每帧执行自定义的函数 */ this->schedule(schedule_selector(HelloWorld::MutUpdate)); bRet = true; } while (0); return bRet; }
我们把scheduleUpdate和schedule一起使用了,用调试模式运行项目试试,很有意思,我们将看到,它们都工作地很好:
update
MutUpdate
update
MutUpdate
update
MutUpdate
update
MutUpdate
如果想停止update调用呢?
(小若:分别调用它们的取消函数啊!)
说得好,但是这么做太笨了!
(小若:咕。。。)
我们只需要一行代码:
this->unscheduleAllSelectors();
相信不用我解释了,调用这个函数之后所有的update函数都不会被调用。
4. 触发器
好了,说了这么多,我的西红柿要烤焦了!
(小若:叮啊!你不是说它会叮一下吗!)
OK,我们来让它叮一下,就一下,不多不少。
bool HelloWorld::init() { bool bRet = false; do { CC_BREAK_IF(! CCLayer::init()); /* 指定若干秒后执行一次函数 */ this->scheduleOnce(schedule_selector(HelloWorld::MutUpdate), 5.0f); bRet = true; } while (0); return bRet; }
scheduleOnce,顾名思义,once,只执行一次,第二个参数是延迟时间,单位是秒。表示多少秒之后开始执行这个函数,并且只执行一次。
OK,调试模式运行项目,5秒后我们将看到一条输出:
MutUpdate
并且只有一条,不会多。
好喇,关于定时器的教程结束了~旁白出来清下场,各位按秩序离开。
(小若:我才不会配合你发神经。。。)
(小若:各位一个接一个走,小心台阶。。。)