SkillButton 技能冷卻

#pragma once
#include "cocos2d.h"
USING_NS_CC;
class SkillButton :public Node
{
public:
 SkillButton();
 ~SkillButton();                            //技能標記
 static SkillButton * createSkillButton(float skillCD,const char* normalImage,const char* clikImage,const char* maskImage,int tag);
 bool init(float skillCD, const char* normalImage, const char* clikImage, const char* maskImage,int tag);
 void skillClikCallBack(Ref* obj); //單擊回調
 void skilCoolDownCallBack(Node* node); /** 技能冷卻完畢回調*/
private:
 MenuItemImage * _itemSkill;   // 技能按鈕
 Menu * _menuSkill;      // 技能按鈕所在menu
 Sprite * _mask;      // 蒙板精靈,黑色半透明(這個是爲了顯示一個冷卻計時效果)
 ProgressTimer * _ProgressTimer;    // 時間進度條精靈(360度旋轉)
 // CD時間
 CC_SYNTHESIZE(float, mCDtime, CDtime);
};
#include "SkillButton.h"
SkillButton::SkillButton()
{
 _mask = NULL;
 _itemSkill = NULL;
 _menuSkill = NULL;
 _ProgressTimer = NULL;
 mCDtime = 1.0f;
}
SkillButton::~SkillButton()
{
 
}
SkillButton * SkillButton::createSkillButton(float skillCD, const char* normalImage, const char* clikImage, const char* maskImage,int tag)
{
 SkillButton * skill = new SkillButton();
 if (skill && skill->init(skillCD,normalImage,clikImage,maskImage,tag))
 {
  skill->autorelease();
  return skill;
 }
 else
 {
  CC_SAFE_DELETE(skill);
  skill = NULL ;
 }
}
bool SkillButton::init(float skillCD, const char* normalImage, const char* clikImage, const char* maskImage,int tag)
{
 // Notice:添加child時要注意上下層
 // 最下方是CCMenuItemImage 其次是模版圖片 最上方是CCProgressTimer
 // 添加技能按鈕
 _itemSkill = MenuItemImage::create(normalImage, clikImage, CC_CALLBACK_1(SkillButton::skillClikCallBack, this));
 _itemSkill->setPosition(Vec2::ZERO);
 _itemSkill->setTag(tag);
 _menuSkill = Menu::create(_itemSkill,NULL);
 _menuSkill->setPosition(Vec2::ZERO);
 this->addChild(_menuSkill);
 // 添加陰影模版
    _mask = Sprite::create(maskImage);
 _mask->setPosition(Vec2::ZERO);
 _mask->setVisible(false);
 _mask->retain();
 this->addChild(_mask);
 // 添加旋轉進度條精靈
 auto sp = Sprite::create(normalImage);
 _ProgressTimer = ProgressTimer::create(sp);
 
 _ProgressTimer->setPosition(Vec2::ZERO);
 _ProgressTimer->setVisible(false);
 this->addChild(_ProgressTimer);
 this->setCDtime(skillCD);
 return true;
}
void SkillButton::skillClikCallBack(Ref* obj) //單擊回調
{
 // 冷卻計時,即時狀態技能按鈕不可點擊
   _itemSkill->setEnabled(false);
   // 模版可見
   _mask->setVisible(true);
   // 設置精靈進度條爲順時針
   _ProgressTimer->setVisible(true);
   _ProgressTimer->setType(ProgressTimer::Type::RADIAL);
   //準備一個5秒旋轉360度的動畫(逐漸覆蓋半透模板形成冷卻效果;這裏進行計時冷卻動畫的實現和時間控制)
   auto action_progrees_to = ProgressTo::create(mCDtime,100);
   auto action_call_back = CallFuncN::create(CC_CALLBACK_1(SkillButton::skilCoolDownCallBack,this));
   _ProgressTimer->runAction(Sequence::create(action_progrees_to,action_call_back,NULL));
   MenuItemImage* item = (MenuItemImage*)obj;
   switch (item->getTag())
   {
   case 1:
   {
    CCLOG("item 1");
   }
   break;
   case 2:
   {
    CCLOG("item 2");
   }
   break;
   case 3:
   {
    CCLOG("item 3");
   }
   break;
   case 4:
   {
    CCLOG("item 4");
   }
   break;
   default:
    break;
   }
}
void SkillButton::skilCoolDownCallBack(Node* node) /** 技能冷卻完畢回調*/
{
 // 設置蒙板不可見
 _mask->setVisible(false);
 // 進度條技能不可見
 _ProgressTimer->setVisible(false);
 //重置進度爲0
 _ProgressTimer->setPercentage(0);
 // 按鈕置爲可用
 _itemSkill->setEnabled(true);
}


這裏調用 技能類
#include "OperateLayer.h"
#include "SkillButton.h"
OperateLayer::OperateLayer()
{
}
OperateLayer::~OperateLayer()
{
}
bool OperateLayer::init()
{
 if (!Layer::init())
 {
  return false;
 }
    auto winSize = Director::getInstance()->getWinSize();
    auto _skill_1 = SkillButton::createSkillButton(10, "Spell_Holy_BlessingOfStrength.jpg", "Spell_Holy_BlessingOfStrength.jpg", "stencil.png",1);
    _skill_1->setPosition(Vec2(winSize.width - 42, 50));
    this->addChild(_skill_1);
 auto _skill_2 = SkillButton::createSkillButton(8,"Spell_Nature_ThunderClap.jpg","Spell_Nature_ThunderClap.jpg","stencil.png",2);
 _skill_2->setPosition(Vec2(_skill_1->getPositionX() - 74, 50));
 this->addChild(_skill_2);
 auto _skill_3 = SkillButton::createSkillButton(5, "Spell_Fire_FlameTounge.jpg", "Spell_Fire_FlameTounge.jpg", "stencil.png",3);
 _skill_3->setPosition(Vec2(_skill_2->getPositionX() - 74 , 50));
 this->addChild(_skill_3);
 auto _skill_4 = SkillButton::createSkillButton(3, "Spell_Holy_AuraOfLight.jpg", "Spell_Holy_AuraOfLight.jpg", "stencil.png",4);
 _skill_4->setPosition(Vec2(_skill_3->getPositionX() - 74, 50));
 this->addChild(_skill_4);
 return true;
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章