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)
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
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)
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");
}
}
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 $*
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 $*
아래는 아이폰과 안드로이드 폰에서 돌려본 예제 화면입니다.
'게임개발팁' 카테고리의 다른 글
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 |