今天, 我们来看看cocos2dX里面的定时器, 关于定时器这个概念大家应该很是熟悉吧, 所谓的定时器其实到了一个时间我们就干什么事, (旁白: 这还用你说), 在cocos2dX里面定时器的作用就是每隔一段时间调用一次函数, schedule就是cocos2dX里面的定时器, 老规矩, 还是来熟悉一下函数
scheduleUpdate 每帧执行update
schedule( "目标函数"); 每帧执行目标函数
schedule( "目标函数", "时间"); 每隔指定时间执行目标函数
schedule( "目标函数", "时间", "次数", "等待时间");
scheduleOnce( "目标函数", "等待时间"); 多久之后执行一次目标函数, 只执行一次
首先, 我们在头文件里面创建几个回调函数:
void update( float delta); void sch2( float delta); void schonce( float delta);
int a; int b; int c;
然后我们初始化计数变量, 并且实现这几个函数(函数的功能很简单, 就是每调用一次, 就给对应的计数变量加一):
HelloWorld::HelloWorld() { <span style="white-space:pre"> </span>a = 0; <span style="white-space:pre"> </span>b = 0; <span style="white-space:pre"> </span>c = 0; } void HelloWorld::update( float delta) { <span style="white-space:pre"> </span>a += 1; <span style="white-space:pre"> </span>char buff[50] = { 0}; <span style="white-space:pre"> </span>std::sprintf( buff, "update:%d", a); <span style="white-space:pre"> </span>CCLabelTTF* label = ( CCLabelTTF*)this->getChildByTag( 101);<span style="white-space:pre"> </span>//通过我们设置的标签取得对象, 并且强转为CCLabelTTF <span style="white-space:pre"> </span>label->setString( buff);<span style="white-space:pre"> </span>//设置字符串 } void HelloWorld::sch2( float delta) { <span style="white-space:pre"> </span>b += 1; <span style="white-space:pre"> </span>char buff[50] = { 0}; <span style="white-space:pre"> </span>std::sprintf( buff, "sch2:%d", b); <span style="white-space:pre"> </span>CCLabelTTF* label = ( CCLabelTTF*)this->getChildByTag( 102); <span style="white-space:pre"> </span>label->setString( buff); } void HelloWorld::schonce( float delta) { <span style="white-space:pre"> </span>c += 1; <span style="white-space:pre"> </span>char buff[50] = { 0}; <span style="white-space:pre"> </span>std::sprintf( buff, "schOnce:%d", c); <span style="white-space:pre"> </span>CCLabelTTF* label = ( CCLabelTTF*)this->getChildByTag( 103); <span style="white-space:pre"> </span>label->setString( buff); }
我们再到init里面创建三个标签, 并且用三种不同的方式调用这三个函数:
CCLabelTTF* label1 = CCLabelTTF::create( "", "Arial", 24); //创建三个字符串 label1->setPosition( ccp( visibleSize.width / 2, visibleSize.height / 2 + 100)); addChild( label1, 0, 101); CCLabelTTF* label2 = CCLabelTTF::create( "", "Arial", 24); label2->setPosition( ccp( visibleSize.width / 2, visibleSize.height / 2)); addChild( label2, 0, 102); CCLabelTTF* label3 = CCLabelTTF::create( "", "Arial", 24); label3->setPosition( ccp( visibleSize.width / 2, visibleSize.height / 2 - 100)); addChild( label3, 0, 103); scheduleUpdate(); //每一帧调用一次update schedule( schedule_selector( HelloWorld::sch2), 1.0f); //每隔一秒调用一次sch2 scheduleOnce( schedule_selector( HelloWorld::schonce), 3.0f); //三秒之后调用schonce
我们来看看效果:
看看, 是不是每一帧都调用了一次update, 每一秒都调用了一次sch2, 只调用了一次schonce, 挺简单的吧, 不用另开线程了吧( 旁白: 是挺简单的)
当然, 还可以使用UnSchedule让定时器停下来, 我就不做详细解释了, 还是那一句话, 多去看看官方的API
记住, 游戏的速度再快, 我们都能处理到每一帧
好了, 进的就到这里