顯示具有 cross-platform 標籤的文章。 顯示所有文章
顯示具有 cross-platform 標籤的文章。 顯示所有文章

[cocos2d-x 2.1.x / 3.x 版]建立第一個跨平臺專案

文章撰寫日期︰2013/12/29 19:25
cocos2d-x使用版本︰2.1.4

此篇適用cocos2d-x2.1.x版以上

一、前言


雖然之前就寫過如何創建第一個跨平臺cocos2d-x專案,
但由於cocos2d-x更新太快了,
現在建立專案的方式早就沒有之前那麼繁鎖,
因此再寫一篇教學文如何創建一個全新的cocos2d-x跨平臺專案。

二、文章開始


下載cocos2d-x源碼
使用git在Terminal(終端機)輸入下列指令
$git clone http://github.com/cocos2d/cocos2d-x.git
約10~20分鐘後(依您頻寬而定),
整份cocos2d-x源碼便下載完成。

下載完後,記得將次模組(SubModule)也下載下來。
進入cocos2d-x目錄執行指令
$git submodule update --init --recursive

切換cocos2d-x版本(若無此需求請略過)

如果您有切換源碼版本的需求,
僅需在cocos2d-x目錄下,
使用Terminal輸入下列指令
$git tag 版本號

如果不知道有哪些版本能夠切換,
也可以下指令
$git tag -l
來查詢。
上面列岀現在的cocos2d-x有哪些版本可供切換
假設要切換到版本2.0.2
指令便是
$git tag cocos2d-2.0-x-2.0.2
即可完成版本切換。

建立一個全新的跨平臺專案

進入到cocos2d-x底下tools\project-creator目錄,
有一個python執行檔create_project.py,
執行該檔便可以完成跨平臺的專案建置。

該phython檔接收的參數如下
  -project   PROJECT_NAME          專案名稱, 例如: MyGame
  -package   PACKAGE_NAME          套件名稱, for example: com.MyCompany.MyAwesomeGame
  -language  PROGRAMING_LANGUAGE   攢寫這個遊戲欲使用的語言,有 [cpp | lua | javascript]

只要使用Terminal到該目錄執行
$./create_project.py -project MyGame -package com.MyCompany.AwesomeGame
或
$./create_project.py -project MyGame -package com.MyCompany.AwesomeGame -language javascript
就可以輕鬆完成專案的建置。

成功了!

製作岀來的專案會放在
cocos2dx目錄\projects底下
ios專案在proj.ios目錄裡,
而Android專案則在proj.android目錄裡。
Classes目錄將會存放您未來攢寫的C++遊戲檔,
Resources目錄則是放置音效以及圖檔等資源供日後產岀ios、Android專案的主要目錄。

想要編譯並執行Android專案是需要設定其底下build_native.sh和jni\Android.mk檔的。
怎麼設定日後再說嚕!

三、結論

只要透過一個簡單的指令
$./create_project.py
就能將跨平臺專案建立起來,
跟之前比是不是更方便了呢?
感謝cocos2d-x開發團隊的努力,
讓我們開發遊戲更加的方便和快速。:D

相關文章

1. 在 cocos2d-x 2.0.x版 建置全新的專案

[Android篇]call to OpenGL ES API with no current context (logged once per thread)

文章撰寫日期︰2013/04/16 13:25
cocos2dx使用版本︰v 2.0.4
cocosBuilder使用版本︰v 2.0 alpha 1

一、問題

今天試圖使用JNI從Java(Android)層呼叫C++(Cocos2d-x)層,
讓Cocos2d-x換場景(replaceScene),
卻遇到Eclipse報
  1. Fatal signal 11 (SIGSEGV) at xxxxxxxx (code=1), thread xxxx (xxxxxx)
  2. call to OpenGL ES API with no current context (logged once per thread)
的錯誤。

二、解決辦法

這個問題是因為Android在啟動cocos2d-x的Thread時,
不是用context的主Thread,
而是另外產生OpenGL的Thread,
所以我們不能用主Thread去讓cocos2dx做OpenGL Thread原本應該做的工作(replaceScene),
要用OpenGL的Thread去完成︰

JAVA端-Cocos2dxActivity.java
//要用Cocos2dxActivty這個Activity去調用runOnGLThread!
Cocos2dxActivity.this.runOnGLThread(new Runnable(){

    @Override
    public void run() {
           replaceScene();
        }
    });

    public static native void replaceScene();
    static {
        System.loadLibrary("game");
   }

C++端
JNIEXPORT void JNICALL Java_com_hardworking_millioinschool_ios_Cocos2dxActivity_replaceScene(JNIEnv *env, jobject thiz)
{
    
    //切到主遊戲頁
    CCScene *pScene = TitleScene::scene();
    CCDirector::sharedDirector()->replaceScene(pScene);
    
}

相關文章

1. 雜物聚集地

[Android篇]Back鍵無法關閉cocos2d-x遊戲

文章撰寫日期︰2013/03/20 17:30
cocos2dx使用版本︰v 2.0.4
cocosBuilder使用版本︰v 2.0 alpha 1

一、問題

按下Android的返回鍵,
有時候關的掉遊戲,
有時候關不掉。

