调度器(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.h
void update(float delate);
// HelloWorldScene.cpp
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);
// 开启定时器
this->scheduleUpdate();
return true;
}
void HelloWorld::update(float delate){
CCLog("%f", delate);
}