您的位置:首页 > 移动开发 > Cocos引擎

cocos2d-x 对引擎修改,以实现加密资源

2015-08-14 14:55 465 查看
说点啥呢,直接进入主题吧~

1、首先声音文件是不能加密的,为什么呢?研究发现android端对它的调用是直接取的地址,不是数据内容,所以懒得进一步做平台适应了。

2、其次,别的都是可以加密的。至于怎么加密嘛?网上一大堆算法,这里就不提了。我第一版采用的是最简单是字节位加密,原理就是对字节进行一次换算加密,例如

: string a = "1234"; a[0]^=0x11;那么字符串中的1就被加密了,解密就是再执行一次a[0]^=0x11;具体就不多说了,自行百度一下更清楚。

3、接下来最重要的当然是怎么对cocos2dx修改了。这里暂时对2.x的版本进行修改说明,至于3.x也是一样的原理,大家自行修改说明吧。打开CCFileUtils.h文件,在类内加入

CCDictionary * m_pResData;

public:

void initReadRes(const std::string& file);

这段代码,然后打开CCFileUtils.cpp文件,加入

bool CCFileUtils::init()

{

m_searchPathArray.push_back(m_strDefaultResRootPath);

m_searchResolutionsOrderArray.push_back("");

m_pResData = CCDictionary::create();

m_pResData->retain();

return true;

}

void CCFileUtils::initReadRes(const std::string& file)

{

CCString *pTemp =NULL;

这里是对file文件进行解密,并将对应的文件路径名(完整路径)与文件内容存入字典m_pResData中

m_pResData->setObject(pTemp, key.c_str());

}

打开cocos2dx\platform\android下的CCFileUtilsAndroid.cpp,增加android 端的设配,这里只对两个函数进行处理doGetFileData跟isFileExist,

在doGetFileData修改为

string fullPath = fullPathForFilename(pszFileName);

CCString * pData1 = (CCString *)m_pResData->objectForKey(fullPath);

if (pData1)

{

*pSize = pData1->length();

pData = new unsigned char[*pSize];

memcpy(pData, pData1->getCString(), *pSize);

}

else if (fullPath[0] != '/')

{

打开cocos2dx\platform\ios下的打开CCFileUtilsIOS.cpp,增加IOS端的设配,这里只对1个函数进行处理sFileExist,

在isFileExist内修改为

CCString * pData1 = (CCString *)m_pResData->objectForKey(strFilePath);

if (pData1)

{

bFound = true;

}

else if (strFilePath[0] != '/')

{

这里的修改就完成了

4、使用时,在资源加载的地方加入CCFileUtils::sharedFileUtils()->initReadRes("code.dat");这样使用时,如果有解密后的数据,那么引擎优先读取的就是你解密数据了。我这里是将所有的资源压入一个文件内,并设置好了对应的文件路径。

5、结尾,其实对应真正会破解的人,这并没什么卵用,所以,只是防止一些低手而已。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: