调度器(schedulers)负责以一定时间间隔触发一个给定的回调方法(callback)。
两种不同类型的回调:
1、update selector:update sellctor 会在每帧被调用,你可以自定义它的优先级。
2、自定义selector:自定义selector可以在每帧被调用,或以自定义的时间间隔调用。
尽可能避免使用自定义selector。使用update selector比较快,且内存消耗较小。
通过:CCDirector::sharedDirector()->getScheduler();获取全局定时器。
API:
//更新定时器,每帧调用1次。每个节点只能有1个被调度的update函数 void scheduleUpdate(void); //卸载更新定时器 void unscheduleUpdate(void); //自定义定时器,如果重复调用,那调用间隔会更新,而不会再次调用 //interval,调用时间间隔,如果为0,建议使用scheduleUpdate //repeat,回调函数会被执行repeat+1次,kCCRepeatForever是无限次调用 //delay,第一次执行前的延时 void schedule(SEL_SCHEDULE selector, float interval, unsigned int repeat, float delay); void schedule(SEL_SCHEDULE selector, float interval); void scheduleOnce(SEL_SCHEDULE selector, float delay); void schedule(SEL_SCHEDULE selector); //卸载自定义定时器 void unschedule(SEL_SCHEDULE selector); void unscheduleAllSelectors(void); //恢复所有定时器和动作,OnEnter调用 void resumeSchedulerAndActions(void); //暂停所有定时器和动作,OnExit调用 void pauseSchedulerAndActions(void); //scheduleUpdate每帧调用 virtual void update(float delta);
Demo:
自定义定时器
bool HelloWorld::init(){ CCSize winSize = CCDirector::sharedDirector()->getWinSize(); CCSprite *sprite = CCSprite::create("HelloWorld.png"); sprite->setPosition(ccp(winSize.width/2, winSize.height/2)); this->addChild(sprite); // 创建定时器 CCDirector::sharedDirector()->getScheduler()->scheduleSelector(SEL_SCHEDULE(&HelloWorld::menuCloseCallback), this, 5.0, false); return true;}// 被定时器调用的函数void HelloWorld::menuCloseCallback(CCObject* pSender){#if (CC_TARGET_PLATFORM == CC_PLATFORM_WINRT) || (CC_TARGET_PLATFORM == CC_PLATFORM_WP8) CCMessageBox("You pressed the close button. Windows Store Apps do not implement a close button.","Alert");#else CCDirector::sharedDirector()->end(); #if (CC_TARGET_PLATFORM == CC_PLATFORM_IOS) exit(0); #endif#endif}
更新定时器 scheduleUpdate
// HelloWorldScene.hvoid update(float delate);// HelloWorldScene.cppbool HelloWorld::init(){ CCSize winSize = CCDirector::sharedDirector()->getWinSize(); CCSprite *sprite = CCSprite::create("HelloWorld.png"); sprite->setPosition(ccp(winSize.width/2, winSize.height/2)); this->addChild(sprite); // 开启定时器 this->scheduleUpdate(); return true;}void HelloWorld::update(float delate){ CCLog("%f", delate);}