2021-05-12 14:32:11
Cocos2D-X-3.4專案直升Cocos2D-X-3.6需要解決的問題
前言
在Ubuntu上安裝Cocos2d-x 3.4環境失敗後,毅然決定投入3.6的懷抱,因為我在Ubuntu上已經成功安裝好了3.6的開發環境。
現在要確認的是,以前用CocosStudio 1.6(夠老的吧?不過現在貌似有些公司還在用啊)做的UI工程和特效在3.6下是否會出問題,出的問題是否能順利解決。這決定了我是否能在3.6的環境下開發。
準備用以前一個3.4版本下開發的單機遊戲做測試。選這個專案的原因是:1. 專案比較小,邏輯簡單,不容易出問題。 2. 專案程式碼100%本人獨立完成,即使出問題,容易查詢。
先將專案備份一下,改一個新的目錄名,然後開始在裡面折騰。
設定環境
回到Windows機器上,把執行環境先降級到Cocos 2d-x 3.6。方法就是進入解壓後的cocos2d-x-3.6目錄下,執行:
python setup.py
然後重新啟動一次電腦,生產環境就變成Cocos2d-x 3.6了。
用cocos new的命令建立一個新工程。我們只需要工程目錄下的cocos2d-x目錄。(其實就是完整的cocos2d-x-3.6目錄下的內容,去除掉template和test這兩個目錄)。將原3.4工程目錄下的cocos2d-x目錄整個刪除,將新工程的這個目錄完整拷貝過去。
讀取不到資源的坑
然後開啟Vs2013開始偵錯,發現找不到資原始檔,讀不到Resorces目錄下的內容。
跟蹤比較3.4和3.6兩個專案下的區別。發現在FileUilt類下的_defaultRootPath,一個是Rersouce目錄,一個是proj.win32/Debug.win32目錄。
那麼3.6是如何找到資源的呢?再跟蹤3.6的空專案,發現它就是在proj.win32/Debug.win32目錄下讀取的檔案。
這說明了一個問題:3.6版本在編譯的時候把資源拷貝到了這個目錄下。
開啟proj.win32下的C++專案組態檔,字尾是.vcxproj那個,比較3.4和3.6下這個檔案的區別,發現原來3.4專案少了後面一個xcopy資源的操作。下面是新增後的內容:
<PreLinkEvent>
<Command>
if not exist "$(OutDir)" mkdir "$(OutDir)"
xcopy /Y /Q "$(EngineRoot)externalwebsocketsprebuiltwin32*.*" "$(OutDir)"
xcopy "$(ProjectDir)..Resources" "$(OutDir)" /D /E /I /F /Y
</Command>
</PreLinkEvent>
新增的是這行:xcopy "$(ProjectDir)..Resources" "$(OutDir)" /D /E /I /F /Y
這樣讀取資源的坑就解決了。
回頭想一想,其實這不是Cocos的坑啊,人家已經在工程檔案中拷貝了資源。好吧,是我自己挖的坑,但是只要是直接升級,而不是開新專案,難免就會碰到這個問題。反正我是被折騰了一兩個小時。
CocosStudio中粒子特效的坑
這個坑由來已久了,當年發現之後就跟cocosStudio的作者溝通過,他給出的建議是粒子特效中用到的png和plist不要同名即可。這樣的規範下,在Debug版本執行的時候,雖然會不斷報找不到檔案的錯,但並不影響執行,程式也不會崩。至少在3.4以及3.4以下的版本下一直是可行的。
但是,3.6下崩了。
這個Bug,貌似CocosStudio退出江湖的時候都沒有解決,還是讓我們自己動手吧。
找到CCDataReaderHelper.cpp這個檔案,開啟。
F3找到下面這個函數。
void DataReaderHelper::addDataFromBinaryCache(const char fileContent, DataInfo dataInfo)
然後找到這個函數最後的位置:
紅框的部分,修改為:
if (FileUtils::getInstance()->isFileExist(pngPath)) {
ArmatureDataManager::getInstance()->addSpriteFrameFromFile((dataInfo->baseFilePath + plistPath).c_str(), (dataInfo->baseFilePath + pngPath).c_str(), dataInfo->filename.c_str());
}
就是加個判斷條件,如果有plist,但是沒有同名的png,就不加入到SpriteFrame中。
看到這裡,你應該明白這個坑爹的坑是怎麼來的了吧:cocosStudio在讀粒子特效的plist時,把它當成了png + plist的圖集了。
這個坑也就填平了。再次執行專案,一切正常,打完收工。
最後的說明
我們的專案一直是用的csb二進位制檔案,沒有去讀json,所以json我就不管了。如果你的專案讀的是json檔案,你需要修改DataReaderHelper::addDataFromJsonCache這個類裡面的相同內容。
或者,用json的很簡單,因為你可以修改文字啊,開啟特效/UI對應的JSON檔案,將加在最後那個粒子特效plist那行刪除掉就行了。
--------------------------------------分割線 --------------------------------------
Ubuntu 下設定/編譯/執行 Cocos2dx專案 http://www.linuxidc.com/Linux/2015-07/120723.htm
新里程碑:Cocos2d-x v3.0 正式版本發布! http://www.linuxidc.com/Linux/2014-04/100858.htm
Cocos2d基礎及基本函數 http://www.linuxidc.com/Linux/2014-02/97382.htm
Cocos2d 如何做 Android 適配 http://www.linuxidc.com/Linux/2013-05/84616.htm
剖析Cocos2d-x之Action實現 http://www.linuxidc.com/Linux/2013-04/82436.htm
Ubuntu下Cocos2d-x開發環境搭建及設定 http://www.linuxidc.com/Linux/2013-03/81876.htm
--------------------------------------分割線 --------------------------------------
相關文章