【笨木头原创专栏】我是定时器(第04章)—停止update和触发器

我是定时器(第04章)—停止update和触发器

有时候我们并不想不断地执行一个函数,我们只希望在20秒后执行一个函数,然后就不执行了。比如,我们用微波炉烤西红柿,3分钟之后要叮地响一下,但是只要响一下就好了,不要每隔3分钟都响,那太烦人了!

(小若:西红柿?!为毛是西红柿?微波炉啊,烤西红柿?!= =

 

 

笨木头花心贡献,啥?花心?不呢,是用心~转载请注明,原文地址http://www.benmutou.com/blog/archives/58

正文:

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;
}

我们把scheduleUpdateschedule一起使用了,用调试模式运行项目试试,很有意思,我们将看到,它们都工作地很好:

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

并且只有一条,不会多。

好喇,关于定时器的教程结束了~旁白出来清下场,各位按秩序离开。

(小若:我才不会配合你发神经。。。)

(小若:各位一个接一个走,小心台阶。。。)

标签: cocos2d-x, 定时器

?>