首先我们讲点话外的东西,异步载入:众所周知,loading里面一般都是载入数据的,那么是怎么载入的呢?

Director::getInstance()->getTextureCache()->addImageAsync(const std::string &path, const std::function<void(Texture2D*)>& callback)//參数1,文件路径。參数2。回调函数(一般都是进度条)

那么假设我们要载入帧动画呢?

auto frameache=SpriteFrameCache::getInstance();
frameache->addSpriteFramesWithFile(" xxxxxx  ");//參数。plist文件路径

但是这样并非异步载入,那么应该怎么办?事实上还是用上面这两个:

Director::getInstance()->getTextureCache()->addImageAsync(const std::string &path, const std::function<void(Texture2D*)>& callback);//我们首先异步载入了纹理
auto My_Texture2D=Director::getInstance()->getTextureCache()->addImage(" ");

//假设我们成功异步载入图片之后,我们能够从纹理缓存里面。即std::unordered_map<std::string,Texture2D*> _textures  返回相应key的纹理。

而key在引擎源码中则是文件的完整路径,由于在texture2d里面会做一步std::string fullpath =FileUtils::getInstance()->fullPathForFilename(path);而我们外部用的话。仅仅须要平时resources的路径就可以。

或者直接auto cache=SpriteFrameCache::getInstance(); cache->addSpriteFramesWithFile("plist路径","png路径");

auto frameache=SpriteFrameCache::getInstance();
frameache->addSpriteFramesWithFile(" xxxxxx  ",My_Texture2D);//參数1,plist文件路径,參数2,纹理  这样我们就能完毕异步载入帧动画了~

进入正题 刀塔传奇:

首先我们解压dota的包,会发现有

一张背景为黑色的jpg图和一张灰度图。对不是带alpha的png图,而是无alpha的jpg,那么刀塔传奇为什么要这么做呢?

下面为我个人的理解:

jpg图是将图像像素进行了压缩,而另外一张灰度图实际上则是附带了透明通道的8位的png,那么我们仅仅要将灰度图的alpha复制过去,就能实现jpg的背景镂空。

这种话就能缩小图片的资源大小,毕竟你jpg是经过压缩的,同等镂空的png果断是要大非常多的。这里能够确定jpg+8位灰度<png。

那么这样做的优势在哪里呢。没错。就是在图片资源非常多的情况下,我们能够清楚得感受到使用这种图片格式的优点:一、能够使你的应用程序更小,由于图片是压缩过了的。二、你的游戏能够启动地更快。

原理上和pvr.ccz有点相似,但是pvr.ccz有着它独特的优势。就是pvr格式能够直接被ios的显卡所认可,比png更加安全。避免大量图片载入的内存问题。

然后呢,我们应该怎么用jpg+灰度图实现纹理镂空的效果呢?

看引擎代码!

