본문 바로가기

게임개발팁

cocos2d-x Box2D 프로젝트 만들기


cocos2d-x 에서 Box2D 용 혼합 프로젝트를 생성하는 방법을 알아보겠습니다. 참고로 이 글은 http://gameit.ro/2011/08/creating-a-cocos2d-x-box2d-android-project/ 블로그 글을 참고하여 작성하였습니다.

우선 XCode로 cocos2d-x 용 Box2D 프로젝트를 생성합니다. 그리고 안드로이드용은 create-android-project.sh 을 이용하여 프로젝트를 생성합니다. 두 개의 프로젝트는 이름이 같아야 함은 예전 튜토리얼을 읽어 보신 분은 알고 계실 것입니다. 예전 혼합프로젝트를 생성하는 튜토리얼을 참고하여 두 개의 프로젝트를 합칩니다.

이제 안드로이드 프로젝트의 JNI 라이브러리 경로를 설정해 주면 됩니다. 제가 구성한 혼합 프로젝트의 모양은 아래 그림과 같습니다.


프로젝트 이름은 HelloBox2D 라 주었고 아이폰 프로젝트와 안드로이드 프로젝트를 혼합했습니다.

이제 안드로이드의 라이브러리 경로를 설정해 보겠습니다.

1. android/jni/Android.mk 수정하기

위의 폴더에서 android/jni/Android.mk 파일을 불러와 아래의 굵은 글씨로 적은 Box2D \ 를 입력합니다.

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

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

include $(subdirs)

 2. android/jni/Application.mk 수정하기

위의 폴더에서 android/jni/Application.mk 파일을 불러와 아래의 굵은 글씨로 적은 box2d 를 입력합니다.

# it is needed for ndk-r5
APP_STL := stlport_static
APP_MODULES := cocos2d cocosdenshion box2d game

3. android/jni/helloworld/Android.mk 수정하기

위의 폴더에서 android/jni/helloworld/Android.mk 파일을 불러와 아래의 굵은 글씨로 적은 내용 입력합니다.

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

LOCAL_SRC_FILES := main.cpp \
../../../Classes/AppDelegate.cpp \
../../../Classes/HelloWorldScene.cpp

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

# it is used for ndk-r5 
# if you build with ndk-r4, comment it 
# because the new Windows toolchain doesn't support Cygwin's drive
# mapping (i.e /cygdrive/c/ instead of C:/) 
LOCAL_LDLIBS := -L$(call host-path, $(LOCAL_PATH)/../../libs/armeabi) \
                -lGLESv1_CM \
                -lbox2d \
                -lcocos2d -llog -lcocosdenshion \
                -L$(call host-path, $(LOCAL_PATH)/../../../../cocos2dx/platform/third_party/android/libraries) -lcurl
           
include $(BUILD_SHARED_LIBRARY)


위의 프로젝트 환경 그림을 보시면 libs/ 폴더가 있는데 이 아래에 Box2D 파일들이 들어 있기 때문에 경로를
$(LOCAL_PATH)/../../../libs/Box2D 롤 설정해 주었습니다.

그리고
-lGLESv1_CM 라이브러리 연동은 XCode의 cocos2d-x Box2D 프로젝트 생성기가 생성한 코드에서 OpenGLES 1.x 대 함수를 사용하기 때문에 필요하다고 합니다.

4. Java 소스 코드 수정하기

HelloBox2D.java (프로젝트명을 HelloBox2D로 했기 때문에 HelloBox2D.java 파일입니다. 프로젝트명에 따라 달라질 수 있습니다) 파일을 열어 아래와 같이 Box2D 라이브러리를 로드합니다.

package com.mygame.box2dtest;
import org.cocos2dx.lib.Cocos2dxActivity;
import org.cocos2dx.lib.Cocos2dxGLSurfaceView;

import android.os.Bundle;
import android.widget.EditText;

public class HelloBox2D extends Cocos2dxActivity{
    private Cocos2dxGLSurfaceView mGLView;
   
    protected void onCreate(Bundle savedInstanceState){
        super.onCreate(savedInstanceState);
       
        // get the packageName,it's used to set the resource path
        String packageName = getApplication().getPackageName();
        super.setPackageName(packageName);
       
        setContentView(R.layout.game_demo);
        mGLView = (Cocos2dxGLSurfaceView) findViewById(R.id.game_gl_surfaceview);
        mGLView.setTextField((EditText)findViewById(R.id.textField));

        // Get the size of the mGLView after the layout happens
        mGLView.post(new Runnable() {
           
            @Override
            public void run() {
                Cocos2dxActivity.screenHeight = mGLView.getHeight();
                Cocos2dxActivity.screenWidth = mGLView.getWidth();
            }
        });
    }
   
     @Override
     protected void onPause() {
         super.onPause();
         mGLView.onPause();
     }

     @Override
     protected void onResume() {
         super.onResume();
         mGLView.onResume();
     }
   
     static {
         System.loadLibrary("cocos2d");
         System.loadLibrary("box2d");// 여기입니다!!!
         System.loadLibrary("cocosdenshion");
         System.loadLibrary("game");
     }
}

다 끝났습니다. 아이폰과 안드로이드를 빌드를 하면 Box2D 가 적용된 예제가 잘 실행됩니다. 여기서 안드로이드 용의 앱이 실행되었다가 바로 꺼지면 assets 폴더에 필요한 이미지 파일이 없는 것이니 Resources 폴더의 내용을 assets 폴더에 복사해 주면 됩니다. build_native.sh 를 할 때마다 assets 폴더가 지워지는데요 그것은 혼합 프로젝트 만들기 편에서도 지적했던 build_native.sh 파일의 버그 때문입니다. Resources 를 Resource 라고 적어 매번 폴더가 지워지는 버그가 있습니다.  해당 버그를 수정하려면 아래처럼 수정해 주세요.

# set params
ANDROID_NDK_ROOT=/DevLibs/android-ndk-r6-crystax-2
COCOS2DX_ROOT=/DevLibs/cocos2d-1.0.1-x-0.9.1
GAME_ROOT=$COCOS2DX_ROOT/HelloBox2D
GAME_ANDROID_ROOT=$GAME_ROOT/android
RESOURCE_ROOT=$GAME_ROOT/Resources

# make sure assets is exist
if [ -d $GAME_ANDROID_ROOT/assets ]; then
    rm -rf $GAME_ANDROID_ROOT/assets
fi

mkdir $GAME_ANDROID_ROOT/assets

# copy resources
for file in $RESOURCE_ROOT/*
do
    if [ -d $file ]; then
        cp -rf $file $GAME_ANDROID_ROOT/assets
    fi

    if [ -f $file ]; then
        cp $file $GAME_ANDROID_ROOT/assets
    fi
done

# build
$ANDROID_NDK_ROOT/ndk-build -C $GAME_ANDROID_ROOT $*
 
아래는 아이폰과 안드로이드 폰에서 돌려본 예제 화면입니다.




참고할 프로젝트 파일을 올려드립니다.


맥에서 Keka 로 분할 압축하였습니다. :)

'게임개발팁' 카테고리의 다른 글

iOS OpenGL | ES 튜토리얼 4편  (13) 2012.02.02
cocos2d-X 게임 만들기 6편  (3) 2011.12.06
cocos2d-X 게임 만들기 5편  (7) 2011.11.18
cocos2d-X 게임 만들기 4편  (4) 2011.11.09
cocos2d-X 게임 만들기 3편  (11) 2011.10.13