cocos2d-x 计时器-CCScheduler)

CCScheduler可以算是个计时器,可以根据需要通过此类下的各种方法设定计时来执行回调函数,达到计时控制精灵、动画的作用。官方原例中已经演示了这个类的具体使用方法,这里就记录一下使用方法:

1.setTimeScale

用于减慢或者快进动画,其默认参数值为1.0,低于此值时计时器会放慢,否则加快,下面是代码:


  1. CCControlSlider* SchedulerTimeScale::sliderCtl()  
  2. {  
  3.     //添加一个滑动条用来控制动画速度  
  4.     CCControlSlider * slider = CCControlSlider::create("sliderTrack2.png","sliderProgress2.png" ,"sliderThumb.png");  
  5.     //滑动条数值产生变化时调用自定义的<span style="font-family: Arial, Helvetica, sans-serif;">sliderAction来执行setTimeScale</span>  
  6.     slider->addTargetWithActionForControlEvents(this, cccontrol_selector(SchedulerTimeScale::sliderAction), CCControlEventValueChanged);  
  7.   
  8.     slider->setMinimumValue(-3.0f);  
  9.     slider->setMaximumValue(3.0f);  
  10.     slider->setValue(1.0f);  
  11.   
  12.     return slider;  
  13. }  
  14.   
  15. void SchedulerTimeScale::sliderAction(CCObject* pSender, CCControlEvent controlEvent)  
  16. {  
  17.     CCControlSlider* pSliderCtl = (CCControlSlider*)pSender;  
  18.     float scale;  
  19.     scale = pSliderCtl->getValue();  
  20.     //这里由导演取得所有动画的计时器并执行setTimeScale  
  21.     CCDirector::sharedDirector()->getScheduler()->setTimeScale(scale);  
  22. }  
  23.   
  24. void SchedulerTimeScale::onEnter()  
  25. {  
  26.     CCLayer::onEnter();  
  27.   
  28.     CCSize s = CCDirector::sharedDirector()->getWinSize();  
  29.   
  30.     // rotate and jump  
  31.     CCActionInterval *jump1 = CCJumpBy::create(4, ccp(-s.width+80,0), 100, 4);  
  32.     CCActionInterval *jump2 = jump1->reverse();  
  33.     CCActionInterval *rot1 = CCRotateBy::create(4, 360*2);  
  34.     CCActionInterval *rot2 = rot1->reverse();  
  35.   
  36.     CCSequence* seq3_1 = CCSequence::create(jump2, jump1, NULL);  
  37.     CCSequence* seq3_2 = CCSequence::create(rot1, rot2, NULL);  
  38.     CCFiniteTimeAction* spawn = CCSpawn::create(seq3_1, seq3_2, NULL);  
  39.     CCRepeat* action = CCRepeat::create(spawn, 50);  
  40.   
  41.     CCRepeat* action2 = (CCRepeat*)action->copy()->autorelease();  
  42.     CCRepeat* action3 = (CCRepeat*)action->copy()->autorelease();  
  43.   
  44.     CCSprite *grossini = CCSprite::create("grossini.png");  
  45.     CCSprite *tamara = CCSprite::create("grossinis_sister1.png");  
  46.     CCSprite *kathia = CCSprite::create("grossinis_sister2.png");  
  47.   
  48.     grossini->setPosition(ccp(40,80));  
  49.     tamara->setPosition(ccp(40,80));  
  50.     kathia->setPosition(ccp(40,80));  
  51.   
  52.     addChild(grossini);  
  53.     addChild(tamara);  
  54.     addChild(kathia);  
  55.   
  56.     grossini->runAction(CCSpeed::create(action, 0.5f));  
  57.     tamara->runAction(CCSpeed::create(action2, 1.5f));  
  58.     kathia->runAction(CCSpeed::create(action3, 1.0f));  
  59.   
  60.     m_pSliderCtl = sliderCtl();  
  61.     m_pSliderCtl->setPosition(ccp(s.width / 2.0f, s.height / 3.0f));  
  62.   
  63.     addChild(m_pSliderCtl);  
  64. }  
  65.   
  66. void SchedulerTimeScale::onExit()  
  67. {  
  68.     // restore scale 还原timeScale的默认值  
  69.     CCDirector::sharedDirector()->getScheduler()->setTimeScale(1);  
  70.     CCLayer::onExit();  
  71. }  

