这里为需要注意的是开启触屏的方法,以及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
工程源码 PS:多写博客,帮助自己,方便他人!
- //
- // 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;
- }