直插主题了,今天写了一下午,早就想要写这类似东西的,首先我不会选用CCLabelAtlas了,我直接用帧图片做。

首先我们要准备素材,我先把素材帖出来给大家:

这个是一张比较全的素材图,它包含了扣血的(第一行),加蓝的(第二行),加血的(第三行);

我们先做加血的,先把加血图片的单独提出来,取出来大家好理解下面的代码和算法!然后大家自己去拓展做加蓝的加血的!

OK,素材准备好了,那么怎么去实现组合起来的数字呢?很简单靠CCRect了;

CCSprite::create(imgurl,rect);

下面我就直接贴代码了,代码里面的注解写得很详细,我直接贴出来一边描述大家一边看;

我单独建立了MakeNumbers.cpp,MakeNumbers.h;

MakeNumbers.h如下:

#include "cocos2d.h"

USING_NS_CC;
class MakeNumbers : public cocos2d::CCSprite
{
public: CCSprite* numbers;
MakeNumbers(int attckmun);
~MakeNumbers(void);
};

MakeNumbers.cpp 如下 :

#include "MakeNumbers.h"
#include "../ImagePaths.h"
#include <string>
using namespace std;
/*
这个类主要是显示组合自定义图片类型的伤害数值。
*/
MakeNumbers::MakeNumbers(int attckmun)
{
//解析数值转化为2中格式字符串string和CCString;
char char_attckmun[] = {};
sprintf(char_attckmun,"%d",attckmun,char_attckmun);
//这个主要用途拿来作为字符和int之间的相互转换
CCString* numberstr = CCString::create(char_attckmun);
//这个拿来截取字符
string str = numberstr->getCString(); //获取整张素材图片,图片内容为-0123456789;
CCSprite* number_all = CCSprite::create(p_makenumberbd);
//获取整张图片长宽
float allwight= number_all->getContentSize().width;
float allhigth= number_all->getContentSize().height;
//获取单张图片长宽
float onewight = allwight/;
float onehigth = allhigth;
//获取第一个符号扣血-作为首张图片的底图
CCRect imgrect_moren = CCRect(,,onewight,onehigth);
numbers = CCSprite::create(p_makenumberbd,imgrect_moren); //循环解析出“-”符号号后面的具体数值伤害
for (int i = ; i < numberstr->length(); i++)
{
//依次解析每个数值大小
string nownumber = str.substr(+i,);
CCString* cc_nownumber = CCString::create(nownumber);
//将解析数值去寻找图片
CCRect imgrect_moren = CCRect(onewight*cc_nownumber->intValue()+onewight,,onewight,onehigth);
CCSprite* numbers_now = CCSprite::create(p_makenumberbd,imgrect_moren);
//将得到的图片依次尾追在“-”图片得后面
numbers_now->setPosition(ccp(numbers->getContentSize().width + numbers->getContentSize().width*i,numbers->getContentSize().height/));
numbers->addChild(numbers_now,,+i);
} } MakeNumbers::~MakeNumbers(void)
{
}

OK,比较核心的逻辑就是这几行代码了:

numbers_now->setPosition(ccp(numbers->getContentSize().width + numbers->getContentSize().width*i,numbers->getContentSize().height/2));
numbers->addChild(numbers_now,2,10+i);

最后这个添加tag必须要添加上,因为后续再做动画特效(隐藏,其他特效的不用)的时候必须得遍历tag去隐藏!

OK以上代码如果我们单独跑起来,这样使用,效果如下:

MakeNumbers* nowattcknumber = new MakeNumbers(attcknum);

还没完!这不是我们最终想要的效果,我们还得加上动画!!!

OK,cocos2d-x给我们提供的延时动作,动画方法真的太棒了,我们组合起来使用真是很完美的特效!

这里我用到了如下动画:放大缩小,淡出淡入,还有赛贝尔曲线,最后执行移除回调函数,不消耗内存,用完就释放!

下面我就直接贴上动画的代码:

