Cocos2d-x技能冷却还要等多久?---之游戏开发《赵云要格斗》(9)

news/2024/11/19 11:42:53/

         这里是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;//怪物种类1SkillButton* 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);
这里的两张图片是


另外,我换了张攻击按钮图片


三 、效果

下面我们来看看效果





http://www.ppmy.cn/news/377966.html

相关文章

7年加工作经验的程序员,从大厂跳槽出来,遭遇了什么?

引言 很久没写文章了&#xff0c;只是隔一两个月更新篇小说&#xff0c;回想起来&#xff0c;LZ至今工作也8年了&#xff0c;回想起来&#xff0c;一时间难免感慨&#xff0c;时间真的过的太快了。 当初在北京的4年多&#xff0c;是LZ工作中最精彩的一段经历&#xff0c;这也是…

android v7包CardView让你的列表更立体

CardView是Android 5.0之后发布的卡片效果控件&#xff0c;包&#xff1a;android.support.v7.widget.CardView 效果&#xff1a;可以实现圆角效果、阴影效果、让你的ui更立体。 列表适配器布局文件&#xff1a; <?xml version"1.0" encoding"utf-8"…

Unity制作技能冷却效果

在制作ARPG等游戏时&#xff0c;主角的技能往往需要的到冷却才能释放 本文介绍在Unity中如何简单实现技能冷却效果 【Mask组件的使用】 首先制作技能图标 创建一个UI->Image Image选择Unity自带的圆形图片 在Image下添加一个按钮作为子节点&#xff0c;并适当放大按钮…

S7-200SMART中定时器的使用方法和常见注意事项汇总

S7-200SMART中定时器的使用方法和常见注意事项汇总 S7-200 SMART指令提供了下述三种类型的定时器。 • 接通延时定时器(TON):用于定时单个时间间隔 。 • 有记忆的接通延时定时器(TONR):用于累积多个定时时间间隔的时间值。 • 断开延时定时器(TOF): 用于在 OFF(或 FAL…

牛顿冷却定律--画像时间衰减系数

牛顿冷却定律知识点转自阮一峰博客&#xff1a; http://www.ruanyifeng.com/blog/2012/03/ranking_algorithm_newton_s_law_of_cooling.html 最近在整理构建用户画像的知识点&#xff0c;其中有一个关键因子叫时间衰减系数&#xff0c;套用到了牛顿冷却定律&#xff0c;那么牛…

游戏中技能冷却效果

技能冷却效果 1.创建一个image 作为 技能背景&#xff0c;选择相应的sprite。改名为Skill1&#xff0c;添加 button组件。 2.在该image 下 在创建一个image 选择技能的sprite。 3. 复制 第二步中的image&#xff0c;改名为 fill image&#xff0c;作为 技能冷却的效果。改背景颜…

Unity学习——UGUI制作技能的冷却效果

技能冷却的原理是控制Image中的填充效果为Filled时的FilledAmount属性值的依次减少&#xff0c;从而产生技能的冷却效果。 首先我们需要准备素材&#xff0c;技能的背景图&#xff08;SkillBg&#xff09;&#xff0c;技能图&#xff08;Image&#xff09;&#xff0c;冷却的…

区块链:7 个步骤入门区块链

2017 年是比特币大爆发的一年。在潜水这么多年之后&#xff0c;比特币的价格一下子从 1000 美元左右飞涨至将近 20000 美元。多少人摇身一变&#xff0c;成了“密码学货币交易专家”。 赶上好时候确实可以狠赚一笔&#xff0c;不过醒醒吧&#xff0c;盛宴已散。 -2013 年 10 月…