首先我们讲点话外的东西,异步载入:众所周知,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的包,会发现有

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdzg4MjE5MDAz/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="" />

一张背景为黑色的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 thread std::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 handler
do
{
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 name
VolatileTextureMgr::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支持还须要发展。

菜鸟也能学cocos2dx3.0 浅析刀塔传奇(下)的更多相关文章

  1. Cocos2d-x3.0终于版Mac以及Win系统相关环境部署

    因个人原因此博客停止更新,其它更新博文将在该博客继续更新. http://blog.csdn.net/xiaohan_aimti/article/details/24653831 就在前几天,2014 ...

  2. mac下配置cocos2d-x3.0

    今天看到3.0的正式版公布了,就马上荡下来试试3.0,以下记录下环境变量配置过程 打开用户文件夹下.bash_profile文件,配置环境 1.首先配置下android sdk,我的是在opt文件夹下 ...

  3. Cocos2d-X3.0 刨根问底(一)----- 概览

    罗嗦几句,本系列文章记录了小鱼(本人)自学Cocos2D-X的整个过程,主要从分析Cocos2D-x的源码方式来学习Cocos2d-x这样一个优秀的游戏引擎架构,本着不但要知其然还要知其所以然的学习态 ...

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

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

  5. cocos2dx-3.0(前言)

    说了好久,告诉自己要開始学cocos2dx(在心理里告诉了好久),然后养成良好习惯,记录自己学习cocos2dx的过程.一个是怕自己忘记.还有一个是更加让自己理解透彻(或许哪天我写的好了,组合一下出一 ...

  6. Cocos2dx-3.0版本 从开发环境搭建(Win32)到项目移植Android平台过程详解

    作为重量级的跨平台开发的游戏引擎,Cocos2d-x在现今的手游开发领域占有重要地位.那么问题来了,作为Cocos2dx的学习者,它的可移植特性我们就需要掌握,要不然总觉得少一门技能.然而这个时候各种 ...

  7. Cocos2d-X3.0 刨根问底(八)----- 场景(Scene)、层(Layer)相关源码分析

    本章节我们重点分析Cocos2d-x3.0与 场景.层相关的源码.这部分源码集中在 libcocos2d –> layers_scenes_transitions_nodes目录下面 我先发个截 ...

  8. Cocos2d-X3.0 刨根问底(七)----- 事件机制Event源码分析

    这一章,我们来分析Cocos2d-x 事件机制相关的源码, 根据Cocos2d-x的工程目录,我们可以找到所有关于事件的源码都存在放在下图所示的目录中. 从这个event_dispatcher目录中的 ...

  9. Mac下cocos2dx-3.0打包Android时,提示&quot;SimpleAudioEngine.h&quot;not found的解决方法

    前段时间触控公布cocos2dx-3.0,在升级之后试过之后,在最初的不习惯之后,感觉比之前的好用了不少,在下之前一直是用xCode模板创建,这回算是一口气升到顶了. 之后再一次编程时须要用到Sima ...

随机推荐

  1. 回车替换Tab 并不会 提交表单 IE Chrome 通过

    网上一堆可以回车替换tab的代码,可是基本都忽略谷歌浏览器的兼容性,找了3个小时 试了无数遍,终于总结出这一段代码,希望能帮到需要的同学,也给自己留个备忘        document.onkeyd ...

  2. 第二百六十五节,xss脚本攻击介绍

    xss脚本攻击介绍 Cross-Site Scripting(XSS)是一类出现在 web 应用程序上的安全弱点,攻击者可以通过 XSS 插入一 些代码,使得访问页面的其他用户都可以看到,XSS 通常 ...

  3. windows2003 iis6.0站点打不开,找不到服务器或 DNS 错误【转】

    最近服务器经常出现打不开网站的现象,有时出现在上午,有时出现在中午,几乎天天都会出现一次,出现问题时,无论是回收程序池还是重启IIS或者关闭其它一些可能有影响的服务,都不能解决问题.网站打不开时,有如 ...

  4. php -- 魔术方法 之 删除属性:__unset()

    属性重载:当访问一个不存在或者权限不够的属性的时候,能够触发一系列的魔术方法,就叫做属性重载 __unset():当删除一个不存在或者权限不够的属性的时候会自动触发 <?php //属性重载 c ...

  5. HTML邮件注意事项(转)

    1.全局规则之一,不要写<style>标签.不要写class,所有CSS都用style属性,什么元素需要什么样式就用style写内联的CSS. 2.全局规则之二,少用图片,邮箱不会过滤你的 ...

  6. Run time setting设置详解

    Pacing转载自belie 1>     Run time setting设置中的Browser:‘Simulate a new user on each iteration’选项例如:录制了 ...

  7. ReactNative iOS源码解析

    http://awhisper.github.io/2016/06/24/ReactNative%E6%B5%81%E7%A8%8B%E6%BA%90%E7%A0%81%E5%88%86%E6%9E% ...

  8. 编程之美 set 20 构造数独

    1. 朴素 DFS 遍历效率太低, 即便是预先设定 9 个数放到数组再去 DFS, 同样并不高效 2. 在生成一个可行解后, 随机删除一些数字, 删除的数字越多, 数独的难度就越大 3. 正解二. 3 ...

  9. Linux 文件夹含义(转)

    1./bin :获得最小的系统可操作性所需要的命令 2./boot :内核和加载内核所需的文件 3./dev :终端.磁盘.调制解调器等的设备项 4./etc :关键的启动文件和配置文件 5./hom ...

  10. 【BZOJ1050】[HAOI2006]旅行comf 并查集

    [BZOJ1050][HAOI2006]旅行comf Description 给你一个无向图,N(N<=500)个顶点, M(M<=5000)条边,每条边有一个权值Vi(Vi<300 ...