SkillButton 技能冷却

#pragma once
#include "cocos2d.h"
USING_NS_CC;
class SkillButton :public Node
{
public:
 SkillButton();
 ~SkillButton();                            //技能标记
 static SkillButton * createSkillButton(float skillCD,const char* normalImage,const char* clikImage,const char* maskImage,int tag);
 bool init(float skillCD, const char* normalImage, const char* clikImage, const char* maskImage,int tag);
 void skillClikCallBack(Ref* obj); //单击回调
 void skilCoolDownCallBack(Node* node); /** 技能冷却完毕回调*/
private:
 MenuItemImage * _itemSkill;   // 技能按钮
 Menu * _menuSkill;      // 技能按钮所在menu
 Sprite * _mask;      // 蒙板精灵,黑色半透明(这个是为了显示一个冷却计时效果)
 ProgressTimer * _ProgressTimer;    // 时间进度条精灵(360度旋转)
 // CD时间
 CC_SYNTHESIZE(float, mCDtime, CDtime);
};
#include "SkillButton.h"
SkillButton::SkillButton()
{
 _mask = NULL;
 _itemSkill = NULL;
 _menuSkill = NULL;
 _ProgressTimer = NULL;
 mCDtime = 1.0f;
}
SkillButton::~SkillButton()
{
 
}
SkillButton * SkillButton::createSkillButton(float skillCD, const char* normalImage, const char* clikImage, const char* maskImage,int tag)
{
 SkillButton * skill = new SkillButton();
 if (skill && skill->init(skillCD,normalImage,clikImage,maskImage,tag))
 {
  skill->autorelease();
  return skill;
 }
 else
 {
  CC_SAFE_DELETE(skill);
  skill = NULL ;
 }
}
bool SkillButton::init(float skillCD, const char* normalImage, const char* clikImage, const char* maskImage,int tag)
{
 // Notice:添加child时要注意上下层
 // 最下方是CCMenuItemImage 其次是模版图片 最上方是CCProgressTimer
 // 添加技能按钮
 _itemSkill = MenuItemImage::create(normalImage, clikImage, CC_CALLBACK_1(SkillButton::skillClikCallBack, this));
 _itemSkill->setPosition(Vec2::ZERO);
 _itemSkill->setTag(tag);
 _menuSkill = Menu::create(_itemSkill,NULL);
 _menuSkill->setPosition(Vec2::ZERO);
 this->addChild(_menuSkill);
 // 添加阴影模版
    _mask = Sprite::create(maskImage);
 _mask->setPosition(Vec2::ZERO);
 _mask->setVisible(false);
 _mask->retain();
 this->addChild(_mask);
 // 添加旋转进度条精灵
 auto sp = Sprite::create(normalImage);
 _ProgressTimer = ProgressTimer::create(sp);
 
 _ProgressTimer->setPosition(Vec2::ZERO);
 _ProgressTimer->setVisible(false);
 this->addChild(_ProgressTimer);
 this->setCDtime(skillCD);
 return true;
}
void SkillButton::skillClikCallBack(Ref* obj) //单击回调
{
 // 冷却计时,即时状态技能按钮不可点击
   _itemSkill->setEnabled(false);
   // 模版可见
   _mask->setVisible(true);
   // 设置精灵进度条为顺时针
   _ProgressTimer->setVisible(true);
   _ProgressTimer->setType(ProgressTimer::Type::RADIAL);
   //准备一个5秒旋转360度的动画(逐渐覆盖半透模板形成冷却效果;这里进行计时冷却动画的实现和时间控制)
   auto action_progrees_to = ProgressTo::create(mCDtime,100);
   auto action_call_back = CallFuncN::create(CC_CALLBACK_1(SkillButton::skilCoolDownCallBack,this));
   _ProgressTimer->runAction(Sequence::create(action_progrees_to,action_call_back,NULL));
   MenuItemImage* item = (MenuItemImage*)obj;
   switch (item->getTag())
   {
   case 1:
   {
    CCLOG("item 1");
   }
   break;
   case 2:
   {
    CCLOG("item 2");
   }
   break;
   case 3:
   {
    CCLOG("item 3");
   }
   break;
   case 4:
   {
    CCLOG("item 4");
   }
   break;
   default:
    break;
   }
}
void SkillButton::skilCoolDownCallBack(Node* node) /** 技能冷却完毕回调*/
{
 // 设置蒙板不可见
 _mask->setVisible(false);
 // 进度条技能不可见
 _ProgressTimer->setVisible(false);
 //重置进度为0
 _ProgressTimer->setPercentage(0);
 // 按钮置为可用
 _itemSkill->setEnabled(true);
}

这里调用 技能类
#include "OperateLayer.h"
#include "SkillButton.h"
OperateLayer::OperateLayer()
{
}
OperateLayer::~OperateLayer()
{
}
bool OperateLayer::init()
{
 if (!Layer::init())
 {
  return false;
 }
    auto winSize = Director::getInstance()->getWinSize();
    auto _skill_1 = SkillButton::createSkillButton(10, "Spell_Holy_BlessingOfStrength.jpg", "Spell_Holy_BlessingOfStrength.jpg", "stencil.png",1);
    _skill_1->setPosition(Vec2(winSize.width - 42, 50));
    this->addChild(_skill_1);
 auto _skill_2 = SkillButton::createSkillButton(8,"Spell_Nature_ThunderClap.jpg","Spell_Nature_ThunderClap.jpg","stencil.png",2);
 _skill_2->setPosition(Vec2(_skill_1->getPositionX() - 74, 50));
 this->addChild(_skill_2);
 auto _skill_3 = SkillButton::createSkillButton(5, "Spell_Fire_FlameTounge.jpg", "Spell_Fire_FlameTounge.jpg", "stencil.png",3);
 _skill_3->setPosition(Vec2(_skill_2->getPositionX() - 74 , 50));
 this->addChild(_skill_3);
 auto _skill_4 = SkillButton::createSkillButton(3, "Spell_Holy_AuraOfLight.jpg", "Spell_Holy_AuraOfLight.jpg", "stencil.png",4);
 _skill_4->setPosition(Vec2(_skill_3->getPositionX() - 74, 50));
 this->addChild(_skill_4);
 return true;
}
时间: 2024-12-17 05:29:12

