非冷卻狀態時只顯示CCMenuItemImage,當冷卻開始計時時,將按鈕設為不可點擊狀態,同將半透明模板和進度條精靈設置為可見狀態,并且進度條精靈開始進行旋轉動作,旋轉結束后在回調函數中將半透明模板和進度條精靈設為不可見,按鈕重新設置為可點擊狀態。
創建一個SkillButton指針,修改冷卻時間,動畫表現(如蒙板從旋轉改為豎直方向),并將SkillButton添加到layer上即可。
傳個效果圖

SkillButton.h
/**
實現技能冷卻效果
Notice:添加child時要注意上下層關系
最下方是按鈕 其次是半透明的模版圖片 最上方是CCProgressTimer進度條精靈
*/
#ifndef _SKILLBUTTON_H_
#define _SKILLBUTTON_H_
#include <cocos2d.h>
class SkillButton : public cocos2d::CCNode
{
public:
SkillButton();
virtual ~SkillButton();
/** 創建一個SkillButton對象
*/
static SkillButton* createSkillButton(float cdTime,
const char* stencil_file_name,
const char* button_normal_name,
const char* button_click_name);
/** CD時間設置
*/
void setCDTime(float time) { mCDTime = time; }
float getCDTime() const { return mCDTime; }
/** 技能按鈕點擊回調 */
void skillClickCallBack(cocos2d::CCObject* obj);
/** 技能冷卻完畢回調*/
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; // 蒙板精靈,黑色半透明(這個是為了顯示一個冷卻計時效果)
cocos2d::CCProgressTimer* mProgressTimer; // 時間進度條精靈(360度旋轉)
float mCDTime; // CD時間
};
#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時要注意上下層
// 最下方是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);
// 添加旋轉進度條精靈
CCSprite* progressSprite = CCSprite::create(button_normal_name);
mProgressTimer = CCProgressTimer::create(progressSprite);
mProgressTimer->setPosition(CCPointZero);
mProgressTimer->setVisible(false);
addChild(mProgressTimer, 100);
mCDTime = cdTime;
return true;
}
/** 技能按鈕點擊回調 */
void SkillButton::skillClickCallBack(cocos2d::CCObject* obj)
{
// 冷卻計時,即時狀態技能按鈕不可點擊
mItemSkill->setEnabled(false);
// 模版可見
mStencil->setVisible(true);
// 設置精靈進度條為順時針
mProgressTimer->setVisible(true);
mProgressTimer->setType(kCCProgressTimerTypeRadial);
//準備一個5秒旋轉360度的動畫(逐漸覆蓋半透模板形成冷卻效果;這里進行計時冷卻動畫的實現和時間控制)
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));
}
/** 技能冷卻完成回調 */
void SkillButton::skillCoolDownCallBack(CCNode* node)
{
// 設置蒙板不可見
mStencil->setVisible(false);
// 進度條技能不可見
mProgressTimer->setVisible(false);
// 按鈕置為可用
mItemSkill->setEnabled(true);
}
測試代碼:
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