这里为需要注意的是开启触屏的方法,以及NotificationCenter的用法有所改变。
这个类中我改动了一些代码,比如说SkellEnd时候没有就将ProgressTimer设置为
setVisible(false),而是将它的percent设置为0,然后再冷却结束后又可以冲percent0开始播放动画。
SkillButton.h
// // SkillButton.h // Fight // // Created by Cytzrs on 15/2/4. // // #ifndef __Fight__SkillButton__ #define __Fight__SkillButton__ #include <iostream> #include "cocos2d.h" #include "cocos-ext.h" USING_NS_CC; USING_NS_CC_EXT; class SkillButton:public cocos2d::Layer{ public: //创建冷却技能按钮,create 和 init 是连在一起的,调用create的时候必然会调用init static SkillButton* create(const char* fore_name,const char* back_name); //初始化按钮 bool init(const char* fore_name,const char* back_name); //开始冷却技能 void BeginSkill(); //冷却技能结束后 void EndSkill(); //判断是否在冷却技能 bool IsSkilling; //开始触摸 virtual bool onTouchBegan(Touch *pTouch,Event *pEvent); //触摸结束 virtual void onTouchEnded(Touch *pTouch,Event *pEvent); private: Sprite *fore;//fore是较亮的图片 Sprite *back;//back是较暗的图片 ProgressTimer *pt;//技能效果 }; #endif /* defined(__Fight__SkillButton__) */
SkillButton.cpp
// // SkillButton.cpp // Fight // // Created by Cytzrs on 15/2/4. // // #include "SkillButton.h" SkillButton* SkillButton::create(const char* fore_name,const char* back_name){ SkillButton* ret = new SkillButton(); //这样写更安全一些 if(ret&&ret->init(fore_name,back_name)){ ret->autorelease(); return ret; } CC_SAFE_DELETE(ret);//安全删除 return nullptr; } bool SkillButton::init(const char* fore_name,const char* back_name) { if(!Layer::init()){ return false; } fore=Sprite::create(fore_name);//fore_name是较亮的图片 this->addChild(fore,1); back=Sprite::create(back_name);//back_name是较暗的图片 pt=ProgressTimer::create(back); this->addChild(pt,2); auto listener = EventListenerTouchOneByOne::create(); listener->onTouchBegan = CC_CALLBACK_2(SkillButton::onTouchBegan,this); listener->onTouchEnded = CC_CALLBACK_2(SkillButton::onTouchEnded,this); Director::getInstance()->getEventDispatcher()->addEventListenerWithSceneGraPHPriority(listener,this); return true; } //开始冷却技能 void SkillButton::BeginSkill() { //转圈的CD实现 // pt->setType(cocos2d::ProgressTimerType(kCCProgressTimerTypeRadial)); pt->setType(ProgressTimer::Type::RADIAL); ProgressTo *waittime=ProgressTo::create(8,100); //创建回调动作,技能冷却结束后调用EndSkill() CallFunc* callFunc=CCCallFunc::create(CC_CALLBACK_0(SkillButton::EndSkill,this)); //创建连续动作 auto act = Sequence::create(waittime,callFunc,NULL); pt->setVisible(true); IsSkilling=true; pt->runAction(act); } //冷却技能结束后 void SkillButton::EndSkill() { // pt->setVisible(false); pt->setPercentage(0.0f); IsSkilling=false; // NotificationCenter::sharedNotificationCenter()->postNotification("jian_xue"); NotificationCenter::getInstance()->postNotification("jian_xue"); } //判断是否点击的范围为精灵 如果是则执行动作 void SkillButton::onTouchEnded(Touch *pTouch,Event *pEvent) { if(IsSkilling) return; //判断是否点击在精灵上面 Point touchPoint = convertTouchToNodeSpace(pTouch); if(fore->boundingBox().containsPoint(touchPoint)) { BeginSkill(); log("NotificationCenter::getInstance()->postNotification(jian_xue);"); } } //返回true表示支持触摸 返回false表示忽略 bool SkillButton::onTouchBegan(Touch *pTouch,Event *pEvent) { return true; }工程源码 PS:多写博客,帮助自己,方便他人! 原文链接:https://www.f2er.com/cocos2dx/344509.html