SkillButton 技能冷却的相关文章

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

这里是Evankaka的博客,欢迎大家前来讨论与交流------      转载请注明出处http://blog.csdn.net/evankaka/article/details/42747719 本文将主要来实现游戏开发过程中,技能冷却的实现,一个按钮点一次后,就会有一个冷却时间,得等冷却时间过了之后,你才能再次点击,一般这是实现特殊技能的.在这里,我也自己写了一个类,非常方便,只要把这个类加到你的工程中,加两张图片,就可以实现功能了. cocos2d-x版本:2.2.5 工程环境:wind

NGUI的技能冷却实现

使用NGUI实现技能冷却的原理是这样的:在表示技能的Sprite上加一个半透明的Sprite,将类型设置为filled类型,Fill Dir设置为Radial360,通过程序调节Fill Amount就可以模拟技能从冷却到被活的一段时间内渐变的效果.如下图所示: 代码中一个标志位isCooling表示是否正在冷却,只有当按下释放技能的按键并且该标志位为false时才可以释放技能,释放完成后isCooling立即变为true,然后冷却的部分在每帧都会减少,直至完全消失.代码如下: 1 using

libgdx 制作技能冷却图标

本篇随笔记录如何制作一个技能冷却的图标.抛砖引玉了,如需实际应用还得好好整理代码. 表示技能冷却,计时等无非就两种吧,一是长条状,参照/扩展progressbar即可,另外一个就是方形或者圆形的了吧. 很多有技能条的游戏UI一般都是用的是方形技能图标,如魔兽世界,暗黑三,War3..... 在这里我们试着做一个出来,先看看效果图吧(很次,见尿了,以后可以在指针和边框上加上动画或粒子效果) 该组件分为4层,从下往上依次为:技能原图标ground,裁剪效果层,指针层,外边框.当然也可以加入更多,或者

使用NGUI制作技能冷却图标

最近在学习NGUI,有些小的知识点,个人觉得很不错,就记录下来了,毕竟好记性不如烂笔头,温故知新. 首先导入NGUI插件,插件我会在文章下面给出链接. 导入NGUI后,会在菜单栏,看到NGUI的按钮,我们首先创建一个Sprite,重命名为Skill,为其选择图集和精灵,调整Skill的大小和位置,我这里Size 为200*200. 在Hierarchy面板中选中Skill,然后再Scene面板中,右键创建一个Sprite,重命名为Filled,为其选择图集和精灵,最好选择一个单色的精灵,然后,T

NGUI技能冷却CD特效制作

其实蛮简单的今天紫龙感觉萌萌哒就详详细细地记录一下把: 首先在制作一个sprite命名为skill加一个背景图片,然后再建立一个sprite,选择一个可以挡住skill的背景的图片,然后选择Filled属性(如下图).然后在Sprite下面建立一个Label用来表示技能的按键快捷键,本例用的是R键...如下图                  因为sprite的图片挡住了skill的图片,所以给sprite的Alpha值调整到半透明,调整在color里面的属性如图(图的左边已经看到了效果):在c

用CSS模拟魔兽世界技能冷却的效果

效果演示 上面的效果看起来还不错吧.在网页里,除了用Flash,我们还是有不少方法可以实现它. 显然这种效果不复杂,一张背景图片,加上前面带有透明度的多边形图层,在脚本控制下就可以转起来了.但问题在于用什么方法来构建这个多边形? 在IE下可以用VML,其他浏览器可以用Canvas等等.虽然行的通,但都不是最简单的.仔细分析下,该效果本质就是若干个三角形拼接而成.而三角形,如果你熟悉CSS2的话,一定在哪个地方见过...句容市鄂茂钢铁 首先来看一个100*100尺寸的div,他有4条彩色的边框.当

[Unity3D]Unity3D叙利亚NGUI血液和技能的冷却效果

----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- 喜欢我的博客请记住我的名字:秦元培,我的博客地址是blog.csdn.net/qinyuanpei. 转载请注明出处,本文作者:

[Unity3D]Unity3D再叙NGUI之血条及技能冷却效果

----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- 喜欢我的博客请记住我的名字:秦元培,我的博客地址是blog.csdn.net/qinyuanpei. 转载请注明出处,本文作者:

(转)NGUI制作转圈的技能CD特效

在技能图标上面放个半透明的精灵,用来做技能冷却的特效,如下图所示,我就用NGUI中的图标来带代替. NGUI制作转圈的技能CD特效 然后修改一下特效的精灵类型,它是在技能图标上面悬浮半透明可旋转的精灵.如下图所示, Sprite Type:设置成Filled Fill Dir:设置Radial 360 . Invert Fill:顺时针旋转或者逆时针旋转. NGUI制作转圈的技能CD特效 到这里就简单了,只要在程序中动态的修改Fill Amount的数值就可以了.写了一段简单的代码,让它一直旋转