天天看點

Cocos2d-x 結合Box2D開發Android遊戲配置方法

cocos2d 遊戲引擎和 Box2D 實體引擎都是什麼,幹什麼用的,這裡我就不多廢話了。這裡主要講的是基于 C++ 的 cocos2d-x 在 Android 系統上開發遊戲時如何與 Box2D 實體引擎結合。
 

 
 
 

          首先簡單介紹一下我這裡所使用的環境,其他環境的配置方法也是大同小異的。

 
 
 
 

                  作業系統:Archlinux

 

                  cocos2d-x 版本:cocos2d-0.99.5-x-0.8.5

 
 
 
 

          先通過 create-android-project.sh 腳本建立一個新的 cocos2d-x for android 工程。注意,在執行該腳本前需要先對該腳本進行編輯,來設定 NDK_ROOT 和 ANDROID_SDK_ROOT 兩個變量的值(在該腳本檔案的最前面幾行)。NDK_ROOT 變量用來指定你計算機上 android ndk 的安裝位置;ANDROID_SDK_ROOT 變量用來指定你計算機上 android sdk 的安裝位置。

 
 
 
 

          工程建立完畢後,會在和 create-android-project.sh 同目錄下看到你剛剛建立的工程檔案夾。這裡我們假設我們剛剛建立了一個名為 Box2DTest 的工程。則工程目錄機構如下:

 
 
 
 

                  Box2DTest

 

                          --android

 

                          --Classes

 

                          --Resource

 
 
 
 

          Classes 檔案夾下主要是 C++ 源代碼檔案,該檔案夾是你主要編寫邏輯的地方。Resource 檔案夾是資源檔案,例如圖檔素材、音效檔案等資源檔案都必須放到這個檔案夾下面。當然,這篇日志不是講 cocos2d-x 入門。而是講怎樣在 cocos2d-x 中使用 Box2D,是以這裡我們主要要看的是 android 檔案夾。

 
 
 
 

          android 檔案夾下面是個标準的 android 工程。通過 Eclipse 可以友善的将該工程導入并運作。當我們編寫完畢我們的 C++ 代碼後通過執行 android 檔案夾下的 build_native.sh 腳本,可以将我們編寫的 C++ 代碼連同 cocos2d-x 引擎以及其他一些庫編譯成 so 檔案,以供 android 程式通過 jni 調用它們。

 
 
 
 

          預設的 cocos2d-x for android 工程并沒有将 Box2D 實體引擎庫引入到工程中。如果我們想要在我們的程式中使用 Box2D 引擎,我們需要對編譯腳本進行一些設定。首先我們看看一個預設的 cocos2d-x for android 工程都有哪些編譯腳本。

 
 
 
 

                  Box2DTest

 

                          --android

 

                                  --jni

 

                                          --Android.mk

 

                                          --Application.mk

 

                                          --helloworld

 

                                                  --Android.mk

 
 
 
 

          mk 檔案是 Android NDK 所使用的 make file 。一個标準的 cocos2d-x for android 工程預設有三個 mk 檔案,這三個檔案在編譯 C++ 代碼時起到重要的作用。而要在自己的工程中使用 Box2D 實體引擎,則需要對這三個 mk 檔案進行編輯,否則無法編譯通過。

 
 
 
 

          首先是 Box2DTest/android/jni/Application.mk 檔案。這裡我們需要關注的是 APP_MODULES 這個變量,這個變量後面的值是指定我們需要編譯的子產品的名稱。預設是這樣的:

 
 
 
 

                  APP_MODULES := cocos2d cocosdenshion game

 
 
 
 

          這裡我們需要将 Box2D 子產品加入,這樣在編譯 C++ 代碼是,會将 Box2D 子產品編譯成為 so 庫檔案。加入後是這樣的:

 
 
 
 

                  APP_MODULES := cocos2d box2d cocosdenshion game

 
 
 
 

         然後是 Box2DTest/android/jni/Android.mk 檔案。這個檔案我們需要檢查 subdirs 這個變量。這個變量的值是指定一些公共庫的頭檔案的目錄位置。在這個變量中我們需要確定将 Box2D 的庫目錄放入了其中。加入後完整的 subdirs 變量的指派語句是這樣的:

 
 
 
 

                  subdirs := $(addprefix $(LOCAL_PATH)/../../../,$(addsuffix /Android.mk, \

 

                                Box2D \

 

                                cocos2dx \

 

                                CocosDenshion/android \

 

 
 
 
 

          接下來是 Box2DTest/android/jni/helloworld/Android.mk 檔案。在這個檔案中我們主要編輯 LOCAL_C_INCLUDES 變量。該變量指定我們 C++ 源代碼中 include 的頭檔案的查找位置。預設的 LOCAL_C_INCLUDES 指派是這樣的:

 
 
 
 

                  LOCAL_C_INCLUDES := $(LOCAL_PATH)/../../../../cocos2dx \

 

                      $(LOCAL_PATH)/../../../../cocos2dx/platform \

 

                      $(LOCAL_PATH)/../../../../cocos2dx/include \

 

                      $(LOCAL_PATH)/../../../../CocosDenshion/include \

 

                      $(LOCAL_PATH)/../../../Classes 

 
 
 
 

          預設的  LOCAL_C_INCLUDES 并沒有将 Box2D 的頭檔案目錄加入進去,在這種情況下我們在自己的 C++ 源代碼中引入 Box2D 的話是無法編譯通過的。簡便的方法是加入下面兩個路徑:

 
 
 
 

                  LOCAL_C_INCLUDES := $(LOCAL_PATH)/../../../../cocos2dx \

 

                      $(LOCAL_PATH)/../../../../cocos2dx/platform \

 

                      $(LOCAL_PATH)/../../../../cocos2dx/include \

 

                      $(LOCAL_PATH)/../../../../CocosDenshion/include \

 
$(LOCAL_PATH)/../../../..  \
 
                     $(LOCAL_PATH)/../../..
 

                      $(LOCAL_PATH)/../../../Classes 

 
 
 
 

          最後還要在 Box2DTest/android/jni/helloworld/Android.mk 檔案中的 LOCAL_LDLIBS 變量上加入下面這個值:

 
 
 
 

                  LOCAL_LDLIBS := -L$(call host-path, $(LOCAL_PATH)/../../libs/armeabi) \

 

                  -lcocos2d -llog -lcocosdenshion \

 
 -lbox2d \
 

                  -L$(call host-path, $(LOCAL_PATH)/../../../../cocos2dx/platform/third_party/android/libraries) -lcurl

 
 
 
 

          加入這兩個路徑之後,我們要想在我們的 C++ 源代碼中引入 Box2D 庫的話,隻需要在 C++ 源代碼中加入這樣的語句就可以了。

 
 
 
 

                  #include  "Box2D/Box2D.h"

 
 
 
 

           這樣我們就可以在享受 cocos2d 引擎給我們帶來的開發便利的同時享受到 Box2D 實體引擎給我們帶來的開發樂趣了。