菜鸟也能学cocos2dx3.0 浅析刀塔传奇(下)
首先我们讲点话外的东西,异步载入:众所周知,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 浅析刀塔传奇(下)相关推荐
- 卡牌类手游源码 刀塔传奇 免费分享 基于cocos2d-x3.0引擎开发
卡牌类手游源码 刀塔传奇 免费分享 基于cocos2d-x3.0引擎开发 https://bbs.wxrym.com/thread-90118-1-1.html (出处: 外星人源码论坛) 今天给大家 ...
- Cocos2d-x3.0游戏实例《不要救我》第一章——前言
我们可以学习? 这是一个非常easy游戏.但更多的东西用(对于初学者).至少,对于它的一个例子,有点多. 笨木头花心贡献.啥?花心?不呢.是用心~ 转载请注明,原文地址:http://www.benm ...
- 如何使用cocos2dx3.0制作基于tilemap的游戏:第二部分
引言 程序截图: 这篇教程是<如何使用cocos2dx3.0制作基于tilemap的游戏>的第二部分.在上一个教程中,我们创建了一个简单的基于tiled地图的游戏,里面有一个忍者在沙漠里寻 ...
- 明明白白学C#0.1.2 什么是编程语言
明明白白学C#0.1.2 什么是编程语言 编程语言俗称"计算机语言".它的种类非常多,如C语言.C++.Java.C#.Objective-C.Swift等.既然编程语言是语言的一 ...
- 一起学nRF51xx 0 - 环境搭建
前言 物联网时代怎么能少得了蓝牙4.0,Nordic的nRF5x系列MCU如 nRF51822 是功能强大.高灵活性的多协议 SoC,非常适用于 Bluetooth® 低功耗和 2.4GHz 超低功耗 ...
- 在Windows环境下编译cocos2d-x-3.0
1. 安装配置开发环境 1.1 安装JDK 1) 下载并安装jdk-7u7-windows-i586.exe 2) 设置[JAVA_HOME]为"C:\Program Files\J ...
- Cocos2d-x3.0游戏实例《不要救我》第十篇(结束)——使用Json配置数据类型的怪物...
如今我们有2种类型的怪物,并且创建的时候是写死在代码里的,这是要作死的节奏~ 所以.必须可配置.不然会累死人的. 笨木头花心贡献,啥?花心?不呢,是用心~ 转载请注明,原文地址: http://www ...
- Tomcat7.0浅析
Tomcat7.0浅析 目录结构 启动分析 结构体系 管理程序 host-manager Web 应用程序 manage Web 应用程序 Tomcat服务器是一个免费的可放源代的Web应用服务器,它 ...
- 利用 Cocos2dx-3.0 新物理特性模拟弹珠迷宫
本文转自:http://segmentfault.com/a/1190000000393216 前言 看到这张图,不知道你会不会想到些什么?儿时的玩物,满满的童年的味道.那时候没有太多玩具,这些小玩意 ...
最新文章
- AI找Bug,一键快速预测
- Spring Cloud Config 集中式配置
- Linux下的多进程间共享资源的互斥访问
- chrmoe debug
- JS中map()与forEach()的用法
- Shell 变量的作用域
- 内容分发网络 CDN 是如何提高网页加载时间的?
- Magento : Make 'Continue Shopping' button redirect to the product index page
- 恒大俱乐部每年亏损数亿,为何马云还不卖掉手中的股份?
- i217lm网卡驱动linux,英特尔I217-LM网卡驱动Windows10
- 0813Python总结-tcp,udp及黏包,struck模块
- 科尔沃擦窗机器人耗电_扫地机器人耗电量大吗
- linux uefi转mbr方法,如何将uefi改成mbr分区
- ImageNet Classification with Deep Convolutional Neural Networks(AlexNet论文翻译(附原文))
- FormulaR1C1是公式输入方法
- BP神经网络实用性操作(四步模板)和主要网络参数介绍
- 用python爬取《龙岭迷窟》评论,看看比同系列鬼吹灯作品以及《盗墓笔记》好在哪里?
- JAVA有关NFC读卡器读取数据
- js——替换字符串中的空格
- 斩杀线计算大师 三元一次方程解
热门文章
- Make Product Equal One(思维)
- Linux V4L2框架的视频采集
- 2022-2028年全球与中国近红外照相机行业发展趋势及投资战略分析
- python爬携程_用python selenium抓取携程信息
- 开源终端上网行为管理服务器windows版本包的编译及运行环境搭建
- PDF转换Word、Excel、PPT、图片,PDF去水印,PDF拆分该怎么做到这些
- 鹏业安装算量软件V8.0.0 Build 60(及58)升级内容
- JS验证身份证号码合法性
- HP收购3com给网络世界带来的变化
- 18日精读掌握《费曼物理学讲义-卷一》计划(2019/6/12-2019/6/29)