Cocos2d-x 结合Box2D开发Android游戏配置方法

cooclc 2012-02-28

先通过create-android-project.sh脚本创建一个新的cocos2d-xforandroid工程。注意,在执行该脚本前需要先对该脚本进行编辑,来设定NDK_ROOT和ANDROID_SDK_ROOT两个变量的值(在该脚本文件的最前面几行)。NDK_ROOT变量用来指定你计算机上androidndk的安装位置;ANDROID_SDK_ROOT变量用来指定你计算机上androidsdk的安装位置。

工程建立完毕后,会在和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-xforandroid工程并没有将Box2D物理引擎库引入到工程中。如果我们想要在我们的程序中使用Box2D引擎,我们需要对编译脚本进行一些设置。首先我们看看一个默认的cocos2d-xforandroid工程都有哪些编译脚本。

Box2DTest

--android

--jni

--Android.mk

--Application.mk

--helloworld

--Android.mk

mk文件是AndroidNDK所使用的makefile。一个标准的cocos2d-xforandroid工程默认有三个mk文件,这三个文件在编译C++代码时起到重要的作用。而要在自己的工程中使用Box2D物理引擎,则需要对这三个mk文件进行编辑,否则无法编译通过。

首先是Box2DTest/android/jni/Application.mk文件。这里我们需要关注的是APP_MODULES这个变量,这个变量后面的值是指定我们需要编译的模块的名称。默认是这样的:

               
APP_MODULES := cocos2d box2d cocosdenshion game_logic game

这里我们需要将Box2D模块加入,这样在编译C++代码是,会将Box2D模块编译成为so库文件。加入后是这样的:

              
APP_STL := stlport_static
                APP_CPPFLAGS += -frtti
               APP_MODULES := cocos2d box2d cocosdenshion game_logic game

然后是Box2DTest/android/jni/Android.mk文件。这个文件我们需要检查subdirs这个变量。这个变量的值是指定一些公共库的头文件的目录位置。在这个变量中我们需要确保将Box2D的库目录放入了其中。加入后完整的subdirs变量的赋值语句是这样的:

LOCAL_PATH := $(call my-dir)
            include $(CLEAR_VARS)

           subdirs := $(addprefix $(LOCAL_PATH)/../../../,$(addsuffix /Android.mk, \
           Box2D \
           cocos2dx \
           CocosDenshion/android \
	))
       subdirs += $(LOCAL_PATH)/../../Classes/Android.mk                   $(LOCAL_PATH)/helloworld/Android.mk

       include $(subdirs)

接下来是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_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := game

LOCAL_SRC_FILES := main.cpp

LOCAL_C_INCLUDES := $(LOCAL_PATH)/../../../../cocos2dx \
                    $(LOCAL_PATH)/../../../../cocos2dx/platform \
                    $(LOCAL_PATH)/../../../../cocos2dx/include \
                    $(LOCAL_PATH)/../../../../ \
                    $(LOCAL_PATH)/../../../../Box2D \
                    $(LOCAL_PATH)/../../../Classes

LOCAL_LDLIBS := -L$(call host-path, $(LOCAL_PATH)/../../libs/$(TARGET_ARCH_ABI)) \
                -lcocos2d -llog -lgame_logic \
                -lbox2d 
            
include $(BUILD_SHARED_LIBRARY)

加入这两个路径之后,我们要想在我们的C++源代码中引入Box2D库的话,只需要在C++源代码中加入这样的语句就可以了。

#include"Box2D/Box2D.h"

这样我们就可以在享受cocos2d引擎给我们带来的开发便利的同时享受到Box2D物理引擎给我们带来的开发乐趣了。

相关推荐