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