2.scheduleUpdateForTarget

有时需要不同的计时器来各自控制精灵或者动画,这就需要为不同的精灵或者动画关联不同的scheduler了,下面是代码:

  1. //自定义两个Schedulers  
  2. class TwoSchedulers : public cocos2d::CCLayer  
  3. {  
  4. public:  
  5.   
  6.     void onEnter();  
  7.     CCControlSlider* sliderCtl();  
  8.     void sliderAction(CCObject* sender, CCControlEvent controlEvent);  
  9.     //这里定义两个Scheduler  
  10.     cocos2d::CCScheduler *sched1;  
  11.     cocos2d::CCScheduler *sched2;  
  12.     //动作管理器用来统一管理所有关联对象的动作  
  13.     cocos2d::CCActionManager *actionManager1;  
  14.     cocos2d::CCActionManager *actionManager2;  
  15.   
  16.     CCControlSlider    *sliderCtl1;  
  17.     CCControlSlider    *sliderCtl2;  
  18.     CREATE_FUNC(TwoSchedulers);  
  19. };  


  1. CCControlSlider *TwoSchedulers::sliderCtl()  
  2. {  
  3.    // CGRect frame = CGRectMake(12.0f, 12.0f, 120.0f, 7.0f);  
  4.     CCControlSlider *slider = CCControlSlider::create("sliderTrack2.png","sliderProgress2.png" ,"sliderThumb.png");  
  5.         //[[UISlider alloc] initWithFrame:frame];  
  6.     slider->addTargetWithActionForControlEvents(this, cccontrol_selector(TwoSchedulers::sliderAction), CCControlEventValueChanged);  
  7.   
  8.     slider->setMinimumValue(0.0f);  
  9.     slider->setMaximumValue(2.0f);  
  10.     //slider.continuous = YES;  
  11.     slider->setValue(1.0f);  
  12.   
  13.     return slider;  
  14. }  
  15.   
  16. void TwoSchedulers::sliderAction(CCObject* sender, CCControlEvent controlEvent)  
  17. {  
  18.     float scale;  
  19.   
  20.     CCControlSlider *slider = (CCControlSlider*) sender;  
  21.     scale = slider->getValue();  
  22.   
  23.     if( sender == sliderCtl1 )  
  24.         sched1->setTimeScale(scale);  
  25.     else  
  26.         sched2->setTimeScale(scale);  
  27. }  
  28.   
  29. void TwoSchedulers::onEnter()  
  30. {  
  31.     CCLayer::onEnter();  
  32.   
  33.     CCSize s = CCDirector::sharedDirector()->getWinSize();  
  34.   
  35.         // rotate and jump  
  36.     CCActionInterval *jump1 = CCJumpBy::create(4, ccp(0,0), 100, 4);  
  37.     CCActionInterval *jump2 = jump1->reverse();  
  38.   
  39.     CCSequence* seq = CCSequence::create(jump2, jump1, NULL);  
  40.     CCRepeatForever* action = CCRepeatForever::create(seq);  
  41.   
  42.         //  
  43.         // Center  
  44.         //  
  45.     CCSprite *grossini = CCSprite::create("grossini.png");  
  46.     addChild(grossini);  
  47.     grossini->setPosition(ccp(s.width/2,100));  
  48.     grossini->runAction((CCAction*)action->copy()->autorelease());  
  49.   
  50.   
  51.   
  52.     CCScheduler *defaultScheduler = CCDirector::sharedDirector()->getScheduler();  
  53.   
  54.     //  
  55.     // Left:  
  56.     //  
  57.   
  58.     // Create a new scheduler, and link it to the main scheduler  
  59.     //创建计时器并且关联到主计时器  
  60.     sched1 = new CCScheduler();  
  61.     defaultScheduler->scheduleUpdateForTarget(sched1, 0, false);  
  62.   
  63.     // Create a new ActionManager, and link it to the new scheudler  
  64.     //创建动作管理器并关联到自定义的计时器  
  65.     actionManager1 = new CCActionManager();  
  66.     sched1->scheduleUpdateForTarget(actionManager1, 0, false);  
  67.   
  68.     for( unsigned int i=0; i < 10; i++ )   
  69.     {  
  70.         CCSprite *sprite = CCSprite::create("grossinis_sister1.png");  
  71.   
  72.         // IMPORTANT: Set the actionManager running any action  
  73.         //将精灵加入到动作管理器中统一动作  
  74.         sprite->setActionManager(actionManager1);  
  75.   
  76.         addChild(sprite);  
  77.         sprite->setPosition(ccp(30+15*i,100));  
  78.   
  79.         sprite->runAction((CCAction*)action->copy()->autorelease());  
  80.     }  
  81.   
  82.   
  83.     //  
  84.     // Right:  
  85.     //  
  86.   
  87.     // Create a new scheduler, and link it to the main scheduler  
  88.     sched2 = new CCScheduler();;  
  89.     defaultScheduler->scheduleUpdateForTarget(sched2, 0, false);  
  90.   
  91.     // Create a new ActionManager, and link it to the new scheudler  
  92.     actionManager2 = new CCActionManager();  
  93.     sched2->scheduleUpdateForTarget(actionManager2, 0, false);  
  94.   
  95.     for( unsigned int i=0; i < 10; i++ ) {  
  96.         CCSprite *sprite = CCSprite::create("grossinis_sister2.png");  
  97.   
  98.         // IMPORTANT: Set the actionManager running any action  
  99.         sprite->setActionManager(actionManager2);  
  100.   
  101.         addChild(sprite);  
  102.         sprite->setPosition(ccp(s.width-30-15*i,100));  
  103.   
  104.         sprite->runAction((CCAction*)action->copy()->autorelease());  
  105.     }  
  106.     //创建两个滑动条  
  107.     sliderCtl1 = sliderCtl();  
  108.     addChild(sliderCtl1);  
  109.     sliderCtl1->retain();  
  110.     sliderCtl1->setPosition(ccp(s.width / 4.0f, s.height - 20));  
  111.   
  112.     sliderCtl2 = sliderCtl();  
  113.     addChild(sliderCtl2);  
  114.     sliderCtl2->retain();  
  115.     sliderCtl2->setPosition(ccp(s.width / 4.0f*3.0f, s.height-20));  
  116. }  

