cocos2d-x Cocos Studio项目的PNG图片资源加密

cocos2d-x Cocos Studio项目的PNG图片资源加密,第1张

概述本文是以cocos2d-x对PNG图片资源进行加密为基础进行的修改,原文方法对Cocos Studio生成的项目并没有支持,Studio生成的csb文件是二进制文件,也就是说我们无法提前修改它里面要加载的图片资源扩展名,所以只能从引擎源代码下手。 首先按照原文所说下载加密解密的算法和工具,将提供的6个文件导入到源代码项目中,然后在CCDecryptImage.h和CCDecryptImage.cp

本文是以cocos2d-x对PNG图片资源进行加密为基础进行的修改,原文方法对Cocos Studio生成的项目并没有支持,Studio生成的csb文件是二进制文件,也就是说我们无法提前修改它里面要加载的图片资源扩展名,所以只能从引擎源代码下手。


首先按照原文所说下载加密解密的算法和工具,将提供的6个文件导入到源代码项目中,然后在CCDecryptimage.h和CCDecryptimage.cpp中添加一个函数:

voID ChangeExtensionToEPNG(std::string &file_path){	std::string::size_type pos = file_path.rfind('.');	std::string extstr;	if (std::string::npos != pos)	{		extstr = file_path.substr(pos);		if (extstr == ".png")		{			file_path = file_path.substr(0,pos);			file_path.append(".epng");		}	}}
很简单,就是给传入的png图片路径改一个后缀名,改成epng


然后修改CCImage.cpp中的initWithImagefile和initWithImagefileThreadSafe函数:

bool Image::initWithImagefile(const std::string& path){	std::string epngpath = path;	if (splitext(epngpath)[1] == ".png")	{		ChangeExtensionToEPNG(epngpath);	}    bool ret = false;	_filePath = fileUtils::getInstance()->fullPathForfilename(epngpath);    Data data = fileUtils::getInstance()->getDataFromfile(_filePath);    if (!data.isNull())    {		// 图片文件解密		if (splitext(epngpath)[1] == ".epng")		{			auto image_data = Decryptimage(epngpath,data);			ret = initWithImageData(&image_data[0],image_data.size());		}		else		{			ret = initWithImageData(data.getBytes(),data.getSize());		}    }    return ret;}bool Image::initWithImagefileThreadSafe(const std::string& fullpath){	std::string epngpath = fullpath;	if (splitext(epngpath)[1] == ".png")	{		ChangeExtensionToEPNG(epngpath);	}    bool ret = false;	_filePath = epngpath;	Data data = fileUtils::getInstance()->getDataFromfile(epngpath);    if (!data.isNull())    {		// 图片文件解密		if (splitext(epngpath)[1] == ".epng")		{			auto image_data = Decryptimage(epngpath,data.getSize());		}    }    return ret;}
特别解释一下:_filePath是CCImage类的成员变量,它将会添加到一个内存列表中,用于判断内存是否已经加载了这个图片资源,所以它的值也必须是.epng的后缀,否则引擎会无法识别是否已经加载了某个图片资源。getDataFromfile同样也要传入epng路径,因为我们打包游戏的时候不可能也把png图片打包进去,所以如果不用epng路径,它返回的值将永远是NulL。


这样就大功告成了,重新编译项目即可。


需要注意的是,由于通常我们不会单独加载某张图片,一般都是做成合图然后加载合图资源,所以合图应该这样加载和使用:

cc.SpriteFrameCache:getInstance():addSpriteFrames("pListtest.pList","pListtest.epng")self:getResourceNode():getChildByname("img"):loadTexture("aboutBtn_normal.png",1)
为什么加载的时候要用epng而使用的时候用png呢?

因为epng路径是告诉引擎,你应该加载这个文件并且记住你已经加载了它,而引擎解析pList后,由于pList中记录的是png路径,所以引擎会将拆分出来的Texture用png路径标识,所以要使用Texture还是得用png路径。

总结

以上是内存溢出为你收集整理的cocos2d-x Cocos Studio项目的PNG图片资源加密全部内容,希望文章能够帮你解决cocos2d-x Cocos Studio项目的PNG图片资源加密所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1080056.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-27
下一篇 2022-05-27

发表评论

登录后才能评论

评论列表(0条)

保存