cocos2d-x为我们介绍了两种方式实现定时机制——使用update方法以及使用schedule方法。
转载于http://blog.csdn.net/chenpolu/article/details/19172171
1.update定时器
第一种定时器机制是CCNode的刷新事件update方法,该方法在每帧绘制之前都会被触发一次。由于绘图帧率有限,而每次更新最终会反应到画面上,所以在每帧之间刷新一次已经足够应付大部分游戏逻辑处理的要求了。
CCNode默认并没有启用update事件,为了启用定时器,我们需要调用scheduleUpdate方法,并重载update以执行自己的代码。对应的,我们可以使用unscheduleUpdate方法停止定时器。
2.schedule定时器
另一种定时机制是CCNode提供的schedule方法,可以实现以一定的时间间隔连续调用某个函数。由于引擎的调度机制,这里的时间间隔必须大于两帧的间隔,否则两帧期间的多次调用会被合并成一次调用。所以schedule定时器通常在间隔较长的定时调用中,一般来说,事件间隔应在0.1秒以上。
this->shcedule(schedule_selector(GameScene::updateGame));
void GameScene::updateGame(ccTime dt)
{
//....
}
CCNode的schedule方法接受一个函数指针并启动一个定时器,利用schedule方法不同的重载可以指定触发间隔与延时。schedule_selector则是一个把指定函数转换为函数指针的宏,用于创建schedule方法所需的函数指针。传入这个宏的函数应该包含一个float参数,表示距离前一次触发事件的时间间隔。
CCNode中与定时器相关的方法
isSchedule(SEL_SCHEDULE selector) //返回一个值,表示selector对应的函数是否已被添加为定时器
scheduleUpdate //启动update定时器
scheduleUpdateWithPriority(int priority) //启动update定时器,并设定定时器的优先级
unscheduleUpdate //取消update定时器
shcedule(SEL_SCHEDULE selector,float interval,unsigned int repeat,float delay) //添加一个schedule定时器,其中selector参数为定时器的事件函数,interval参数为定时器的时间间隔,repeat参数为定时事件触发一次后还会再次触发的次数(默认值为kCCRepeatForever,表示触发无穷多次),delay为第一次触发事件前的延时。此方法拥有多个重载,开发者可以选择自己所需的重载函数。
scheduleOnce(SEL_SCHEDULE selector, float delay); //添加一个schedule定时器,但定时器只触发一次
unschedule(SEL_SCHEDULE selector); //取消selector所对应函数的定时器
unscheduleAllSelectors(void); //取消此节点所关联的全部定时器
pauseSchedulerAndActions(void); //暂停次节点所关联的全部定时器与动作
resumeSchedulerAndActions(void); //继续执行此节点所关联的定时器与动作
由于cocos2d-x的调度是单纯的串行机制,因此所有函数都运行在同一个线程,不会存在并行程序的种种麻烦,这大大简化了编程的复杂性。