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:多写博客,帮助自己,方便他人!

相关文章

    本文实践自 RayWenderlich、Ali Hafizji 的文章《...
Cocos-code-ide使用入门学习地点:杭州滨江邮箱:appdevzw@1...
第一次開始用手游引擎挺激动!!!进入正题。下载资源1:从C...
    Cocos2d-x是一款强大的基于OpenGLES的跨平台游戏开发...
1.  来源 QuickV3sample项目中的2048样例游戏,以及最近《...
   Cocos2d-x3.x已经支持使用CMake来进行构建了,这里尝试...