/*
怪物伤害数字动画特效
*/
void SpiritsMonster::showattcknumber(int attcknum,CCSprite* monster)
{
if(attcknum>)
{
//解析数值转化为2中格式字符串string和CCString;
char char_attckmun[] = {};
sprintf(char_attckmun,"%d",attcknum,char_attckmun);
//这个主要用途拿来作为字符和int之间的相互转换
CCString* numberstr = CCString::create(char_attckmun);
//组合伤害数值
MakeNumbers* nowattcknumber = new MakeNumbers(attcknum);
//设置在怪物头上一半距离弹出伤害
nowattcknumber->numbers->setPosition(ccp(monster->getContentSize().width/,monster->getContentSize().height*1.5f));
//设置动画赛贝尔曲线
ccBezierConfig bezier;
bezier.controlPoint_1=CCPointMake(,monster->getContentSize().height*2.0f);
bezier.controlPoint_2=CCPointMake(monster->getContentSize().width/,monster->getContentSize().height);
CCActionInterval* bezier_act = CCBezierTo::create(2.5f,bezier);
//设置动画弹出放大和缩小
CCActionInterval* scale_act = CCScaleTo::create(2.0f,1.5f);
CCActionInterval* scale_actby = CCScaleBy::create(1.0f,2.0f);
//设置动画淡出淡入(开始显示,最后隐藏)
CCActionInterval* fade_actby = CCFadeIn::create(2.0f);
CCActionInterval* fade_actby2 = CCFadeOut::create(2.0f);
//最后执行移除回调函数,不消耗内存,用完就释放
CCFiniteTimeAction *actbackfun = CCCallFuncO::create(monster, callfuncO_selector(SpiritsMonster::ShowNumberCallBack_setvisible),monster);
nowattcknumber->numbers->runAction(CCSequence::create(scale_actby,scale_actby->reverse(),NULL));
nowattcknumber->numbers->runAction(fade_actby2);
for (int i = ; i < numberstr->length(); i++)
{
CCActionInterval* fade_actby_back = fade_actby->reverse();
nowattcknumber->numbers->getChildByTag(+i)->runAction(fade_actby_back);
}
nowattcknumber->numbers->runAction(CCSequence::create(bezier_act,actbackfun,NULL));
//添加到怪物Body中
monster->addChild(nowattcknumber->numbers,,);
}
}

执行回调的函数如下:

void SpiritsMonster::ShowNumberCallBack_setvisible(CCObject* obj)
{
CCSprite* monster = (CCSprite*)obj;
//移除伤害数值
monster->removeChildByTag();
}

大家在刚才提到的addchild里面加tag的思路在这边用到了,需要遍历一下去隐藏一下!

for (int i = ; i < numberstr->length(); i++)
{
CCActionInterval* fade_actby_back = fade_actby->reverse();
nowattcknumber->numbers->getChildByTag(+i)->runAction(fade_actby_back);
}

所有代码都贴完了,然后解释一下我问啥不用CCLabelAtlas,而使用自定义的方式去实现,因为CCSprite图片+动作的效果

非常赞,而且易拓展,自己控制起来非常方便,最好说一下我的代码风格,我这些代码有的还需要重构一下,封装起来会很好

用,我的命名由于英语实在是太差了大部分还使用拼音,大家多多包含,看懂思路自己去重写一遍收获会更多,由于英语不好

曾经有很好外企工作机会没去成。哈哈,题外话了都是,下面来看看这很赞的效果!

先放大,同时沿赛贝尔曲线飘一段,然后一遍缩小一遍隐藏,最后自身销毁!

我建了一个QQ群:和大家一起分享cocos2dx开发经验【41131516】

