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

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

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

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

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

CCSprite::create(imgurl,rect);

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

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

MakeNumbers.h如下:

  1. #include "cocos2d.h"
  2.  
  3. USING_NS_CC;
  4. class MakeNumbers : public cocos2d::CCSprite
  5. {
  6. public:
  7.  
  8. CCSprite* numbers;
  9. MakeNumbers(int attckmun);
  10. ~MakeNumbers(void);
  11. };

MakeNumbers.cpp 如下 :

  1. #include "MakeNumbers.h"
  2. #include "../ImagePaths.h"
  3. #include <string>
  4. using namespace std;
  5. /*
  6. 这个类主要是显示组合自定义图片类型的伤害数值。
  7. */
  8. MakeNumbers::MakeNumbers(int attckmun)
  9. {
  10. //解析数值转化为2中格式字符串string和CCString;
  11. char char_attckmun[] = {};
  12. sprintf(char_attckmun,"%d",attckmun,char_attckmun);
  13. //这个主要用途拿来作为字符和int之间的相互转换
  14. CCString* numberstr = CCString::create(char_attckmun);
  15. //这个拿来截取字符
  16. string str = numberstr->getCString();
  17.  
  18. //获取整张素材图片,图片内容为-0123456789;
  19. CCSprite* number_all = CCSprite::create(p_makenumberbd);
  20. //获取整张图片长宽
  21. float allwight= number_all->getContentSize().width;
  22. float allhigth= number_all->getContentSize().height;
  23. //获取单张图片长宽
  24. float onewight = allwight/;
  25. float onehigth = allhigth;
  26. //获取第一个符号扣血-作为首张图片的底图
  27. CCRect imgrect_moren = CCRect(,,onewight,onehigth);
  28. numbers = CCSprite::create(p_makenumberbd,imgrect_moren);
  29.  
  30. //循环解析出“-”符号号后面的具体数值伤害
  31. for (int i = ; i < numberstr->length(); i++)
  32. {
  33. //依次解析每个数值大小
  34. string nownumber = str.substr(+i,);
  35. CCString* cc_nownumber = CCString::create(nownumber);
  36. //将解析数值去寻找图片
  37. CCRect imgrect_moren = CCRect(onewight*cc_nownumber->intValue()+onewight,,onewight,onehigth);
  38. CCSprite* numbers_now = CCSprite::create(p_makenumberbd,imgrect_moren);
  39. //将得到的图片依次尾追在“-”图片得后面
  40. numbers_now->setPosition(ccp(numbers->getContentSize().width + numbers->getContentSize().width*i,numbers->getContentSize().height/));
  41. numbers->addChild(numbers_now,,+i);
  42. }
  43.  
  44. }
  45.  
  46. MakeNumbers::~MakeNumbers(void)
  47. {
  48. }

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给我们提供的延时动作,动画方法真的太棒了,我们组合起来使用真是很完美的特效!

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

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

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

执行回调的函数如下:

  1. void SpiritsMonster::ShowNumberCallBack_setvisible(CCObject* obj)
  2. {
  3. CCSprite* monster = (CCSprite*)obj;
  4. //移除伤害数值
  5. monster->removeChildByTag();
  6. }

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

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

所有代码都贴完了,然后解释一下我问啥不用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. WCF的例子

    Demo的 “Service端”以本机IIS为宿主,“Client端”以WebForm项目为例. 1.新建项目:WCF>WCF Service Application: 2.删除默认文件ISer ...

  2. css水波动画效果

    代码来源:http://www.jq22.com/code1526 HTML: <div class="waves"></div> css: html, b ...

  3. centos一键安装lnmp成功后无法访问ip(解决办法)

    自己搞了个服务器 (我的服务器网络类型是 专有网络)如下图点击 配置规则 进入到 进.出端口规则配置 点击添加安全组规则 如图所配置  添加完成后 就如下面所示 (配置完成后 通过ip就已经可以访问了 ...

  4. 抓取访客ip

    $realip = $_SERVER['REMOTE_ADDR'] $proxy_ip = explode(',',$_SERVER['HTTP_X_FORWARDED_FOR']);//有用到代理 ...

  5. Debian 使用 cron 执行定时任务

    在linux下有两种方法来让一个命令或者脚本执行: crontab : 执行一个任务一次或者多次. at : 只执行一次. crontab是通过读取一个crontab文件来工作,这是一个普通的文本文件 ...

  6. PetaPoco与SQLite

    PetaPoco与SQLite. 对于精简版本的ORM,PetaPoco确实短小精悍,想做个WPF的Demo,然后将PetaPoco与SQLite集成一起使用,简单易用,是不错的选择. ()==数据库 ...

  7. 2018.10.13 bzoj4008: [HNOI2015]亚瑟王(概率dp)

    传送门 马上2点考初赛了,心里有点小紧张. 做道概率dp压压惊吧. 话说这题最开始想错了. 最开始的方法是考虑f[i][j]f[i][j]f[i][j]表示第iii轮出牌为jjj的概率. 然后用第ii ...

  8. 【Unity】2.4 层次视图(Hierarchy)

    分类:Unity.C#.VS2015 创建日期:2016-03-29 一.简介 层级视图 (Hierarchy) 包含当前场景中的每个游戏对象 (GameObject).有些是三维模型等资源文件的直接 ...

  9. centos7安装 docker

    centos7安装 docker 切换到 root用户,执行: [root@localhost frinder]# yum install docker已加载插件:fastestmirror, lan ...

  10. 第二届普适计算和信号处理及应用国际会议论文2016年 The 2nd Conference on Pervasive Computing, Signal Processing and Applications(PCSPA, 2016)

    A New Method for Mutual Coupling Correction of Array Output Signal 一种阵列输出信号互耦校正的新方法 Research of Robu ...