Cocos2d-X 3.4版-技能冷却按钮《赵云要格斗》

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值