【cocos2d-x 手游研发小技巧(1)自定义制作怪物伤害数值】的更多相关文章

  1. 【cocos2d-x 手游研发小技巧(6)聊天系统+字体高亮】

    转载请注明出处:http://www.cnblogs.com/zisou/p/cocos2dxJQ-6.html 聊天系统在手机网游中是最常见的交互工具,大家在一起边玩游戏边聊天岂不乐哉: 废话不多了 ...

  2. 【cocos2d-x 手游研发小技巧(8)通讯的数据压缩与解压 】

    今天说一下手机游戏通讯协议中的数据问题,大量的数据将给服务器端和客户端带来很大的压力,一般来说. 转载请注明出处:http://www.cnblogs.com/zisou/p/cocos2dxJQ-8 ...

  3. 【cocos2d-x 手游研发小技巧(7)图片资源加密,Lua文件加密】

    游戏开发中常遇到资源保护的问题. 目前游戏开发中常加密的文件类型有:图片,Lua文件,音频等文件,而其实加密也是一把双刃剑. 需要安全那就得耗费一定的资源去实现它.目前网上也有用TexturePack ...

  4. 【cocos2d-x 手游研发小技巧(5)获取网络图片缓存并展示】

    今天是年前最后一天上班了,最后一天上班,祝大家马上有各种东西,最后一天也给写一点干货,就是获取网络图片: 经过自己简单封装了一下,实现了获取网络图片,按照比例展示出来,实现方法是cocos2dx - ...

  5. 【cocos2d-x 手游研发小技巧(4)与Android混编实现换“头像图片”】

    cocos2dx在android平台上的游戏开发中往往会遇到一些混编需求,如: 比方有的社区类游戏需要用到更换玩家的“头像”操作,其实就是调用android servers服务里面的本地图片,以及选取 ...

  6. 【cocos2d-x 手游研发小技巧(3)Android界面分辨率适配方案】

    先感叹一下吧~~android的各种分辨率各种适配虐我千百遍,每次新项目我依旧待它如初恋···· 每家公司都有自己项目工程适配的方案,这种东西就是没有最好,只有最适合!!! 这次新项目专项针对andr ...

  7. 【cocos2d-x 手游研发小技巧(2)循环无限滚动的登陆背景】

    原创文章,转载请附上链接:http://www.cnblogs.com/zisou/p/cocos2d-xARPG6.html 首先让大家知道我们想要实现的最终效果是什么样的? 看一个<逆天仙魔 ...

  8. 【cocos2d-x 手游研发----目录】

    感谢大家一直支持我写这样一系列的博客,从中我自己也获益良多,cocos2d-x这样一款非常棒的引擎,是值得我们去学习和分享的,谈到分享,那我就把这套写了差不多一两个月的框架给大家开源下载,写的很一般, ...

  9. 【cocos2d-x 手游研发----地图活起来了】

    谈到地图不少人都说要做地图编辑器了,但是我暂时绕过这一步,如果不用寻路地图就不能移动?寻路就是会绕过障碍物的算法. 我做了一个简单的地图的思想,就是地图分层3层:背景层.可行区域层.遮罩层,但是地图就 ...

随机推荐

  1. day10:vcp考试

    Q181. An administrator is deploying ESXi 6.x hosts using Auto Deploy and wants the image profile to ...

  2. linux整合apache、php、mysql

    1.打开apache配置文件,添加AddType.找到DirectoryIndex并添加index.php AddType application/x-httpd-php .php AddType a ...

  3. cvc-complex-type.2.4.a: Invalid content was found starting with element 'init-param'.

    笔者最近学习一些spring mvc,在复制别人代码的时候报这个错.报错来源web.xml,原因是不符合xsd对xml的约束 源文件 <?xml version="1.0" ...

  4. Linux xxd命令

    一.简介 xxd 命令用于使用二进制或十六进制格式显示文件内容,可以将指定文件或标准输入以十六进制转储,也可以把十六进制转储转换成原来的二进制形式. 二.选项 http://www.cnblogs.c ...

  5. Package gtk+-3.0 was not found in the pkg-config search path

    问题描述: 在fedora21系统上通过rpmbuild构建fcitx的二进制包时出现以上错误,经老程序员指点:“是相应的开发包没有安装” 解决办法: yum installl gtk3-devel  ...

  6. Fully Update And Upgrade Offline Debian-based Systems

    Let us say, you have a system (Windows or Linux) with high-speed Internet connection at work and a D ...

  7. [Groovy] 学习Groovy的好网站(内容全面)

    https://www.tutorialspoint.com/groovy/index.htm

  8. 2、HttpClient修改处理策略Strategy

    HttpClient提供了很多接口,让我们能自定义处理逻辑,这些接口可以在AbstractHttpClient中找到: setAuthSchemes(AuthSchemeRegistry); setC ...

  9. IIS 6 备忘

    用IIS7久了, 回到IIS6 总被搞混,所以记录下,以备忘记. 以下是转载和整合了他人的资源,原出处不详.   IIS Web 服务器的权限设置有两个地方,一个是 NTFS 文件系统本身的权限设置, ...

  10. Devexpress VCL Build v2014 vol 14.2.4 发布

    What's New in 14.2.4 (VCL Product Line)   New Major Features in 14.2 What's New in VCL Products 14.2 ...