cocos2dx-schedule

schedule是CCNode中的一个定时器,我们个可以通过这个定时器来刷新游戏屏幕,达到我们想要的游戏效果。

我们看一下有关schedule的几个重要的函数

 1 void CCNode::schedule(SEL_SCHEDULE selector)
 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.0f0, 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中调用,当然可以根据游戏需要改变其位置

 

 事例

 1 //GameScene.cpp
 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);


posted @ 2014-05-15 18:17  划破的夜空  阅读(817)  评论(0编辑  收藏  举报