非冷卻狀態(tài)時(shí)只顯示CCMenuItemImage,當(dāng)冷卻開(kāi)始計(jì)時(shí)時(shí),將按鈕設(shè)為不可點(diǎn)擊狀態(tài),同將半透明模板和進(jìn)度條精靈設(shè)置為可見(jiàn)狀態(tài),并且進(jìn)度條精靈開(kāi)始進(jìn)行旋轉(zhuǎn)動(dòng)作,旋轉(zhuǎn)結(jié)束后在回調(diào)函數(shù)中將半透明模板和進(jìn)度條精靈設(shè)為不可見(jiàn),按鈕重新設(shè)置為可點(diǎn)擊狀態(tài)。
創(chuàng)建一個(gè)SkillButton指針,修改冷卻時(shí)間,動(dòng)畫(huà)表現(xiàn)(如蒙板從旋轉(zhuǎn)改為豎直方向),并將SkillButton添加到layer上即可。
傳個(gè)效果圖

SkillButton.h
/**
實(shí)現(xiàn)技能冷卻效果
Notice:添加child時(shí)要注意上下層關(guān)系
最下方是按鈕 其次是半透明的模版圖片 最上方是CCProgressTimer進(jìn)度條精靈
*/
#ifndef _SKILLBUTTON_H_
#define _SKILLBUTTON_H_
#include <cocos2d.h>
class SkillButton : public cocos2d::CCNode
{
public:
SkillButton();
virtual ~SkillButton();
/** 創(chuàng)建一個(gè)SkillButton對(duì)象
*/
static SkillButton* createSkillButton(float cdTime,
const char* stencil_file_name,
const char* button_normal_name,
const char* button_click_name);
/** CD時(shí)間設(shè)置
*/
void setCDTime(float time) { mCDTime = time; }
float getCDTime() const { return mCDTime; }
/** 技能按鈕點(diǎn)擊回調(diào) */
void skillClickCallBack(cocos2d::CCObject* obj);
/** 技能冷卻完畢回調(diào)*/
void skillCoolDownCallBack(cocos2d::CCNode* node);
private:
/** 初始化 */
bool init(float cdTime, const char* stencil_file_name, const char* button_normal_name, const char* button_click_name);
private:
cocos2d::CCMenuItemImage* mItemSkill; // 技能按鈕
cocos2d::CCMenu* mMenuSkill; // 技能按鈕所在menu
cocos2d::CCSprite* mStencil; // 蒙板精靈,黑色半透明(這個(gè)是為了顯示一個(gè)冷卻計(jì)時(shí)效果)
cocos2d::CCProgressTimer* mProgressTimer; // 時(shí)間進(jìn)度條精靈(360度旋轉(zhuǎn))
float mCDTime; // CD時(shí)間
};
#endif
SkillButton.cpp
#include "SkillButton.h"
USING_NS_CC;
SkillButton::SkillButton():
mItemSkill(NULL),
mMenuSkill(NULL),
mStencil(NULL),
mProgressTimer(NULL),
mCDTime(1.f)
{
}
SkillButton::~SkillButton()
{
}
SkillButton* SkillButton::createSkillButton(float cdTime, const char* stencil_file_name, const char* button_normal_name, const char* button_click_name)
{
SkillButton* skillButton = new SkillButton();
if (skillButton && skillButton->init(cdTime, stencil_file_name, button_normal_name, button_click_name))
{
skillButton->autorelease();
return skillButton;
}
else
{
delete skillButton;
skillButton = NULL;
}
return NULL;
}
bool SkillButton::init(float cdTime, const char* stencil_file_name, const char* button_normal_name, const char* button_click_name)
{
CCAssert(stencil_file_name, "SkillButton::init stencil_file_name != NULL");
CCAssert(button_normal_name, "SkillButton::init button_normal_name != NULL");
CCAssert(button_click_name, "SkillButton::init button_click_name != NULL");
// Notice:添加child時(shí)要注意上下層
// 最下方是CCMenuItemImage 其次是模版圖片 最上方是CCProgressTimer
// 添加技能按鈕
mItemSkill = CCMenuItemImage::create(button_normal_name, button_click_name, this, menu_selector(SkillButton::skillClickCallBack));
mItemSkill->setPosition(CCPointZero);
mMenuSkill = CCMenu::create(mItemSkill, NULL);
mMenuSkill->setPosition(CCPointZero);
addChild(mMenuSkill, -100);
// 添加陰影模版
mStencil = CCSprite::create(stencil_file_name);
mStencil->setPosition(CCPointZero);
mStencil->setVisible(false);
addChild(mStencil);
// 添加旋轉(zhuǎn)進(jìn)度條精靈
CCSprite* progressSprite = CCSprite::create(button_normal_name);
mProgressTimer = CCProgressTimer::create(progressSprite);
mProgressTimer->setPosition(CCPointZero);
mProgressTimer->setVisible(false);
addChild(mProgressTimer, 100);
mCDTime = cdTime;
return true;
}
/** 技能按鈕點(diǎn)擊回調(diào) */
void SkillButton::skillClickCallBack(cocos2d::CCObject* obj)
{
// 冷卻計(jì)時(shí),即時(shí)狀態(tài)技能按鈕不可點(diǎn)擊
mItemSkill->setEnabled(false);
// 模版可見(jiàn)
mStencil->setVisible(true);
// 設(shè)置精靈進(jìn)度條為順時(shí)針
mProgressTimer->setVisible(true);
mProgressTimer->setType(kCCProgressTimerTypeRadial);
//準(zhǔn)備一個(gè)5秒旋轉(zhuǎn)360度的動(dòng)畫(huà)(逐漸覆蓋半透模板形成冷卻效果;這里進(jìn)行計(jì)時(shí)冷卻動(dòng)畫(huà)的實(shí)現(xiàn)和時(shí)間控制)
CCActionInterval* action_progress_to = CCProgressTo::create(mCDTime, 100);
CCCallFunc* action_callback = CCCallFuncN::create(this, callfuncN_selector(SkillButton::skillCoolDownCallBack));
mProgressTimer->runAction(CCSequence::create(action_progress_to, action_callback, NULL));
}
/** 技能冷卻完成回調(diào) */
void SkillButton::skillCoolDownCallBack(CCNode* node)
{
// 設(shè)置蒙板不可見(jiàn)
mStencil->setVisible(false);
// 進(jìn)度條技能不可見(jiàn)
mProgressTimer->setVisible(false);
// 按鈕置為可用
mItemSkill->setEnabled(true);
}
測(cè)試代碼:
mSkillButton = SkillButton::createSkillButton(2.f, "stencil.png", "normal.png", "click.png");
mSkillButton->setPosition(ccp(s.width/2, s.height/2));
addChild(mSkillButton);
代碼下載參考地址:
http://blog.sina.com.cn/s/blog_732784f70100umuj.html http://www.cocos2dev.com/?p=64