Cocos2d-x技能冷却还要等多久?---之游戏开发《赵云要格斗》(9)
来源:互联网 发布:dk系列图书 知乎 编辑:程序博客网 时间:2024/06/02 08:02
这里是Evankaka的博客,欢迎大家前来讨论与交流~~~~~~
转载请注明出处http://blog.csdn.net/evankaka/article/details/42747719
本文将主要来实现游戏开发过程中,技能冷却的实现,一个按钮点一次后,就会有一个冷却时间,得等冷却时间过了之后,你才能再次点击,一般这是实现特殊技能的。在这里,我也自己写了一个类,非常方便,只要把这个类加到你的工程中,加两张图片,就可以实现功能了。
cocos2d-x版本:2.2.5
工程环境:windows7+VS2010
打开方式:将工程放在cocos2d-x安装目录下的project文件夹下用VS打开
(源码免费下载)
本文效果:目录
一、技能冷却自定义类
二、使用方法
三、效果
一、技能冷却自定义类
这里的技能冷却,其实核心就是两个CCsprite,然后一个CCProgressTimer来实现的,下面这是实现的一个代码,可以把图片改改,就可以看到效果
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
#include "cocos2d.h"#include "cocos-ext.h"USING_NS_CC;USING_NS_CC_EXT; class SkillButton:public cocos2d::CCLayer{public://创建冷却技能按钮,create 和 init 是连在一起的,调用create的时候必然会调用initstatic 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;//技能效果};
然后是实现文件SkillButton.cpp
#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(!CCLayer::init()){return false;}this->setTouchEnabled(true);//开启触摸fore=CCSprite::create(fore_name);//fore_name是较亮的图片 this->addChild(fore,1); back=CCSprite::create(back_name);//back_name是较暗的图片 pt=CCProgressTimer::create(back);this->addChild(pt,2); return true;}//开始冷却技能void SkillButton::BeginSkill(){//转圈的CD实现 pt->setType(cocos2d::CCProgressTimerType(kCCProgressTimerTypeRadial)); CCProgressTo *waittime=CCProgressTo::create(8,100);//创建回调动作,技能冷却结束后调用EndSkill()CCCallFunc* callFunc=CCCallFunc::create(this,callfunc_selector(SkillButton::EndSkill));//创建连续动作CCActionInterval* act=CCSequence::create(waittime,callFunc,NULL);pt->setVisible(true);IsSkilling=true;pt->runAction(act); }//冷却技能结束后void SkillButton::EndSkill(){pt->setVisible(false);IsSkilling=false;CCNotificationCenter::sharedNotificationCenter()->postNotification("jian_xue");}//判断是否点击的范围为精灵 如果是则执行动作 void SkillButton::ccTouchEnded(CCTouch *pTouch, CCEvent *pEvent) { if(IsSkilling)return;//判断是否点击在精灵上面CCPoint touchPoint = convertTouchToNodeSpace(pTouch); if(fore->boundingBox().containsPoint(touchPoint)) { BeginSkill();} } //返回true表示支持触摸 返回false表示忽略 bool SkillButton::ccTouchBegan(CCTouch *pTouch, CCEvent *pEvent) { return true; } ///注册触摸代理支持,其中第二个参数为触摸的响应等级 值越小 响应等级越高 void SkillButton::registerWithTouchDispatcher() { CCDirector::sharedDirector()->getTouchDispatcher()->addTargetedDelegate(this,0,false);//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);这里的两张图片是
和
另外,我换了张攻击按钮图片
三 、效果
下面我们来看看效果
- Cocos2d-x技能冷却还要等多久?---之游戏开发《赵云要格斗》(9)
- Cocos2d-X 3.4版-技能冷却按钮《赵云要格斗》
- 【Cocos2d-x游戏引擎开发笔记(9)】实现DotA的技能冷却效果(转)
- 【Cocos2d-x游戏引擎开发笔记(9)】实现DotA的技能冷却效果
- 【Cocos2d-x游戏引擎开发笔记(9)】实现DotA的技能冷却效果
- Cocos2d-x虚拟摇杆控制精灵上下左右运动----之游戏开发《赵云要格斗》(1)
- Cocos2d-x自定义按钮类控制精灵攻击----之游戏开发《赵云要格斗》(2)
- Cocos2d-x 自定义血条及其美化----之游戏开发《赵云要格斗》(4)
- Cocos2d-x血条跟随怪物运动----之游戏开发《赵云要格斗》(5)
- Cocos2d-x怪物智能AI怪物也有智商----之游戏开发《赵云要格斗》(6)
- Cocos2d-x扣血飘字特效用完你就消失--之游戏开发《赵云要格斗》(8)
- Cocos2d-x观察者模式其实很简单!!--之游戏开发《赵云要格斗》(13)
- Cocos2d-x使用Cocos Studio制作界面并应用---之游戏开发《赵云要格斗》(11)
- Cocos2d-x场景切换我换换换!----之游戏开发《赵云要格斗》(12)
- Cocos2d-x显示中文与字幕滚动--之游戏开发《赵云要格斗》(14)
- cocos2d-x 技能冷却
- cocos2d-x UI之技能冷却按钮 (转)
- cocos2d-x UI之技能冷却按钮
- Largest Number
- CentOS 7 编译安装Redis
- xxx is not in the sudoers file.This incident will be reported.的解决方法
- LightOJ - 1049 One Way Roads
- #ifdef __cplusplus extern "C" { #endif”的定义
- Cocos2d-x技能冷却还要等多久?---之游戏开发《赵云要格斗》(9)
- 注册
- 有人能解释android中px,dip,dp和sp这些单位的不同么?
- OTG中的ID脚风波释疑 .
- 不给发货发货人
- ARC 快速枚举Enumeration 属性错误
- Ubuntu防火墙设置
- 自定义readLine
- C语言中的malloc/free与C++中的new/delete的区别