cocos2d-x技能冷却效果

一、cocos2d-x技能冷却效果

例子做了一个类似技能冷却的效果,当技能在cd中时没法点击使用技能,cd完成后可以点击技能拖动,使用完成后再次进入技能cd。技能的冷却效果使用CCActionInterval的子类CCProgressTo,这个类的使用方式很简单,CCProgressTo::create(10.0f, 100.0f),第一个参数是效果持续的时间,这里我们就可以说是技能的冷却时间,第二参数是设置百分比,可以理解为效果作用的对象的最终显示范围。这里为实现冷却的效果还需要CCProgressTimer这个类配合使用,这个类是CCNode的子类,可以实现一些纹理的载入特效,它以CCSprite作为对象创建,通过setTypeP()来设置具体效果,setType里的参数是一个枚举值,新版的cocos2d-x只包括两种效果,具体运行效果可查看cocos2d-x源码,然后修改例子工程代码setType方法里的值看到实际效果。

代码如下:
  1. bool SkillCd::init()
  2. {
  3.     if(!CCLayer::init())
  4.     {
  5.         return false;
  6.     }
  7.     flag=false;//技能是否在CD中
  8.     this->setTouchEnabled(true);
  9.     size=CCDirector::sharedDirector()->getWinSize();
  10.    
  11.     CCSprite* background=CCSprite::create("background.jpg");
  12.     background->setPosition(ccp(size.width*0.5, size.height*0.5));
  13.     this->addChild(background);
  14.    
  15.     skillWait=CCSprite::create("cding.png");
  16.     skillWait->setPosition(ccp(size.width-100, 80));
  17.     this->addChild(skillWait,1);
  18.    
  19.     ready=CCSprite::create("ready.png");
  20.     skillTimer=CCProgressTimer::create(ready);
  21.     skillTimer->setPosition(ccp(size.width-100,80));
  22.     skillTimer->setType(kCCProgressTimerTypeRadial);
  23.     this->addChild(skillTimer,2);
  24.    
  25.     skillCooldown();
  26.    
  27.     return true;
  28. }

  29. void SkillCd::skillCooldown()
  30. {
  31.     cdAction=CCProgressTo::create(10.0f, 100.0f);
  32.     CCCallFunc* func=CCCallFunc::create(this, callfunc_selector(SkillCd::allowToClick));
  33.     CCFiniteTimeAction* seq=CCSequence::create(cdAction,func,NULL);
  34.     skillTimer->runAction(seq);
  35. }

  36. void SkillCd::allowToClick()
  37. {
  38.     flag=true;
  39. }

  40. void SkillCd::registerWithTouchDispatcher()
  41. {
  42.     CCDirector::sharedDirector()->getTouchDispatcher()->addTargetedDelegate(this, 0, true);
  43. }

  44. bool SkillCd::ccTouchBegan(CCTouch *pTouch, CCEvent *pEvent)
  45. {
  46.     CCPoint nodeSpace=convertTouchToNodeSpace(pTouch);//这里需要坐标转换
  47.     if(skillWait->boundingBox().containsPoint(nodeSpace))
  48.     {
  49.         if(flag)
  50.         {
  51.             point.x=pTouch->getLocation().x;
  52.             point.y=pTouch->getLocation().y;
  53.             scope=CCSprite::create("skillscope.png");
  54.             scope->setPosition(point);
  55.             this->addChild(scope,3);
  56.            
  57.             return true;
  58.         }
  59.         else
  60.         {
  61.             CCLog("Skill is cooling");
  62.            
  63.             return false;
  64.         }
  65.     }
  66.     else
  67.     {
  68.         return false;
  69.     }
  70. }

  71. void SkillCd::ccTouchMoved(CCTouch *pTouch, CCEvent *pEvent)
  72. {
  73.     point.x=pTouch->getLocation().x;
  74.     point.y=pTouch->getLocation().y;
  75.     scope->setPosition(point);
  76. }

  77. void SkillCd::ccTouchEnded(CCTouch *pTouch, CCEvent *pEvent)
  78. {
  79.     this->removeChild(scope);
  80.     flag=false;
  81.     skillCooldown();//使用完毕,重新进入技能CD
  82. }

  83. void SkillCd::ccTouchCancelled(CCTouch *pTouch, CCEvent *pEvent)
  84. {
  85.     this->removeChild(scope);
  86. }
复制代码
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值