`
buerkai
  • 浏览: 169571 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

cocos2d -x 技能按键实现

 
阅读更多
自己写了一个技能栏的工具,希望对各位游戏开发者有用。部分函数使用了我上一篇文章中的hashtable。

测试代码如下,附件中为测试图片,部分图片来自网络,仅供学习参考,请勿商用,后果自负。

CCSprite *normal=CCSprite::spriteWithFile("fire_normal.png");
CCSprite *select=CCSprite::spriteWithFile("fire_press.png");
    CCSprite *testselectbg=CCSprite::spriteWithFile("r1-hd.png");
testselectbg->setOpacity(100);
SkillBar *sb=SkillBar::createSkillBar(normal,select,testselectbg,10.0f,CCCallFuncN::actionWithTarget(this,callfuncN_selector(HelloWorld::menuCloseCallback)));
sb->addSkillBar(CCSprite::spriteWithFile("fire_press.png"),CCSprite::spriteWithFile("fire_normal.png"),CCSprite::spriteWithFile("r1-hd.png"),4.0f,CCCallFuncN::actionWithTarget(this,callfuncN_selector(HelloWorld::menuCloseCallback)));
sb->addSkillBar(CCSprite::spriteWithFile("fire_press.png"),CCSprite::spriteWithFile("fire_normal.png"),CCSprite::spriteWithFile("r1-hd.png"),8.0f,CCCallFuncN::actionWithTarget(this,callfuncN_selector(HelloWorld::menuCloseCallback)));
this->addChild(sb);
CCSprite * gamebg=CCSprite::spriteWithTexture(CCTextureCache::sharedTextureCache()->textureForKey(png_playbg));
sb->setSkillBarBg(gamebg);
sb->setPosition(ccp(0,screenSize.height/2));


//-------------------------------------------------------------------------------
#ifndef SKILLBUTTON_H_
#define SKILLBUTTON_H_

#include "cocos2d.h"
using namespace cocos2d;

class SkillBar :public CCLayer
{
private:
CCSprite * coolbg;//冷却半透明
CCProgressTo *action_progress;//进度动作
CCProgressTimer *progressTimer;//进度条
CCMenuItemSprite * skill_item;//技能按钮
CCMenu *skills;//技能

int count;//记录技能个数
float cellwidth;
float cellheight;

public:
//创建一个技能按钮
static SkillBar * createSkillBar(CCSprite *normal,CCSprite *select,CCSprite *bg,float durtaion,CCCallFunc *callback );

void setSkillBarBg(CCSprite *bg);
//初始化技能条
void initSkillBar(CCSprite *normal,CCSprite *select,CCSprite *bg,float durtaion,CCCallFunc* callback );
//添加一个技能按钮
void addSkillBar(CCSprite *normal,CCSprite *select,CCSprite *bg,float durtaion,CCCallFunc* callback);
private:
//技能点击后的回调
void SkillClickCallBack(CCObject* object);
//技能冷却完成时的回调
void SkillCoolDownCallBack(CCNode* node,void *object);

};
#endif





//-------------------------------------------------------------------------------



#include "SkillBar.h"
//工具类
//--------------------------------------------------------------------------------
static std::map<std::string,std::string> datamap;

/*
*@description: 存入一个string类型的数据
*@author: buerkai.iteye.com
*@fullName: put
*@param1: key
*@param2: value
*/
static void put(std::string key,std::string value)
{
if(datamap.find(key)!=datamap.end()){
datamap.find(key)->second=value;
}else{
datamap.insert(make_pair(key,value));
}

}


/*
*@description: 取一个string类型的数据,没有返回为空串
*@author: buerkai.iteye.com
*@fullName: get
*@param1: key
*/
static std::string get(std::string key)
{
if(datamap.find(key)!=datamap.end()){
return datamap.find(key)->second;
}else{
return "";
}
}


/*
*@description: 删除string类型的数据
*@author: buerkai.iteye.com
*@fullName: deleteValue
*@param1: key
*/
static void deleteValue(std::string key){
if(datamap.find(key)!=datamap.end()){
datamap.erase(key);
}
}

/*
*@description: 存入一个Int类型的数据
*@author: buerkai.iteye.com
*@fullName: put
*@param1: key
*@param2: value
*/
static void putInt(std::string key,int value)
{
char tt[10];
put(key,itoa(value,tt,10));
}

/*
*@description: 取一个Int类型的数据,没有返回0
*@author: buerkai.iteye.com
*@fullName: getInt
*@param1: key
*/
static int getInt(std::string key)
{
std::string dd=get( key);
if(dd==""){
return 0;
}else{
return std::atoi(dd.c_str());
}
}

/*
*@description: 存入一个Float类型的数据
*@author: buerkai.iteye.com
*@fullName: putFloat
*@param1: key
*@param2: value
*/
static void putFloat(std::string key,float value)
{
char tmpstr[32];
memset(tmpstr,'\0',32);
    sprintf(tmpstr,"%f",value);
put(key,std::string(tmpstr));
}


/*
*@description: 取一个Float类型的数据,没有返回0.0f
*@author: buerkai.iteye.com
*@fullName: getFloat
*@param1: key
*/
static float getFloat(std::string key)
{
std::string dd=get( key);
if(dd==""){
return 0.0f;
}else{
return std::atof(dd.c_str());
}
}



/*
*@description: 存入一个bool类型的数据
*@author: buerkai.iteye.com
*@fullName: putBool
*@param1: key
*@param2: value
*/
static void putBool(std::string key,bool value)
{
std::string tt="0";
if(value)
{
tt="1";
}
put(key,std::string(tt));
}



/*
*@description: 取一个bool类型的数据,没有返回false
*@author: buerkai.iteye.com
*@fullName: getBool
*@param1: key
*/
static bool getBool(std::string key)
{
std::string dd=get( key);
if(dd==""||dd=="0"){
return 0;
}else if(dd=="1"){
return 1;
}
return 0;
}
//--------------------------------------------------------------------------------
//
/*
*@description: 创建一个技能条
*@author: buerkai.iteye.com
*@fullName: SkillBar::createSkillBar
*@return: SkillBar
*@param1: normal,技能按键正常情况的sprite
*@param2: select,技能按键选中情况的sprite
*@param3: bg,技能按键冷却情况的sprite
*@param4: durtaion,冷却时间
*@param5: callback,点击技能按键后的回调函数
*/
SkillBar * SkillBar::createSkillBar(CCSprite *normal,CCSprite *select,CCSprite *bg,float durtaion,CCCallFunc* callback ){
SkillBar *sb=new SkillBar();
sb->initSkillBar(normal,select,bg,durtaion,callback);
return sb;
}



/*
*@description: 初始化技能条
*@author: buerkai.iteye.com
*@fullName: SkillBar::initSkillBar
*@return: SkillBar
*@param1: normal,技能按键正常情况的sprite
*@param2: select,技能按键选中情况的sprite
*@param3: bg,技能按键冷却情况的sprite
*@param4: durtaion,冷却时间
*@param5: callback,点击技能按键后的回调函数
*/
void SkillBar::initSkillBar(CCSprite *normal,CCSprite *select,CCSprite *bg,float durtaion,CCCallFunc* callback ){
count=0;
skill_item=CCMenuItemSprite::itemWithNormalSprite(normal,select,normal,this,menu_selector(SkillBar::SkillClickCallBack));
skill_item->setPosition(CCPointZero);
skill_item->setUserObject(callback);
skill_item->setAnchorPoint(ccp(0.0f,0.5f));


skills=CCMenu::menuWithItems(skill_item,NULL);
skills->setPosition(CCPointZero);
skills->setAnchorPoint(ccp(0.0f,0.5f));
this->addChild(skills);

cellwidth=normal->getTexture()->getContentSize().width;
cellheight=normal->getTexture()->getContentSize().height;

progressTimer= CCProgressTimer::progressWithSprite(bg);
progressTimer->setPosition(CCPointZero);
progressTimer->setTag(count);
progressTimer->setAnchorPoint(ccp(0.0f,0.5f));
char tmpstr[32];
memset(tmpstr,'\0',32);
sprintf(tmpstr,"%d",count);
putFloat(tmpstr,durtaion);

skill_item->setUserData(progressTimer);
this->addChild(progressTimer);
progressTimer->setVisible(false);

this->setContentSize(CCSizeMake((count+1)*cellwidth,cellheight));
}

/*
*@description: 设置技能条背景
*@author: buerkai.iteye.com
*@fullName: SkillBar::setSkillBarBg
*@return: void
*@param1: bg,技能背景的sprite
*/
void SkillBar::setSkillBarBg(CCSprite *bg){
CCSize size=this->getContentSize();
CCSize bgsize=bg->getContentSize();
bg->setScaleX(size.width/bgsize.width);
bg->setScaleY(size.height/bgsize.height);
this->addChild(bg,-1);
bg->setPosition(CCPointZero);
bg->setAnchorPoint(ccp(0.0f,0.5f));

}



/*
*@description: 添加一个技能按钮
*@author: buerkai.iteye.com
*@fullName: SkillBar::addSkillBar
*@return: SkillBar
*@param1: normal,技能按键正常情况的sprite
*@param2: select,技能按键选中情况的sprite
*@param3: bg,技能按键冷却情况的sprite
*@param4: durtaion,冷却时间
*@param5: callback,点击技能按键后的回调函数
*/
void SkillBar::addSkillBar(CCSprite *normal,CCSprite *select,CCSprite *bg,float durtaion,CCCallFunc* callback){
count++;
skill_item=CCMenuItemSprite::itemWithNormalSprite(normal,select,normal,this,menu_selector(SkillBar::SkillClickCallBack));
skill_item->setUserObject(callback);
skills->addChild(skill_item);
skill_item->setPosition(ccp(count *cellwidth,0));
skill_item->setAnchorPoint(ccp(0.0f,0.5f));

progressTimer= CCProgressTimer::progressWithSprite(bg);
progressTimer->setPosition(ccp(count *cellwidth,0));
progressTimer->setTag(count);
progressTimer->setAnchorPoint(ccp(0.0f,0.5f));
char tmpstr[32];
memset(tmpstr,'\0',32);
sprintf(tmpstr,"%d",count);
putFloat(tmpstr,durtaion);

this->addChild(progressTimer);
progressTimer->setVisible(false);
skill_item->setUserData(progressTimer);


this->setContentSize(CCSizeMake((count+1)*cellwidth,cellheight));
}



/*
*@description: 技能按键回调函数
*@author: buerkai.iteye.com
*@fullName: SkillBar::SkillClickCallBack
*@return: void
*@param1: object,回调函数返回的CCMenuItemSprite *
*/
void SkillBar::SkillClickCallBack(CCObject* object){
skill_item=(CCMenuItemSprite*)object;
skill_item->setEnabled(false);

progressTimer=(CCProgressTimer*)skill_item->getUserData();
progressTimer->setType(kCCProgressTimerTypeRadial);
progressTimer->setVisible(true);

int id=progressTimer->getTag();
char tmpstr[32];
memset(tmpstr,'\0',32);
sprintf(tmpstr,"%d",id);
float duration=getFloat(tmpstr);

CCCallFuncND* action_call_back = CCCallFuncND::actionWithTarget(this,callfuncND_selector(SkillBar::SkillCoolDownCallBack),(void *)object);
action_progress=CCProgressTo::actionWithDuration(duration, 100);
progressTimer->runAction(CCSequence::actions(action_progress,action_call_back,NULL));
CCCallFunc *back=(CCCallFunc*)skill_item->getUserObject();
back->execute();

}


/*
*@description: 技能冷却完成时的回调
*@author: buerkai.iteye.com
*@fullName: SkillBar::SkillCoolDownCallBack
*@return: void
*@param1: node,回调函数返回的CCNode *
*@param2: object,回调函数返回的CCMenuItemSprite *
*/
void SkillBar::SkillCoolDownCallBack(CCNode* node,void *object){
skill_item=(CCMenuItemSprite*)object;
progressTimer=(CCProgressTimer*)skill_item->getUserData();
skill_item->setEnabled(true);
progressTimer->setVisible(false);
}


转载请注明出处:http://buerkai.iteye.com

  • 大小: 20.5 KB
  • 大小: 21.1 KB
  • 大小: 10.8 KB
分享到:
评论

相关推荐

    基于cocos2d-x的俄罗斯方块游戏源码

    通过分析和学习这个基于cocos2d-x的俄罗斯方块源码,不仅可以了解cocos2d-x的基本用法,还能深入理解游戏开发中的基本原理和技巧,对提升游戏开发技能大有裨益。对于毕业设计或课程设计来说,这样的项目既具有实践性...

    Cocos2d-X 3D跑酷小游戏

    通过分析这个3D跑酷游戏的代码,开发者可以学习到如何利用Cocos2d-X实现3D游戏的各个方面,从而提升自己的游戏开发技能。同时,提供的视频可以帮助理解游戏的实际运行效果,对比代码与实际表现,有助于深化学习。

    cocos2d-x贪食蛇游戏-沈大海cocos2d-x

    《cocos2d-x贪食蛇游戏开发详解》 cocos2d-x是一款跨平台的2D游戏开发框架,由...通过这个项目,开发者不仅可以学习到cocos2d-x的基本用法,也能了解到游戏开发的基本流程和设计思路,对于提升游戏开发技能大有裨益。

    cocos2d-x3.2贪吃蛇游戏代码与资源

    在cocos2d-x3.2中,界面的切换可以通过Scene类来实现。Scene是游戏中的一个独立单元,可以理解为一个屏幕或者一个游戏状态。开发者可以创建多个Scene对象,并通过Director类的replaceScene或pushScene方法来实现场景...

    Cocos2D-x 实现坦克大战

    《Cocos2D-x 实现坦克大战》是一个项目,旨在帮助初学者通过模仿经典游戏“坦克大战”来学习Cocos2D-x游戏引擎。Cocos2D-x是一款跨平台的游戏开发框架,支持多种操作系统,包括iOS、Android以及Windows等。这个项目...

    cocos2d-x2.04横版格斗游戏

    4. **动画系统**:Cocos2d-x内置了动作(Action)和动画(Animation)系统,允许开发者创建各种动态效果,如角色的攻击、移动和技能释放。 5. **事件处理**:通过事件监听器,游戏可以响应用户输入,例如触摸屏幕或...

    cocos2d-x 仿马里奥小游戏

    5. **事件处理**:cocos2d-x提供了一套完整的事件处理系统,使得游戏可以根据用户的触摸或按键输入做出反应。例如,玩家按下跳跃键时,角色会执行跳跃动作。 6. **脚本支持**:cocos2d-x支持Lua和JavaScript作为...

    仿黑暗世界cocos2d-x 源码

    《仿黑暗世界cocos2d-x源码》是一款基于cocos2d-x游戏引擎开发的项目,旨在帮助开发者学习和理解cocos2d-x的编程架构。...对于希望提升cocos2d-x技能或着手开发自己游戏的人来说,这是一个宝贵的学习资源。

    cocos2d-x源码

    《cocos2d-x源码解析与应用》 cocos2d-x是一个开源的游戏开发框架,主要用于构建2D游戏、演示程序和其他交互式应用程序。...对于希望提升游戏开发技能或者对cocos2d-x感兴趣的开发者来说,这是一个宝贵的实践案例。

    cocos2d-x泡泡堂

    【cocos2d-x 泡泡堂】是一款基于cocos2d-x引擎开发的经典泡泡龙游戏,它展示了如何使用cocos2d-x游戏框架来构建一个完整的2D游戏。cocos2d-x是一个开源的游戏开发框架,广泛应用于跨平台游戏开发,支持iOS、Android...

    Cocos2d-X大鱼吃小鱼源码

    总结,“大鱼吃小鱼”源码提供了一个生动的实例,让开发者能够在实践中学习Cocos2d-X框架,并提升游戏开发技能。通过分析和修改源码,不仅可以加深对游戏开发的理解,还能锻炼解决问题的能力,对于个人的技术成长...

    ClassesDIno_game_Dinosaurs_cocos2d-x_

    《恐龙游戏:基于cocos2d-x的编程实践》 在IT行业中,游戏开发是一项...通过分析和学习这个项目,开发者不仅可以提升在cocos2d-x框架下的编程技能,还能掌握游戏开发的整体流程和技巧,为自己的游戏创作打下坚实基础。

    cocos2d-x 俄罗斯方块例子Tetris源码

    《cocos2d-x实现的俄罗斯方块游戏源码解析》 在编程世界中,cocos2d-x是一个广泛使用的2D游戏开发框架,它基于C++,支持跨平台开发,包括iOS、Android、Windows等多个操作系统。这个"俄罗斯方块"的例子是利用cocos...

    cocos2d-x魔塔游戏源码

    通过深入研究这个源码,你可以了解到cocos2d-x游戏开发的方方面面,从基础的图形绘制到复杂的逻辑处理,这对于想要提升游戏开发技能或者对魔塔类游戏设计感兴趣的人来说,是一份宝贵的教育资源。

    超级玛丽(cocos2d-x版)

    Cocos2d-x的事件监听机制使得游戏能够响应用户的触摸或按键输入。 5. **音频管理**:游戏中的音效和背景音乐是提升游戏体验的重要组成部分。Cocos2d-x提供了音频管理模块,可以播放、暂停、停止和循环音频文件。 6...

    炸弹人(cocos2d-x 3.2)

    《炸弹人:基于Cocos2d-x 3.2的游戏开发源码解析》 ...通过对这个源码的学习,开发者不仅可以提升Cocos2d-x的使用技能,也能对游戏开发的整个流程有更深入的认识,为创建自己的游戏奠定坚实基础。

    cocos2d-x 小游戏 坦克大战

    通过分析和学习这款游戏的源代码,开发者可以深入理解Cocos2d-x的底层工作原理,提升游戏开发技能,并且能够借鉴其中的AI策略和游戏设计思路,应用到自己的项目中。同时,这也是一个很好的实战案例,有助于理解A星...

    cocos2d-0.99.5-x-0.8.2.zip

    这个压缩包"0.99.5-x-0.8.2"包含的源码是Cocos2D的内部实现,对于开发者来说,通过阅读和理解源码,可以深入学习其设计原理,提升自己的编程技能,甚至为框架贡献新的功能或改进。 总的来说,Cocos2D-0.99.5-x-...

    cocos2d-x 别踩白块源码

    4. **事件处理**:Cocos2d-x使用事件监听器来响应用户的触摸或按键操作。例如,玩家点击屏幕时,会触发一个事件,游戏逻辑根据这个事件更新状态。 5. **资源管理**:`resource`文件夹包含了游戏所需的图像、音频和...

Global site tag (gtag.js) - Google Analytics