二、解決辦法

查文後得知Cocos2dxActivity.java裡的onKeyDown是假的,
觸控權早已交到了Cocos2dxGLSurfaceView.java的onKeyDown手上...

再追下去,
發現backKey交給了Native,
也就是cpp那邊會呼叫backKey按下去後的實作。

後來,
知道要實作init函式,
並將setKeypadEnabled(true);
然後再寫一個
void DoorAnimationScene::keyBackClicked(){
    CCLog("into DoorAnimationScene::keyBackClicked()");
    CCDirector::sharedDirector()->end();
}

結束。

[Android篇]使用CCLabelTTF換行會漏字(最後一個字不見)的問題

文章撰寫日期︰2013/03/20 10:35
cocos2dx使用版本︰v 2.0.4
cocosBuilder使用版本︰v 2.0 alpha 1

一、問題

針對CCLabelTTF設定setDimensions,
想要做到文字過長會自動換行的效果,
在IOS上能正常顯示,
Android上卻會被截掉每一行的最後一個字元的問題。

請參見下圖示意的題目的部份
畫面在IOS上的樣子
畫面在Android上的樣子
可以看到,
"一條尾巴"後面的"逗號"在Android上不見了。

二、解決方法

與Cocos2dX開發人員詢問後,
發現此問題是2.0.x的一個bug,
已經在cocos2d-x 2.1.x獲得改善,
可參見它們的更新LOG #1610。
Bug   #1610: fix a bug that CCLabelTTF will lost a character at the end of a line
 
解決方法是將cocos2d-x在Android上的一個類別
Cocos2dxBitmap.java line 298

while (pString.indexOf(i++) == ' ') {
 ;
}
改成
while (pString.indexOf(i) == ' ') {
          ++i;
}
記得,
cocos2dx/cocos2dx/platform/android/java/src/org/cocos2dx/lib/Cocos2dxBitmap.java也要改掉。

免得之後建立的新Android-Cocos2dx專案又遇到同樣的問題。

[Android篇]SQLite在Android無法讀取(返回錯誤碼14)的決解方案

文章撰寫日期︰2013/03/19 13:46
cocos2dx使用版本︰v 2.0.4
cocosBuilder使用版本︰v 2.0 alpha 1

一、問題

在Xcode中,使用
sqlite3 *pDB = NULL;//資料庫指針

string  szResPath(CCFileUtils::sharedFileUtils()->fullPathFromRelativePath("millionschool.sqlite"));
sqlite3_open(szResPath.c_str(), &pDB);
就能順利將Resources資料夾下的millionschool.sqlite打開並使用。

但是,
Android卻無法這樣子打開,
返回了錯誤碼14。

二、解決方法

經爬文後發現,
sqlite3 *pDB = NULL;//資料庫指針CCFileUtils::sharedFileUtils()->fullPathFromRelativePath("millionschool.sqlite"));
這個取到的路徑在Android下會被壓縮,
無法正常存取。
解決方法只有將sqlite檔案複製至可存取的Android資料夾方可使用。
CCFileUtils::sharedFileUtils()->getWriteablePath();
此方法在Android底下會取到本機裡data\data\package_name\這個目錄,
於是我們將assets底下的sqlite複製到這邊來。
        sqlite3 *pDB = NULL;//資料庫指針
        char * errMsg = NULL;//錯誤訊息
        std::string sqlstr;//SQL指令
        int result;//sqlite3_exec返回值
        
        string  szResPath(CCFileUtils::sharedFileUtils()->fullPathFromRelativePath("millionschool.sqlite"));//IOS可以這樣用,但Android卻不行

        //取得Android可以使用的data\data\package_name資料夾
        string dbPath = CCFileUtils::sharedFileUtils()->getWriteablePath();
        dbPath.append("millionschool.sqlite");

        //將資料寫入串流
        unsigned long tmpSize;
        unsigned char* dbData = CCFileUtils::sharedFileUtils()->getFileData(szResPath.c_str(), "rb", &tmpSize);
        FILE *fp = fopen(dbPath.c_str(), "wb");
        fwrite(dbData, tmpSize, 1, fp);
        fclose(fp);

        //將資料庫打開來看看
        result = sqlite3_open(dbPath.c_str(), &pDB);
        
        if( result != SQLITE_OK ){
            CCLog( "打開資料庫失敗,錯誤碼:%d ,錯誤原因:%s\n" , result, errMsg );
        }else{
            CCLog( "打開資料庫成功!" );
        }
成功了! 讀到資料庫了!

[cocos2d-x篇]'jni.h' file not found

文章攢寫時間︰2013/02/14 19:15
文章修改時間︰2013/03/09 15:32
文章修改次數︰2
cocos2dx使用版本︰v 2.0.4
cocosBuilder使用版本︰v 2.0 alpha 1

一、問題

在編譯cross-platform時遇到'jni.h' file not found的錯誤。

二、解決辦法

由於Android lib要置入CocosDenshion\android才能跨系統透過JNI控制Android的音控,
將Xcode裡CocosDenshion\android資料夾移除Reference即可。

因為jni.h要在Android編譯時才會找到。