pack_files.bat -i olddir -o newdir -ek XXTEA -es tsts以上指令是将olddir目录下的所有文件用XXTEA加密后,放到newdir目录下,其中加密密匙为XXTEA,加密记号为tsts。参数的定义与compile_scripts脚本类似,用-h也可以得到帮助,也不多说了。 MAC下可以用pack_files.sh来加密。 需要注意的是,现在@H_301_21@只支持图片的加密。比如AllSprites.pList和AllSprites.png这样的一对纹理文件,只能加密png文件,pList文件加密后是用不了的。(注:现在已经支持pList文件,请看“后篇”里的内容) 文件加密好以后,我们需要修改quick-x的平台代码,使得它能够读取加密后的文件。 载入图片的函数是lib\cocos2d-x\cocos2dx\platform\CCImageCommon_cpp.h里面的CCImage::initWithImagefile()和CCImage::initWithImagefileThreadSafe()。再进一步看,这两个函数里都是使用CCfileUtils::sharedfileUtils()->getfileData()来获得文件数据的,我们只需要在获取数据时把文件数据解密即可。 为此我们需要专门写一个新的getfileData()来代替调用。直接写一个是可以的,放在哪个文件里也不重要。因为我自己有一个HelperFunc模块,专门放自己增加的功能的,所以我就写在这里面了。文件里的相关代码如下:
HelperFunc.h
#ifndef Cocos2Dx_HelperFunc_h#define Cocos2Dx_HelperFunc_hNS_CC_BEGINclass CZHelperFunc{public: static unsigned char* getfileData(const char* pszfilename,const char* pszMode,unsigned long * pSize);};NS_CC_END#endif //Cocos2Dx_HelperFunc_h
HelperFunc.cpp
#include "cocos2d.h"extern "C" {#include "lua.h"#include "xxtea.h"}#include "ccluaEngine.h"#include "HelperFunc.h"USING_NS_CC;unsigned char* CZHelperFunc::getfileData(const char* pszfilename,unsigned long * pSize){ unsigned long size; unsigned char* buf = CCfileUtils::sharedfileUtils()->getfileData(pszfilename,pszMode,&size); if (NulL==buf) return NulL; ccluaStack* stack = ccluaEngine::defaultEngine()->getLuaStack(); unsigned char* buffer = NulL; bool isXXTEA = stack && stack->m_xxteaEnabled; for (unsigned int i = 0; isXXTEA && i < stack->m_xxteaSignLen && i < size; ++i) { isXXTEA = buf[i] == stack->m_xxteaSign[i]; } if (isXXTEA) { // decrypt XXTEA xxtea_long len = 0; buffer = xxtea_decrypt(buf + stack->m_xxteaSignLen,(xxtea_long)size - (xxtea_long)stack->m_xxteaSignLen,(unsigned char*)stack->m_xxteaKey,(xxtea_long)stack->m_xxteaKeyLen,&len); delete []buf; buf = NulL; size = len; } else { buffer = buf; } if (pSize) *pSize = size; return buffer;}因为上面代码里直接使用了ccluaStack里的密匙等数据,所以要修改一下lib\cocos2d-x\scripting\lua\cocos2dx_support\ccluaStack.h,把里面的几个属性改成公有的才能调用。当然我这是偷懒了,安全的做法应该是加几个取值的方法,呵呵。
public: bool m_xxteaEnabled; char *m_xxteaKey; int m_xxteaKeyLen; char *m_xxteaSign; int m_xxteaSignLen;另外,我们需要在程序启动时设置一下密匙和标记,这就要修改AppDelegate.cpp里的AppDelegate::applicationDIDFinishLaunching(),在下面这句:
ccluaStack *pStack = pEngine->getLuaStack();这句后面加上:
pStack->setXXTEAKeyAndSign("XXTEA",strlen("XXTEA"),"tsts",strlen("tsts"));注意最新版本的quick-x里,player的AppDelegate.cpp修改的地方是StartupCall::startup()函数。 现在把CCImageCommon_cpp.h里的CCfileUtils::sharedfileUtils()->getfileData改为CZHelperFunc::getfileData就可以了。当然,必须包含HelperFunc.h这个头文件才能编译通过。 (注:initWithImagefileThreadSafe函数里有一段代码是在AndroID平台上使用getfileDataForAsync来取文件内容,我开始这里没做修改也能在AndroID上正常运行,可能是因为我没使用到这一载入功能。其实这段代码可以直接去掉,都用CZHelperFunc::getfileData来处理就好。最简单的修改是将“#if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID)“改成”#if 0"就可以了)
经过以上修改,quick-x就能够使用加密后的图片资源了。但这只解决了windows平台(player)和AndroID平台,其他的修改请看续篇。
源地址:http://my.oschina.net/SunlightJuly/blog/184061
总结以上是内存溢出为你收集整理的quick-cocos2d-x 图片资源加密全部内容,希望文章能够帮你解决quick-cocos2d-x 图片资源加密所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)