菜鸟也能学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 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支持还须要发展。

原文地址:https://www.cnblogs.com/ldxsuanfa/p/9973608.html

时间: 2024-08-26 22:05:31

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

mac下配置cocos2d-x3.0

今天看到3.0的正式版公布了,就马上荡下来试试3.0,以下记录下环境变量配置过程 打开用户文件夹下.bash_profile文件,配置环境 1.首先配置下android sdk,我的是在opt文件夹下 #sdk export ANDROID_SDK_ROOT=/opt/android-sdk-macosx export PATH=$PATH:$ANDROID_SDK_ROOT export PATH=$PATH:$ANDROID_SDK_ROOT/platform-tools 2.ndk #nd

Cocos2d-x3.0游戏实例之《别救我》第一篇——前言

我们能学到什么? 这是一个很简单的游戏,但是用到的东西比较多(对新手而言),起码,对于一个实例来说,它涉及的确实有点多. 笨木头花心贡献,啥?花心?不呢,是用心~ 转载请注明,原文地址:http://www.benmutou.com/blog/archives/797 文章来源:笨木头与游戏开发 通过这个游戏实例,可爱的你(小若:那不可爱的人呢?),可以学到以下知识点: 1. Cocos2d-x3.0物理引擎的简单使用 2. 读取Json文件作为怪物和物品配置 3. 利用Tiled地图实现可视化

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

罗嗦几句,本系列文章记录了小鱼(本人)自学Cocos2D-X的整个过程,主要从分析Cocos2D-x的源码方式来学习Cocos2d-x这样一个优秀的游戏引擎架构,本着不但要知其然还要知其所以然的学习态度来揭开Cocos2d-x的奥秘.阅读本文要求读者有一定的C++程序经验. 一.Cocos2d-x是啥玩意 小鱼是听同事介绍,当前开发手机2d游戏多采用cocos2d-x引擎,开源且可以实现跨手机平台的快速移植,听到有这种神器,向百度求助好多介绍cocos2d-x的文章,在这里我不去引用了大家可以去

cocos2dx3.0 超级马里奥开发笔记(一)——loadingbar和pageview的使用

学完cocos2dx课程的第一个项目选择了超级玛丽.可以说有自己的想法,简单但是确实不简单. 我花了一天把一份2.1版本的超级玛丽源码升级到了3.0,改改删删,参考那个源码虽然好多不懂,但是马虎升级成功,游戏正常玩耍. 本着不为把游戏做出来而写代码的想法,罗列了一下这个游戏可以使用到的知识点.数据持久化的三种方式.loading页面.tmx地图解析.cocosStudio场景.屏幕适配.关卡如何选择.代码结构的优化(各种类的抽象继承),在基本功能出来后可以自己去设计变态关卡等. 两天实现了loa

cocos2d-x3.0 用CCDictionary写文件

bool CDownLoad_LocalData::WriteToConfigFile( DownLoadLocalData* downdata ){ CCDictionary* pDict = CCDictionary::create(); unsigned int lessonid = downdata->lession_id;char s_lessonid[10];sprintf(s_lessonid,"%d",lessonid); CCString* pValue1 =

Cocos2d-X-3.0 之后的版本的环境搭建

 Cocos2d-X-3.0 之后的版本的环境搭建 由于cocos2d游戏开发引擎更新十分频繁,官方文档同步不够及时和完善.所以不要照着官方文档来照做生成工程. <点击图片就能进入网站> 具体的步骤: 1.获取cocos2d-X的源码v3.6版本 然后解压到随便什么位置,比如这里就放在桌面上,文件名cocos2d-x-3.6 2.使用5.1以上版本的XCode 3.将cocos2d-x-3.6中的setup.py直接拖到刚刚打开的终端,然后回车. 然后提示需要做一些环境变量的配置,第一个提示安

Cocos2d-x3.0 Json解析

在Cocos2dx3.0下,JSON解析库官方已经集成好了.我们引用就OK. JSON文件hello.json内容 {"pets":["dog","cat"],"stuInfo":{"stuAge":"23","stuName":"zhangsan","birthday":"1990-01-12"},&quo

cocos2d-x-3.0 build不成功

windows上面建立工程,一开始新宿舍没联网,老是不能成功以下内容: cocos run -p TestAndroid -j 4 一直build failed.内容大致是ant里面build文件284句出了问题~~ 过了会儿来一个有wifi的地方,刚想看看是什么错误,结果以上那句直接就可以通过了....究竟是怎么回事呢?不太清楚~~ cocos2d-x-3.0 build不成功,布布扣,bubuko.com

c++ 基础学习: 左值 概念cocos2d-x3.0的实际应用

左值:概念baidu 1.2.6.2 与Cocos2d-x内存管理的结合 在2.x的使用场景中,CCArray和CCDictionary通常被分配在堆上,我们不得不需要考虑在适当的地方释放其内存.新的容器类不再继承自Ref(2.x中的CCObject),新的容器类通常应该被分配在栈上来使用,这简化了内存管理,我们应该将精力放在容器元素而不是容器本身的内存管理上. Vector中的T和Map<K,V>中的V必须是Ref类型,因为它们需要结合Cocos2d-x的内存管理方式一起工作.这简化了容器中