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


转载于:https://www.cnblogs.com/tiancong/p/3730590.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值