上面添加的两个层在同一场景,拖动中间的滑动条将会看到所有动画都受它的参数影响,而拖动顶上两个滑动条时却只能影响为其自定义关联的精灵和动画。

3.暂停、唤醒、移除计时器

  1. void HelloWorld::menuCloseCallback(CCObject* pSender)  
  2. {  
  3.     // "close" menu item clicked  
  4.     //CCDirector::sharedDirector()->end();  
  5.     //这里把关闭按钮执行的代码改成了暂停与唤醒计时器的代码,不过这里是停止、唤醒所有计时器  
  6.     if (isPause==false){  
  7.     m_pPausedTargets=CCDirector::sharedDirector()->getScheduler()->pauseAllTargets();  
  8.     isPause=true;  
  9.         CC_SAFE_RETAIN(m_pPausedTargets);  
  10.     }else{  
  11.     CCDirector::sharedDirector()->getScheduler()->resumeTargets(m_pPausedTargets);  
  12.     isPause=false;  
  13.     }  
  14. <span style="white-space:pre">  </span>//这句用来移除所有计时器  
  15.   <span style="white-space:pre">   </span>//CCDirector::sharedDirector()->getScheduler()->unscheduleAll();  
  16. }  


在官方interval test 一例中还使用Schedule做了计时器:

  1. //开始计时,这个是CCNode中的函数,用于每秒执行一次回调函数,也可以后面加延时调用的参数  
  2. schedule(schedule_selector(HelloWorld::gameTimer));  
里面还有个更常用的相当于暂停、继续游戏的方法:
  1. void IntervalLayer::onPause(CCObject* pSender)  
  2. {  
  3.     if(CCDirector::sharedDirector()->isPaused())  
  4.         CCDirector::sharedDirector()->resume();   
  5.     else  
  6.         CCDirector::sharedDirector()->pause();   
  7.   
  8. }  

关于CCScheduler,其它还有很多方法,说是说不完了,得到源代码和官方原例中里自己研究了……
源代码下载: http://download.csdn.net/detail/cyistudio/5467885
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值