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物理引擎给我们带来的开发乐趣了。
进入场景而且过渡动画结束时候触发。提示 GameScene场景中的继承于节点,这些生命周期事件根本上是从Node继承而来。事实上所有Node对象都有这些事件,具体实现代码与GameScene场景类似。
进入场景而且过渡动画结束时候触发。提示 GameScene场景中的继承于节点,这些生命周期事件根本上是从Node继承而来。事实上所有Node对象都有这些事件,具体实现代码与GameScene场景类似。