这里是Evankaka的博客,欢迎大家前来讨论与交流~~~~~~
转载请注明出处http://blog.csdn.net/evankaka/article/details/42747719
本文将主要来实现游戏开发过程中,技能冷却的实现,一个按钮点一次后,就会有一个冷却时间,得等冷却时间过了之后,你才能再次点击,一般这是实现特殊技能的。在这里,我也自己写了一个类,非常方便,只要把这个类加到你的工程中,加两张图片,就可以实现功能了。
cocos2d-x版本:2.2.5
工程环境:windows7+VS2010
打开方式:将工程放在cocos2d-x安装目录下的project文件夹下用VS打开
本文效果:
目录
一、技能冷却自定义类
二、使用方法
三、效果
一、技能冷却自定义类
这里的技能冷却,其实核心就是两个CCsprite,然后一个CCProgressTimer来实现的,下面这是实现的一个代码,可以把图片改改,就可以看到效果
<span style="font-size:18px;"> CCSprite *s=CCSprite::create("skill_back.png");//skill_back.png是较亮的图片 CCProgressTimer *pt=CCProgressTimer::create(s); pt->setPosition(ccp(200,200)); //转圈的CD实现 pt->setType(cocos2d::CCProgressTimerType(kCCProgressTimerTypeRadial)); //从中间到外的出现 //pt->setType(cocos2d::CCProgressTimerType(kCCProgressTimerTypeBar)); this->addChild(pt,4); CCProgressTo *t=CCProgressTo::create(8,100); pt->runAction(CCRepeatForever::create(t)); </span>
上面的代码我们肯定不能直接用,为啥,因为它是一个无限播放的过程,而且,我们要让触摸到按钮时,它才技能冷却。所以这里,我就可以封装了一个技能冷却的类,
具体的原理其实就是给精灵添加触摸事件,这是非常关键的!
下面,来看下设计的代码头文件 SkillButton.h
<pre name="code" class="cpp"><span style="font-size:18px;">#include "ControlButton.h" #include "cocos2d.h" USING_NS_CC; class SkillButton:public cocos2d::CCLayer{ 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 ccTouchBegan(CCTouch *pTouch, CCEvent *pEvent); //触摸结束 virtual void ccTouchEnded(CCTouch *pTouch, CCEvent *pEvent); ///注册触摸代理支持 void registerWithTouchDispatcher(); private: CCSprite *fore;//fore是较亮的图片 CCSprite *back;//back是较暗的图片 CCProgressTimer *pt;//技能效果 };</span>
然后是实现文件SkillButton.cpp
#include "FlyWord.h" FlyWord* FlyWord::create(const char *word,const int fontSize,CCPoint begin){ FlyWord* ret = new FlyWord(); //这样写更安全一些 if(ret && ret->init(word,fontSize,begin)){ ret->autorelease(); return ret; } CC_SAFE_DELETE(ret);//安全删除 return nullptr; } bool FlyWord::init(const char *word,const int fontSize,CCPoint begin){ if(!CCNode::init()){ return false; } //初始化 _begin = begin; m_plabel = CCLabelTTF::create(word,"Marker Felt",fontSize); //设置颜色 ccColor3B RGB; RGB.r=255; RGB.g=0; RGB.b=0; m_plabel->setColor(RGB); this->addChild(m_plabel); this->setPosition(ccp(begin.x,begin.y)); //初始化完成后就开始飘字了 Flying(); return true; } //文字从下到上飘动 void FlyWord::Flying() { CCMoveBy* moveact=CCMoveBy::create(0.5f,CCPointMake(0,70));//0.5秒向上移动70 //创建回调动作,文字飘动完后 CCCallFunc* callFunc=CCCallFunc::create(this,callfunc_selector(FlyWord::Flyend)); //创建连续动作 CCActionInterval* act=CCSequence::create(moveact,callFunc,NULL); //setVisible(true); this->runAction(act); } //文字飘动后删除所有对象 void FlyWord::Flyend() { //完成之后把该对象从内存中删除掉 this->removeAllChildrenWithCleanup(true); this->removeFromParentAndCleanup(true); }
这里一定在注意添加registerWithTouchDispatcher() ,并且将CCDirector::sharedDirector()->getTouchDispatcher()->addTargetedDelegate(this,0,false);函数j里面参数设置为false,如果为true表示只有当前层能截取到触摸事件。
二、使用方法
在要用到的地方HelloWorldScene.h,添加头文件#include "SkillButton.h"
定义成员变量:
private: HRocker* rocker;//摇杆 Hero* hero;///精灵 ControlButton* btn;//按钮控件变量 Map* mymap;//地图 ProgressView *m_pProgressView; //血条 Monster *monster1;//怪物种类1 SkillButton* btn_skill;//技能按钮
然后在实现Init()函数里添加
//添加技能按钮 btn_skill=SkillButton::create("skill_back.png","skill_fore.png"); btn_skill->setPosition(ccp(visibleSize.width-150,60)); this->addChild(btn_skill,2);
这里的两张图片是
和
另外,我换了张攻击按钮图片
三 、效果
下面我们来看看效果