cocos2d-x技能冷却

今天看了一个博客 技能冷却,内部原理 没有看懂,但在他的基础上 加了一个代理方法,使外部类能够捕获到冷却结束。博客地址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){



//做冷却结束的事件



}

 

 

你可能感兴趣的:(cocos2d-x)