顯示具有 box2d 標籤的文章。 顯示所有文章
顯示具有 box2d 標籤的文章。 顯示所有文章

[Android篇]在Android中使用Cocos2D-X + Box2D

cocos2dx使用版本︰v 2.0.4
cocosBuilder使用版本︰v 2.0 alpha 1
來源網址
Cocos2d-x 结合Box2D开发Android游戏配置方法
先通过 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 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 物理引擎给我们带来的开发乐趣了。

[SpriteHelper篇]物件的三種物理屬性

文章撰寫日期︰2013/03/01 12:52
cocos2dx使用版本︰v 2.0.4
cocosBuilder使用版本︰v 2.0 alpha 1


一般來說,物理引擎中物件分成3種屬性,分別為

dynamic

對物件進行動態物體完全模擬。
它們可以被用戶手動移動,但是通常情況下會根據受力進行移動。動態物體可以和任何物體發生碰撞。動態物體總是擁有有限的非零質量。如果你嘗試設置動態物體的質量為零,它會自動設置一個1千克質量的物體。

kinematic

通過設置速度移動,對於力或者摩擦不作響應。
運動學物體在模擬環境中根據自身的速度進行移動。運動學物體自身不受力的作用。雖然用戶可以手動移動它,但是通常情況下我們會設置它的速度來進行移動。運動學物體的行為就像是有無限大的質量,儘管如此,在Box2D內部還是會對運動學物體的質量至反設置為零。運動學物體不能和其它靜態或運動學物體進行碰撞。

static

不會移動的物體,地板通常都是這個屬性。
在模擬環境下靜態物體是不會移動的,就好像有無限大的質量。在Box2D的內部會將質量至反,存儲為零。靜態物體可以被用戶手動移動。靜態物體有零速度。靜態物體不能和其它靜態或運動學物體進行碰撞。

文章出處︰ SoftWare MyZone

[SpriteLevel篇]物理引擎執行過慢

cocos2dx使用版本︰v 2.0.4
cocosBuilder使用版本︰v 2.0 alpha 1

一、問題

今天遇到從SpriteHelper-->LevelHelper啟動物理引擎物件時,
使用內建的Scene Test測試物件很流暢,
但是在實機測試卻很慢的問題。

二、解決辦法

原來是我在SpriteHelper的一個Sheet裡放置的背景圖片太大張了,
導致程式在讀取圖檔時本身就已經很耗效能,
再加上物理引擎就吃不消了。