對于跨平台整合,Himi已經寫了1.x 與 2.x 的了,還不知道如何整合的請移步到
本篇隻是解決在整合cocos2dx-lua項目會出現的幾個問題的方法。
首先需要說明的是Himi使用的Cocos2dx Version : Cocos2dx 2.1.2 hotfix
第一:關于 get data from file(xxx.lua) failed/can not get file data of xxx.lua 這個問題,如下圖:
<a href="http://www.himigame.com/wp-content/uploads/2013/04/QQ20130423-9.png"></a>
此問題的原因是由于你自定義目錄的原因造成的,将到目錄,那麼不得不說明下,在xcode中有兩種顔色的檔案夾,第一種 黃色 和 綠色
黃色檔案夾:不帶路徑,直接添加到根目錄的檔案夾,也就是說沒有檔案夾的意思,隻是将檔案添加項目中了。
綠色檔案夾:真正的将檔案夾添加進來,其檔案夾中的每個檔案帶有路徑。如a/a.lua,是将檔案夾整個添加到項目的根目錄
可能還有童鞋不是很明白上面的兩種顔色的檔案夾的意思,下面舉個例子:
例如我們将一個ios項目進行打包,此ios項目的Resources添加一個叫dir的檔案夾,其中dir中包括兩個lua檔案a.lua b.lua 那麼此時将dir檔案夾添加進項目我們xcode項目中,肯定需要右鍵Resources檔案夾“Add Files to xxx(項目名)”,然後在新視窗中選擇我們需要添加的檔案夾,如下圖:
<a href="http://www.himigame.com/wp-content/uploads/2013/04/QQ20130423-8.png"></a>
需要注意的是在下方有一個選項:
Folders :
1. Create groups for any added folders: 預設選項,将檔案夾建立成一個groups形式添加
2. Create folder references for any added folders : 引用建立檔案夾進行添加
使用第一種形式進行添加的檔案夾是黃色,第二種形式添加的檔案夾是綠色
那麼如果我們采用第一種形式将dir檔案夾加入項目進行打包,那麼解壓xx.ipa後可以發現這個dir檔案夾不存在的,并且dir檔案夾中的檔案全部都預設放在項目根目錄中。
反之 ,如果我們采用第二種形式添加,那麼打包後的項目.ipa解壓後會看到dir檔案。
不知道這麼說大家有沒有了解,還不了解的童鞋請自行打包測試觀察!
需要注意的是!使用ndk 編譯cocos2dx-lua項目時,預設把項目下的Resources 所有檔案夾和檔案都copy到android項目的assets目錄下!
下面開始講解為什麼出現 get data from file(xxx.lua) failed/can not get file data of xxx.lua
其實這個問題是android加載運作lua檔案時找不到這個檔案,說白了就是路徑不對!
舉例,如果你有一個添加了一個lua檔案夾,其中包含一個黃色的himi.lua腳本檔案夾,當你執行時,代碼一般如下:
#if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID)
CCString* pstrFileContent = CCString::createWithContentsOfFile("himi.lua");
if (pstrFileContent)
{
pEngine->executeString(pstrFileContent->getCString());
}
#else
std::string path = CCFileUtils::sharedFileUtils()->fullPathForFilename("himi.lua");
pEngine->addSearchPath(path.substr(0, path.find_last_of("/")).c_str());
pEngine->executeScriptFile(path.c_str());
#endif <em id="__mceDel">
</em>
童鞋們想一想,如上代碼中如果是ios平台擷取himi.lua完整路徑是不是就是根目錄下,因為這個腳本上一層lua檔案夾是個黃色檔案夾!那麼在ios上執行運作肯定沒有任何問題。
但是!如果你将此段代碼直接編譯android運作肯定出現找不到himi.lua檔案的問題,原因是你應該加上路徑,修改如上一段代碼如下:
CCString* pstrFileContent = CCString::createWithContentsOfFile("lua/himi.lua");
if (pstrFileContent)
#endif
如上添加路徑後即可運作成功!但是!新問題又出現了,一旦你在編譯代碼到Android後,如果有自定義的檔案夾,那麼其中的每個檔案都需要路徑,這是個問題,另外如果你的一個腳本中有require 其他腳本,也會有問題!對不對?!
是以我們可以采取如下來完美解決:
一、 我們添加自定義腳本檔案夾,可以綠色檔案夾方式添加。
二、當require 其他腳本時,書寫完整的路徑,如:require “x.lua”
這樣我們就可以讓ios運作腳本也需要路徑,這樣統一了android與ios加載資源的路徑問題!
運作第一個lua,示例代碼可以如下:
std::string dirPath = "lua";
CCString* pstrFileContent = CCString::createWithContentsOfFile((dirPath + "/x.lua").c_str());
if (pstrFileContent)
{
pEngine->executeString(pstrFileContent->getCString());
}
std::string path = CCFileUtils::sharedFileUtils()->fullPathForFilename((dirPath + "/x.lua").c_str());
pEngine->addSearchPath(path.substr(0, path.find_last_of("/") - dirPath.length()).c_str());
pEngine->executeScriptFile(path.c_str());
#endif
// CCDirector::sharedDirector()->runWithScene(World::scene());
return true;
}
第二:在終端裡使用ndk編譯時出現fata error HelloWorldScene.h No such file問題 如下圖:
<a href="http://www.himigame.com/wp-content/uploads/2013/04/QQ20130422-1.png"></a>
此問題是因為lua模闆是沒有此類的,是以我們修改如下檔案:
找到你整合的android項目目錄下的jni/hellocpp/main.cpp檔案,将
#include “HelloWorldScene.h” 修改為: #include “cocos2d.h”
ok,再編譯即可。
第三:類第一個問題,編譯時出現 CCLuaEngine.h: No such file 問題,如下圖:
<a href="http://www.himigame.com/wp-content/uploads/2013/04/QQ20130423-3.png"></a>
此問題需要修改你整合android項目下的jni/Android.mk 檔案,如下:
首先删除 ../../Classes/HelloWorldScene.cpp
然後在 LOCAL_WHOLE_STATIC_LIBRARIES 後添加 cocos_lua_static 庫
最後添加 $(call import-module,scripting/lua/proj.android/jni)
大家可以參考引擎示例中的lua示例下的 jni/Android.mk 配置即可。其中還添加實體引擎box2d等庫等
第四:Eclipse導入Android項目報錯 Cocos2dxActivity cannot be resolved to a type 或 The Improt org.cocos2dx.lib cannot be resolved 問題,如下圖:
<a href="http://www.himigame.com/wp-content/uploads/2013/04/QQ20130423-4.png"></a>
這種問題是Build Path缺少檔案的link,我們配置下即可,首先右鍵項目然後選擇Properties,然後選擇“Java Build Path”,在 Source 欄目中點選“Link Source” ,如下圖:
<a href="http://www.himigame.com/wp-content/uploads/2013/04/QQ20130423-5.png"></a>
然後會出現一個新視窗:
Linked folder location:
選擇link的檔案,其路徑指向cocos2dx引擎目錄的cocos2d-2.1rc0-x-2.1.2-hotfix/cocos2dx/platform/android/java/src 目錄即可!
Folder name :
這裡預設是src,如果報錯,我們自定義個名字即可。
設定完成後一路finish或OK儲存傳回。
<a href="http://www.himigame.com/wp-content/uploads/2013/04/QQ20130423-6.png"></a>
本文轉自 xiaominghimi 51CTO部落格,原文連結:http://blog.51cto.com/xiaominghimi/1184710,如需轉載請自行聯系原作者