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);

scheduler(SEL_SCHEDULE selector, float interval, unsigned int repeat, float delay)函数里面的参数:

  • 第一个参数selector即为你要添加的事件函数
  • 第二个参数interval为事件触发时间间隔
  • 第三个参数repeat为触发一次事件后还会触发的次数,默认值为kRepeatForever,表示无限触发次数
  • 第四个参数delay表示第一次触发之前的延时

示例

1.

//开启定时器 this->scheduleUpdate(); //虚函数update void
HelloWorld::update(float delta) { CCLog(“%f”,delta); }
//输出,这里设置了60fps,调用间隔1/60s
0.016667
0.016676
0.016657
0.016669

启动逻辑

主线程启动
this->scheduleUpdate()
只执行一次
this->scheduleOnce(schedule_selector(HelloWorld::Move), 1.0f);//每隔1.0f执行一次,省略参数则表示每帧都要
自定义线程
this->schedule(schedule_selector(HelloWorld::log),1,3,2);

停止逻辑
1、停止自定义函数的定时器:

this->unschedule(schedule_selector(HelloWorld::Move));

2、停止默认定时器:

this->unscheduleUpdate();

3、停止所有定时器:

this->unscheduleAllSelectors();

自定义调度器(scheduler)

  游戏开发中,在某些情况下我们可能不需要频繁的进行逻辑检测,这样可以提高游戏性能。所以Cocos2d-x还提供了自定义调度器,可以实现以一定的时间间隔连续调用某个函数。

由于引擎的调度机制,自定义时间间隔必须大于两帧的间隔,否则两帧内的多次调用会被合并成一次调用。所以自定义时间间隔应在0.1秒以上。

同样,取消该调度器可以用unschedule(SEL_SCHEDULE selector, float delay)。

有时会出现unschedule不及时就是这个原因导致。

Logo

CSDN联合极客时间,共同打造面向开发者的精品内容学习社区,助力成长!

更多推荐