schedule是CCNode中的一个定时器,我们个可以通过这个定时器来刷新游戏屏幕,达到我们想要的游戏效果。
我们看一下有关schedule的几个重要的函数
2 {
3 this->schedule(selector, 0.0f, kCCRepeatForever, 0.0f);
4 }
5
6 void CCNode::schedule(SEL_SCHEDULE selector, float interval)
7 {
8 this->schedule(selector, interval, kCCRepeatForever, 0.0f);
9 }
10
11 void CCNode::schedule(SEL_SCHEDULE selector, float interval, unsigned int repeat, float delay)
12 {
13 CCAssert( selector, " Argument must be non-nil ");
14 CCAssert( interval >= 0, " Argument must be positive ");
15
16 m_pScheduler->scheduleSelector(selector, this, interval , repeat, delay, !m_bRunning);
17 }
18
19 void CCNode::scheduleOnce(SEL_SCHEDULE selector, float delay)
20 {
21 this->schedule(selector, 0.0f, 0, delay);
22 }
23
24 void CCNode::unschedule(SEL_SCHEDULE selector)
25 {
26 // explicit nil handling
27 if (selector == 0)
28 return;
29
30 m_pScheduler->unscheduleSelector(selector, this);
31 }
32
33 void CCNode::unscheduleAllSelectors()
34 {
35 m_pScheduler->unscheduleAllForTarget( this);
36 }
37
38 void CCNode::resumeSchedulerAndActions()
39 {
40 m_pScheduler->resumeTarget( this);
41 m_pActionManager->resumeTarget( this);
42 }
43
44 void CCNode::pauseSchedulerAndActions()
45 {
46 m_pScheduler->pauseTarget( this);
47 m_pActionManager->pauseTarget( this);
48 }
schedule有三个重载函数:
CCNode::schedule(SEL_SCHEDULE selector, float interval, unsigned int repeat, float delay)
第一个参数是回调函数的指针
第二个参数是间隔多少时间调用一次
第三个参数是调用这个函数多少次
第四个参数是多少时间后调用这个函数
CCNode::schedule(SEL_SCHEDULE selector)
从函数实现可以看出,使用默认时间间隔为0,循环无数次,并且立马调用。
CCNode::schedule(SEL_SCHEDULE selector, float interval)(游戏中常用的)
同样从实现可以看出:时间间隔为interval, 循环无数次,马上调用。
CCNode::scheduleOnce(SEL_SCHEDULE selector, float delay)
正如函数名, 只执行一次。
CCNode::unschedule(SEL_SCHEDULE selector)
表示关闭定时器
CCNode::pauseSchedulerAndActions()
暂停定时器,经常使用与游戏暂停时。
CCNode::resumeSchedulerAndActions()
定时器继续,继续游戏时使用
回调函数没有返回值,只有一个float类型的参数,表示距离上次调用此方法的时间(这里指实际计算机调用该方法的时间间隔,不等于上面的interval)
我们都知道程序中init调用完之后回立马调用onEnter函数 ,所以我们可以在init和inEnter中调用,当然可以根据游戏需要改变其位置
事例
2 // 我们来改变游戏中的时间。
3
4 int kTicksPerSecond = 60;
5 int tickCount = 0;
6 CCLabelTTF * lblTime; // 表示时间lbl,已经初始化;
7
8 bool GameScene::init()
9 {
10 schedule(schedule_selector(GameScene::tickFrame), 1.0/kTicksPerSecond);
11 //这里设置为每秒六十帧,但是实际达不到,看情况不同,大约在四十左右。
12 }
13
14 void GameScene::tickFrame(float dt)
15 {
16 ++tickCount;
17 int time = tickCount/kTicksPerSecond;
18 CCString = CCString::createWithFormat("%d", time);
19 lblTime->setString(str->getCString());
20 }
自我误区:
原先只是单纯的认为“时间到时就回去调用下一帧”,但是不是这样的,如果你在tick中调用一个函数,函数中又一直回调自己,比如函数是一个判断位置改变的函数,当达到条件时返回,如果位置的改变又是用tick来控制的话,这样就会一直停在这个tick中,直到内存耗尽。
所以尽量不要这样做,tick只会在每次完成后才会进入下一个tick,由于每次tick可能刷新完成的内容不同,才会造成每次的tick时间不同,这样就能解释为什么达不到我们设置的每秒60帧。
{这是引擎设定的理想值,在AppDelegate.cpp中可以看到这样的设定
// set FPS. the default value is 1.0/60 if you don't call this
pDirector->setAnimationInterval(1.0 / 60);
}