今天看了一个博客 技能冷却,内部原理 没有看懂,但在他的基础上 加了一个代理方法,使外部类能够捕获到冷却结束。博客地址http://http://blog.csdn.net/z104207/article/details/8059098 无侵权意思, 效果: 首先 建了一个SkillButton的类 .h文件 ifndef _SKILLBUTTON_H_ #define _SKILLBUTTON_H_ #include "cocos2d.h" class CMTouchSpriteProtocol; class SkillButton : public cocos2d::CCNode { public: SkillButton(); virtual ~SkillButton(); static SkillButton* createSkillButton(float cdTime, const char* stencil_file_name, const char* button_normal_name, const char* button_click_name); void setCDTime(float time) { mCDTime = time; } float getCDTime() const { return mCDTime; } void skillClickCallBack(cocos2d::CCObject* obj); void skillCoolDownCallBack(cocos2d::CCNode* node); CC_PROPERTY(CMTouchSpriteProtocol*, _touchSpriteProtocol, TouchSpriteProtocol); 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时间 }; class CMTouchSpriteProtocol { public: // optional virtual void CMTouchSpriteSelectSprite(SkillButton*sprite) { }; }; #endif .m文件 #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, constchar* 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(20, 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); _touchSpriteProtocol->CMTouchSpriteSelectSprite(this); } // 设置协议 void SkillButton::setTouchSpriteProtocol(CMTouchSpriteProtocol *protocol) { _touchSpriteProtocol = protocol; } CMTouchSpriteProtocol*SkillButton::getTouchSpriteProtocol() { return _touchSpriteProtocol; } 在 HelloWorldScene调用 #include "cocos2d.h" #include "SkillButton.h" class HelloWorld : public cocos2d::CCLayer,publicCMTouchSpriteProtocol { public: virtual bool init(); static cocos2d::CCScene* scene(); SkillButton*mSkillButton; void CMTouchSpriteSelectSprite(SkillButton *sprite);//重写代理方法 CREATE_FUNC(HelloWorld); }; #endif mSkillButton = SkillButton::createSkillButton(2.f, "stencil.png", "click.png","normal.png"); mSkillButton->setPosition(ccp(400/2, 400/2)); addChild(mSkillButton); mSkillButton->setTouchSpriteProtocol(this); 重写代理方法void HelloWorld::CMTouchSpriteSelectSprite(SkillButton*button){ //做冷却结束的事件 }