cocos2d-x为我们提供了两种方式来实现定时机制——使用update方法以及实用scheduleUpdate方法。
1.update定时器
第一种定时机制是Node类的刷新事件update方法,该方法在每帧绘制之前都会被触发一次。由于绘图帧率有限,而每次更新最终会反映到画面上,所以在每帧之间刷新一次已经足够应付大部分游戏逻辑处理的要求了。
cocos2d-x默认没有启用update事件,为了启用定时器,我们需要调用scheduleUpdate方法并重载update以执行自己的代码。对应的,我们可以使用unscheduleUpdate方法停止定时器。
以引擎的HelloWorld为例来使用定时器,首先在HelloWorld.h头文件中重载update方法
class HelloWorld : public Layer { public: virtual void update(float delta) // delta参数代表上一次调用这个函数到本次调用这个函数之间间隔多少秒 { CCLOG("update %f",delta); // this->unscheduleUpdate(); 停止update定时器 } };我们在HelloWorld层的init方法中启用定时器
bool HelloWorld::init() { if(!Layer::init()) { return false; } this->scheduleUpdate(); // 启用update定时器,每帧绘制之前都会调用update return true; }控制台下在不停的打印
update 0.028961
update 0.016667
update 0.016667
update 0.016667
update 0.016666
2.schedule定时器
另一种定时机制是Node类的schedule方法,可以实现以一定的时间间隔连续调用某个函数。由于引擎的调度机制,这里的时间间隔必须大于两帧的间隔,否则两帧期间的多次调用会被合并成一次调用,一般来说,事件间隔应在0.1秒以上。
同样以HelloWorld为例来启用定时器,在HelloWorld.h头文件中加上myUpdate方法
class HelloWorld : public Layer { public: void myUpdate(float delta) // delta参数代表上一次调用这个函数到本次调用这个函数之间间隔多少秒 { CCLOG("myUpdate %f",delta); // this->unschedule(schedule_selector(HelloWorld::myUpdate)); 停止schedule定时器 // this->unscheduleAllSelectors(); 停止所有的定时器 } };在HelloWorld层的init方法中启用定时器
bool HelloWorld::init() { if(!Layer::init()) { return false; } // schedule_selector是一个用来把指定函数转化成函数指针的宏,用来启动一个自定义的定时器,第二个参数表示以秒为单位的时间,0代表以每帧为时间间隔,每3秒调用myUpdate方法 this->schedule(schedule_selector(HelloWorld::myUpdate),3); return true; }控制台打印结果: myUpdate 3.000514 myUpdate 3.002915 myUpdate 3.000579 myUpdate 3.000229