菜鸟也能学cocos2dx3.0浅析刀塔传奇(下)(代码片段)

mqxnongmin mqxnongmin     2022-12-16     112

关键词:

首先我们讲点话外的东西,异步载入:众所周知。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出了,支持prite3dvideo。眼下感觉video应该是比較有用的,3d的话,个人感觉还是u3d吧。。。

cocos3d支持还须要发展。

不会c和cpp也能学数据结构——javascript实现双向链表

本文版权归博客园和作者吴双本人共同所有,转载和爬虫请注明原文链接 http://www.cnblogs.com/tdws/下午分享了JavaScript实现单向链表,晚上就来补充下双向链表吧。对链表的实现不是很了解的可以移步:http://www.cnblogs.com/tdws/p/6033... 查看详情

cocos2dx3.0windows8下开发环境搭建搭建不须要cygwin

       已经接触cocos2dx有一段时间,但一直也仅仅是看看Demo,没有真正的去写代码。由于本人仅仅是java的coder。还是半路出家的coder,编程基础太浅。对于c++、lua也不懂。近期cocos2dx公布3.0版本号,一看... 查看详情

前端也能学算法:由浅入深讲解动态规划(代码片段)

动态规划是一种常用的算法思想,很多朋友觉得不好理解,其实不然,如果掌握了他的核心思想,并且多多练习还是可以掌握的。下面我们由浅入深的来讲讲动态规划。斐波拉契数列首先我们来看看斐波拉契数列,这是一个大家... 查看详情

前端也能学算法:由浅入深讲解贪心算法(代码片段)

贪心算法是一种很常见的算法思想,而且很好理解,因为它符合人们一般的思维习惯。下面我们由浅入深的来讲讲贪心算法。找零问题我们先来看一个比较简单的问题:假设你是一个商店老板,你需要给顾客找零n元钱,你手上... 查看详情

cocos2dx3.0戳青蛙游戏(打地鼠)

1戳青蛙项目描写叙述1.1功能描写叙述实现类似打地鼠游戏。青蛙随机出如今屏幕左边5*3的格子中,并会向屏幕右边移动,在青蛙逃离之前,手指点击实现戳灭青蛙的效果。随着分数添加,青蛙越来越多,当青蛙逃离5个后... 查看详情

cocos2dx3.0结构图

图片较大。请下载看 查看详情

零基础学python有什么建议?零基础也能学python(附学习资料)

首先零基础是能学python的,很多编程大神入门之前都选择先学习Python,所以想学就大胆去学吧,没学之前谁不是零基础,就算是现在才下定决心学也不怕,学习Python什么时候都不算晚。零基础如何学好pythonÿ... 查看详情

cocos2dx3.0以上版本搭建mac环境(百分百可行)

...类来记录我在学习cocos2d-x的成长过程。首先第一篇,想学cocos2dx第一步就是搭建环境,第一步搭建不了环境,创建不了工程那一切都是扯淡。说到mac下安装cocos2d-x想到的模式就是xcode+cocos2d-x。因为我本身就是一个ios程序员,所... 查看详情

cocos2dx3.0对象池

classCC_DLLAutoreleasePool{public: //创建一个存放ref的对象池。而且放入PoolManager对象池管理器中AutoreleasePool(); //创建一个存放ref的对象池,而且放入PoolManager对象池管理器中,并取个名字AutoreleasePool(conststd::string&name);~AutoreleasePool(); / 查看详情

学编程学不下去?给你几个好东西,玩游戏也能学编程

...戏的方式,加强你的编程学习!是的,玩游戏也能学编程,摆脱枯燥的学习方式。​一、CodinGame|游戏化编程教学平台CodinGame虽然和游戏有关但是并不是游戏开发,只是简单的游戏模式,每一个练习背后的... 查看详情

12cocos2dx3.0游戏开发找小三之3.0中的生命周期分析

重开发人员的劳动成果。转载的时候请务必注明出处:http://blog.csdn.net/haomengzhu/article/details/27706303生命周期分析在前面文章中我们执行了第一个Cocos2d-x游戏,同一时候也介绍了控制游戏生命周期的AppDelegate文件。以下我们将结合... 查看详情

10cocos2dx3.0游戏开发找小三之容器篇:vectormapvalue

重开发人员的劳动成果。转载的时候请务必注明出处:http://blog.csdn.net/haomengzhu/article/details/27705613容器3.0版本号之前Cocos2d-x引擎为我们提供了CCArray、CCDictionary等Objective-C风格的容器;使用Cocos2d-x容器的一个重要原因在于Cocos2d-... 查看详情

cocos2dx-3.0------labellabelttflabelatlaslabelbmfont使用之法

~~~~我的生活,我的点点滴滴!!        最后一个LabelBMFont了,字体图集LabelBMFont,LabelBMFont类是一个基于位图的字体图集。是一个包括全部你须要于坐标数据一起显示在屏幕上的字符的图像,它... 查看详情

cocos2dx3.0(多个按钮button执行同一事件的区分)

1//2//ATTGamePoker.hpp3//MalaGame4//5//Createdbyworkon2016/10/18.6//7//89#ifndefATTGamePoker_hpp10#defineATTGamePoker_hpp1112#include<stdio.h>13#include<cocos2d.h>141516classATTGamePoker:p 查看详情

python太火了,快毕业了我想当程序员,但是我不是学计算机的,能学的好python吗?

...到的最容易学的开发语言,所以就算你不是计算机专业的也能学。慕课网上的课的质量都还不错,我之前在慕课网学过JavaScript,老师讲的内容很全面,讲课方式也很容易懂。你要学Python可以报名Python全栈工程师。参考技术A不是... 查看详情

cocos2dx3.0lua工程怎么打包apk

...ect/Classes/auto'%project_root3)修改命令参数,把?cmd_args='cocos2dx.ini':('cocos2d-x','lua_cocos2dx_auto'),'cocos2dx_extension.ini':( 查看详情

24cocos2dx3.0游戏开发找小三之网格动作:高炫酷的3d动作

重开发人员的劳动成果,转载的时候请务必注明出处:http://blog.csdn.net/haomengzhu/article/details/37596763网格动作类似于动作特效,能够实现翻转、震荡、抖动、水的波纹等效果。网格的基类:GridBase*Grid 获取或设置该节点的网格特... 查看详情

cocos2d-x3.0json解析

在Cocos2dx3.0下,JSON解析库官方已经集成好了,我们引用就OK。JSON文件hello.json内容{"pets":["dog","cat"],"stuInfo":{"stuAge":"23","stuName":"zhangsan","birthday":"1990-01-12"},"username":"tomsfff","other":[true,30]}.h头文件#includ 查看详情