前言
昨天在Ubuntu上安裝Cocos2d-x 3.4環(huán)境失敗后,毅然決定投入3.6的懷抱,因?yàn)槲以赨buntu上已經(jīng)成功安裝好了3.6的開發(fā)環(huán)境。
現(xiàn)在要確認(rèn)的是,以前用CocosStudio 1.6(夠老的吧?不過現(xiàn)在貌似有些公司還在用啊)做的UI工程和特效在3.6下是否會(huì)出問題,出的問題是否能順利解決。這決定了我是否能在3.6的環(huán)境下開發(fā)。
準(zhǔn)備用以前一個(gè)3.4版本下開發(fā)的單機(jī)游戲做測(cè)試。選這個(gè)項(xiàng)目的原因是:1. 項(xiàng)目比較小,邏輯簡(jiǎn)單,不容易出問題。 2. 項(xiàng)目代碼100%本人獨(dú)立完成,即使出問題,容易查找。
先將項(xiàng)目備份一下,改一個(gè)新的目錄名,然后開始在里面折騰。
配置環(huán)境
回到Window機(jī)器上,把運(yùn)行環(huán)境先降級(jí)到Cocos 2d-x 3.6。方法就是進(jìn)入解壓后的cocos2d-x-3.6目錄下,運(yùn)行:
python setup.py
然后重啟一次電腦,生產(chǎn)環(huán)境就變成Cocos2d-x 3.6了。
用cocos new的命令創(chuàng)建一個(gè)新工程。我們只需要工程目錄下的cocos2d-x目錄。(其實(shí)就是完整的cocos2d-x-3.6目錄下的內(nèi)容,去除掉template和test這兩個(gè)目錄)。將原3.4工程目錄下的cocos2d-x目錄整個(gè)刪除,將新工程的這個(gè)目錄完整拷貝過去。
讀取不到資源的坑
然后打開Vs2013開始調(diào)試,發(fā)現(xiàn)找不到資源文件,讀不到Resorces目錄下的內(nèi)容。
跟蹤比較3.4和3.6兩個(gè)項(xiàng)目下的區(qū)別。發(fā)現(xiàn)在FileUilt類下的_defaultRootPath,一個(gè)是Rersouce目錄,一個(gè)是proj.win32/Debug.win32目錄。
那么3.6是如何找到資源的呢?再跟蹤3.6的空項(xiàng)目,發(fā)現(xiàn)它就是在proj.win32/Debug.win32目錄下讀取的文件。
這說明了一個(gè)問題:3.6版本在編譯的時(shí)候把資源拷貝到了這個(gè)目錄下。
打開proj.win32下的C++項(xiàng)目配置文件,后綴是.vcxproj那個(gè),比較3.4和3.6下這個(gè)文件的區(qū)別,發(fā)現(xiàn)原來3.4項(xiàng)目少了后面一個(gè)xcopy資源的操作。下面是添加后的內(nèi)容:
<PreLinkEvent>
<Command>
if not exist "$(OutDir)" mkdir "$(OutDir)"
xcopy /Y /Q "$(EngineRoot)external\websockets\prebuilt\win32\*.*" "$(OutDir)"
xcopy "$(ProjectDir)..\Resources" "$(OutDir)" /D /E /I /F /Y
</Command>
</PreLinkEvent>
添加的是這行:xcopy "$(ProjectDir)..\Resources" "$(OutDir)" /D /E /I /F /Y
這樣讀取資源的坑就解決了。
回頭想一想,其實(shí)這不是Cocos的坑啊,人家已經(jīng)在工程文件中拷貝了資源。好吧,是我自己挖的坑,但是只要是直接升級(jí),而不是開新項(xiàng)目,難免就會(huì)碰到這個(gè)問題。反正我是被折騰了一兩個(gè)小時(shí)。
CocosStudio中粒子特效的坑
這個(gè)坑由來已久了,當(dāng)年發(fā)現(xiàn)之后就跟cocosStudio的作者溝通過,他給出的建議是粒子特效中用到的png和plist不要同名即可。這樣的規(guī)范下,在Debug版本運(yùn)行的時(shí)候,雖然會(huì)不斷報(bào)找不到文件的錯(cuò),但并不影響運(yùn)行,程序也不會(huì)崩。至少在3.4以及3.4以下的版本下一直是可行的。
但是,3.6下崩了。
這個(gè)Bug,貌似CocosStudio退出江湖的時(shí)候都沒有解決,還是讓我們自己動(dòng)手吧。
找到CCDataReaderHelper.cpp這個(gè)文件,打開。
F3找到下面這個(gè)函數(shù)。
**void DataReaderHelper::addDataFromBinaryCache(const char fileContent, DataInfo dataInfo)
然后找到這個(gè)函數(shù)最后的位置:
紅框的部分,修改為:
if (FileUtils::getInstance()->isFileExist(pngPath)) {
ArmatureDataManager::getInstance()->addSpriteFrameFromFile((dataInfo->baseFilePath + plistPath).c_str(), (dataInfo->baseFilePath + pngPath).c_str(), dataInfo->filename.c_str());
}
就是加個(gè)判斷條件,如果有plist,但是沒有同名的png,就不加入到SpriteFrame中。
看到這里,你應(yīng)該明白這個(gè)坑爹的坑是怎么來的了吧:cocosStudio在讀粒子特效的plist時(shí),把它當(dāng)成了png + plist的圖集了。
這個(gè)坑也就填平了。再次運(yùn)行項(xiàng)目,一切正常,打完收工。
最后的說明
我們的項(xiàng)目一直是用的csb二進(jìn)制文件,沒有去讀json,所以json我就不管了。如果你的項(xiàng)目讀的是json文件,你需要修改DataReaderHelper::addDataFromJsonCache這個(gè)類里面的相同內(nèi)容。
或者,用json的很簡(jiǎn)單,因?yàn)槟憧梢孕薷奈谋景。蜷_特效/UI對(duì)應(yīng)的JSON文件,將加在最后那個(gè)粒子特效plist那行刪除掉就行了。