Texture2D * TextureCache::addImage(const std::string &path)
{Texture2D * texture = nullptr;Image* image = nullptr;// Split up directory and filename// MUTEX:// Needed since addImageAsync calls this method from a different threadstd::string fullpath = FileUtils::getInstance()->fullPathForFilename(path);//获取完整路径if (fullpath.size() == 0){return nullptr;}auto it = _textures.find(fullpath);//在缓存中查找是否是已经载入过的纹理图片if( it != _textures.end() )texture = it->second;if (! texture)//假设是未被加过的纹理{// all images are handled by UIImage except PVR extension that is handled by our own handlerdo {image = new Image();//创建一个image对象,imgae对象中封装了libjpeg,即jpg的解压/压缩库。另外利用了FileUtils::getInstance()->getDataFromFile(_filePath)  FileUtils默认会以rb模式读取二进制的数据信息CC_BREAK_IF(nullptr == image);bool bRet = image->initWithImageFile(fullpath);//将FileUtiles读取的数据用jpeg进行解压。期间有个图片格式的推断CC_BREAK_IF(!bRet);texture = new Texture2D();if( texture && texture->initWithImage(image) )//载入纹理将rgb888的jpg转为rgba8888{
#if CC_ENABLE_CACHE_TEXTURE_DATA// cache the texture file nameVolatileTextureMgr::addImageTexture(texture, fullpath);
#endif// texture already retained, no need to re-retain it_textures.insert( std::make_pair(fullpath, texture) );}else{CCLOG("cocos2d: Couldn't create texture for file:%s in TextureCache", path.c_str());}} while (0);}CC_SAFE_RELEASE(image);return texture;
}
/*..
省略
*/*outDataLen = dataLen/3*4;//将rgb的length增长到rgba的长度*outData = new unsigned char[*outDataLen];//申请一块长度为rgba长度的内存auto TempData=outData;
/*..
省略
*/for (ssize_t i = 0, j=0,l = dataLen - 2; i < l; i += 3,++j){* outData ++ = data[i];         //R* outData ++ = data[i + 1];     //G* outData ++ = data[i + 2];     //B* outData ++ =png_data[j];      //A 依据灰度图的像素信息0和255设置alpha}
auto new_Texture2d=new Texture2D();
new_Texture2d->initWithData(TempData,datalen。pixelFormat, imageWidth, imageHeight, imageSize);

//这样我们就能实现刀塔传奇的主界面效果。 至于主界面中的比方泉水发光的效果,则是通过shader实现的

至于dota的骨骼部分据说是他们自己的flash引擎做的,而我则用spine做了骨骼,由于cocostuio的骨骼功能不完好,spine则是专门针对骨骼的编辑器,而且全平台支持。u3d。libgdx,as3等等。最赞的应该就是spine的ffd,蒙皮了。

眼下正在研究binary。即spine的二进制文件导出,直接读取binary创建骨骼的话,将会比json读取的更快,内存占用更小。

ps:cocos2dx 3.1rc0出了,支持prite3d和video。眼下感觉video应该是比較有用的,3d的话,个人感觉还是u3d吧。。。cocos的3d支持还须要发展。

转载于:https://www.cnblogs.com/ldxsuanfa/p/9973608.html

菜鸟也能学cocos2dx3.0 浅析刀塔传奇(下)相关推荐

  1. 卡牌类手游源码 刀塔传奇 免费分享 基于cocos2d-x3.0引擎开发

    卡牌类手游源码 刀塔传奇 免费分享 基于cocos2d-x3.0引擎开发 https://bbs.wxrym.com/thread-90118-1-1.html (出处: 外星人源码论坛) 今天给大家 ...

  2. Cocos2d-x3.0游戏实例《不要救我》第一章——前言

    我们可以学习? 这是一个非常easy游戏.但更多的东西用(对于初学者).至少,对于它的一个例子,有点多. 笨木头花心贡献.啥?花心?不呢.是用心~ 转载请注明,原文地址:http://www.benm ...

  3. 如何使用cocos2dx3.0制作基于tilemap的游戏:第二部分

    引言 程序截图: 这篇教程是<如何使用cocos2dx3.0制作基于tilemap的游戏>的第二部分.在上一个教程中,我们创建了一个简单的基于tiled地图的游戏,里面有一个忍者在沙漠里寻 ...

  4. 明明白白学C#0.1.2 什么是编程语言

    明明白白学C#0.1.2 什么是编程语言 编程语言俗称"计算机语言".它的种类非常多,如C语言.C++.Java.C#.Objective-C.Swift等.既然编程语言是语言的一 ...

  5. 一起学nRF51xx 0 - 环境搭建

    前言 物联网时代怎么能少得了蓝牙4.0,Nordic的nRF5x系列MCU如 nRF51822 是功能强大.高灵活性的多协议 SoC,非常适用于 Bluetooth® 低功耗和 2.4GHz 超低功耗 ...

  6. 在Windows环境下编译cocos2d-x-3.0

    1. 安装配置开发环境 1.1 安装JDK 1) 下载并安装jdk-7u7-windows-i586.exe     2) 设置[JAVA_HOME]为"C:\Program Files\J ...

  7. Cocos2d-x3.0游戏实例《不要救我》第十篇(结束)——使用Json配置数据类型的怪物...

    如今我们有2种类型的怪物,并且创建的时候是写死在代码里的,这是要作死的节奏~ 所以.必须可配置.不然会累死人的. 笨木头花心贡献,啥?花心?不呢,是用心~ 转载请注明,原文地址: http://www ...

  8. Tomcat7.0浅析

    Tomcat7.0浅析 目录结构 启动分析 结构体系 管理程序 host-manager Web 应用程序 manage Web 应用程序 Tomcat服务器是一个免费的可放源代的Web应用服务器,它 ...

  9. 利用 Cocos2dx-3.0 新物理特性模拟弹珠迷宫

    本文转自:http://segmentfault.com/a/1190000000393216 前言 看到这张图,不知道你会不会想到些什么?儿时的玩物,满满的童年的味道.那时候没有太多玩具,这些小玩意 ...

最新文章

  1. AI找Bug,一键快速预测
  2. Spring Cloud Config 集中式配置
  3. Linux下的多进程间共享资源的互斥访问
  4. chrmoe debug
  5. JS中map()与forEach()的用法
  6. Shell 变量的作用域
  7. 内容分发网络 CDN 是如何提高网页加载时间的?
  8. Magento : Make 'Continue Shopping' button redirect to the product index page
  9. 恒大俱乐部每年亏损数亿,为何马云还不卖掉手中的股份?
  10. i217lm网卡驱动linux,英特尔I217-LM网卡驱动Windows10
  11. 0813Python总结-tcp,udp及黏包,struck模块
  12. 科尔沃擦窗机器人耗电_扫地机器人耗电量大吗
  13. linux uefi转mbr方法,如何将uefi改成mbr分区
  14. ImageNet Classification with Deep Convolutional Neural Networks(AlexNet论文翻译(附原文))
  15. FormulaR1C1是公式输入方法
  16. BP神经网络实用性操作(四步模板)和主要网络参数介绍
  17. 用python爬取《龙岭迷窟》评论,看看比同系列鬼吹灯作品以及《盗墓笔记》好在哪里?
  18. JAVA有关NFC读卡器读取数据
  19. js——替换字符串中的空格
  20. 斩杀线计算大师 三元一次方程解

热门文章

  1. Make Product Equal One(思维)
  2. Linux V4L2框架的视频采集
  3. 2022-2028年全球与中国近红外照相机行业发展趋势及投资战略分析
  4. python爬携程_用python selenium抓取携程信息
  5. 开源终端上网行为管理服务器windows版本包的编译及运行环境搭建
  6. PDF转换Word、Excel、PPT、图片,PDF去水印,PDF拆分该怎么做到这些
  7. 鹏业安装算量软件V8.0.0 Build 60(及58)升级内容
  8. JS验证身份证号码合法性
  9. HP收购3com给网络世界带来的变化
  10. 18日精读掌握《费曼物理学讲义-卷一》计划(2019/6/12-2019/6/29)