说点啥呢,直接进入主题吧~
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、结尾,其实对应真正会破解的人,这并没什么卵用,所以,只是防止一些低手而已。