본문 바로가기

게임개발팁

맥에서 cocos2d-x 개발환경 꾸미기


cocos2d-x 는 기존의 cocos2d-iphone 을 아이폰, 안드로이드폰 및 기타 폰 용 게임을 동일한 코드로 제작할 수 있게 해 주는 멀티플랫폼 게임엔진입니다. 오픈소스로 제작되고 있으며 C++로 제작 되어 있습니다.이 글에서는 맥환경에서 cocos2d-x로 아이폰과 안드로이드 게임을 동시에 개발하기 위해서 cocos2d-x 개발 환경 꾸미기를 다뤄보겠습니다. 우선 아이폰과 안드로이드 개발 환경이 갖추어져 있다는 가정하에 글을 시작합니다. 혹시 맥에 안드로이드 개발환경이 갖추어져 있지 않다면 제 블로그의 맥에서 안드로이드 개발환경 꾸미기 글을 참고해 주세요.

이 글은 아래의 순서로 진행합니다.

  1. cocos2d-x 엔진 받기
  2. Crystax 안드로이드 NDK 라이브러리 받기
  3. cocos2d-x 엔진 및 NDK 라이브러리 설치하기
  4. 안드로이드용 cocos2d-x 프로젝트 만들기
  5. 아이폰과 안드로이드 혼합 프로젝트 만들기
  6. 혼합 프로젝트 테스트

본격적으로 글을 실작하기 전에 cocos2d-x와 crystax NDK 는 루트 경로에 있는 /DevLibs/ 하위 폴더에 설치된다고 가정하겠습니다. :)

1. cocos2d-x 엔진 받기

cocos2d-x의 공식 싸이트에 방문하셔서 stable 버전의 엔진을 받습니다. 혹은 현재 최신 버전인 cocos2d-x 0.9.1 버전을 바로 받을 실 분은 아래의 링크를 눌러 파일을 받으세요.
파일을 받은 다음 /DevLibs/ 하위 폴더에 압축을 풉니다.



2. Crystax 안드로이드 NDK 라이브러리 받기

cocos2d-x는 C++로 코드를 작성한 다음 NDK로 컴파일하여 안드로이드용 앱 개발을 지원합니다. 이 때 Crystax NDK가 필요합니다. 그 이유는 cocos2d-x가 내부에서 STL 을 사용하는데 Crystax NDK가 STL을 지원하기 때문입니다.

Crystax 싸이트를 방문하셔서 최신 NDK 를 받으세요. 아니면 최신 버전인 Android NDK r6를 받으시려면 아래의 링크를 눌러서 파일을 받습니다.
파일을 받은 다음 /DevLibs/ 하위 폴더에 압축을 풉니다.


3. cocos2d-x 엔진 및 NDK 라이브러리 설치하기

cocos2d-x용 프로젝트 템플릿을 설치하기 전에 필요한 경로 설정을 해야 합니다. 여기서 설정하는 경로들이 나중에 cocos2d-x가 프로젝트를 생성할 때 사용하기 때문입니다.

자신의 홈 디렉토리로 이동하여 아래와 같이 bash 프로파일을 수정합니다. .bash_profile 또는 .profile 입니다.

$ cd ~
$ vi .profile
프로파일 파일을 연 다음 아래의 내용을 입력합니다.

export ANDROID_NDK_ROOT=/DevLibs/android-ndk-r6-crystax-2/
export COCOS2DX_ROOT=/DevLibs/cocos2d-1.0.1-x-0.9.1/
export NDK_ROOT=/DevLibs/android-ndk-r6-crystax-2/
export ANDROID_SDK_ROOT=/DevLibs/android-sdk-mac_x86
export PATH=$PATH:$ANDROID_NDK_ROOT
export PATH=/opt/local/bin:/opt/local/sbin:$PATH
작성한 내용을 저장합니다.

이제 프로젝트 템플릿을 설치해 보겠습니다. cocos2d-x가 설치된 경로로 이동합니다. 이 글의 기준으로 /DevLibs/cocos2d-1.0.1-x-0.9.1 폴더입니다.

cd /DevLibs/cocos2d-1.0.1-x-0.9.1
sudo ./install-templates-xcode.sh

위의 명령을 실행하면 아래와 같이 어떤 버전의 XCode  용 프로젝트 템플릿을 설치할 것인지 묻습니다.

cocos2d-x template installer
select the template version to install
3 for xcode3
4 for xcode4
input nothing for all
3을 입력하면 xcode3 용 템플릿이 설치되고 4를 입력하면 xcode4용 템플릿이 설치됩니다. 그냥 엔터를 누르면 둘 다 설치됩니다. 저는 두 버전의 xcode를 사용하기 때문에요 그냥 엔터를 눌렀습니다.
Installing Xcode 3 cocos2d-x iOS template
----------------------------------------------------

removing old libraries: /Library/Application Support/Developer/Shared/Xcode/Project Templates/cocos2d-1.0.1-x-0.9.1/cocos2d-x Application/
...creating destination directory: /Library/Application Support/Developer/Shared/Xcode/Project Templates/cocos2d-1.0.1-x-0.9.1/cocos2d-x Application/
...copying template files
...copying cocos2dx files
...copying CocosDenshion files
done!



Installing cocos2d-x iOS + box2d template
----------------------------------------------------

removing old libraries: /Library/Application Support/Developer/Shared/Xcode/Project Templates/cocos2d-1.0.1-x-0.9.1/cocos2d-x Box2d Application/
...creating destination directory: /Library/Application Support/Developer/Shared/Xcode/Project Templates/cocos2d-1.0.1-x-0.9.1/cocos2d-x Box2d Application/
...copying template files
...copying cocos2dx files
...copying CocosDenshion files
...copying Box2D files
done!



Installing cocos2d-x iOS + chipmunk template
----------------------------------------------------

removing old libraries: /Library/Application Support/Developer/Shared/Xcode/Project Templates/cocos2d-1.0.1-x-0.9.1/cocos2d-x chipmunk Application/
...creating destination directory: /Library/Application Support/Developer/Shared/Xcode/Project Templates/cocos2d-1.0.1-x-0.9.1/cocos2d-x chipmunk Application/
...copying template files
...copying cocos2dx files
...copying CocosDenshion files
...coping chipmunk files



Installing cocos2d-x iOS + lua template
----------------------------------------------------

removing old libraries: /Library/Application Support/Developer/Shared/Xcode/Project Templates/cocos2d-1.0.1-x-0.9.1/cocos2d-x lua Application/
...creating destination directory: /Library/Application Support/Developer/Shared/Xcode/Project Templates/cocos2d-1.0.1-x-0.9.1/cocos2d-x lua Application/
...copying template files
...copying cocos2dx files
...copying CocosDenshion files
...coping lua files
done!



Installing Xcode 4 cocos2d-x iOS template
----------------------------------------------------

removing old libraries: /Users/softdna/Library/Developer/Xcode/Templates/cocos2d-x/
...creating destination directory: /Users/softdna/Library/Developer/Xcode/Templates/cocos2d-x/
...copying cocos2d files
...copying CocosDenshion files
...copying template files
done!



Installing Xcode 4 Chipmunk iOS template
----------------------------------------------------

...copying Chipmunk files
done!



Installing Xcode 4 Box2d iOS template
----------------------------------------------------

...copying Box2D files
done!



Installing Xcode 4 lua iOS template
----------------------------------------------------

...copying lua files
done!
done!

위의 화면처럼 설치 메시지들이 나오면서 XCode용 프로젝트 템플릿이 설치되었습니다.


4. 안드로이드용 cocos2d-x 프로젝트 만들기

cocos2d-x에서는 안드로이드용 프로젝트를 쉽게 만들어주기 위해서 쉘스크립트를 제공합니다.

cocos2d-x가 설치된 폴더에서 해당 쉘스크립트를 실행합니다.

cd /DevLibs/cocos2d-1.0.1-x-0.9.1
./create-android-project.sh

그러면 아래와 같이 안드로이드 프로젝트르 생성하기 위해 필요한 내용들을 물어봅니다.

패키지 경로에는 예처럼 편하게 적어 주세요. 저는 com.myproject.cocos2dx.example 라고 적었습니다.
Input package path. For example: org.cocos2dx.example
com.myproject.cocos2dx.example

그러면 안드로이드 타겟을 물어봅니다.

Now cocos2d-x suppurts Android 2.1-update1, 2.2, 2.3 & 3.0
Other versions have not tested.
Available Android targets:
id: 1 or "android-3"
     Name: Android 1.5
     Type: Platform
     API level: 3
     Revision: 4
     Skins: HVGA (default), HVGA-L, HVGA-P, QVGA-L, QVGA-P
id: 2 or "Google Inc.:Google APIs:3"
     Name: Google APIs
     Type: Add-On
     Vendor: Google Inc.
     Revision: 3
     Description: Android + Google APIs
     Based on Android 1.5 (API level 3)
     Libraries:
      * com.google.android.maps (maps.jar)
          API for Google Maps
     Skins: QVGA-P, HVGA-L, HVGA (default), QVGA-L, HVGA-P
id: 3 or "android-4"
     Name: Android 1.6
     Type: Platform
     API level: 4
     Revision: 3
     Skins: HVGA, QVGA, WVGA800 (default), WVGA854
id: 4 or "Google Inc.:Google APIs:4"
     Name: Google APIs
     Type: Add-On
     Vendor: Google Inc.
     Revision: 2
     Description: Android + Google APIs
     Based on Android 1.6 (API level 4)
     Libraries:
      * com.google.android.maps (maps.jar)
          API for Google Maps
     Skins: WVGA854, HVGA, WVGA800 (default), QVGA
id: 5 or "android-7"
     Name: Android 2.1-update1
     Type: Platform
     API level: 7
     Revision: 3
     Skins: HVGA, QVGA, WQVGA400, WQVGA432, WVGA800 (default), WVGA854
id: 6 or "Google Inc.:Google APIs:7"
     Name: Google APIs
     Type: Add-On
     Vendor: Google Inc.
     Revision: 1
     Description: Android + Google APIs
     Based on Android 2.1-update1 (API level 7)
     Libraries:
      * com.google.android.maps (maps.jar)
          API for Google Maps
     Skins: WVGA854, WQVGA400, HVGA, WQVGA432, WVGA800 (default), QVGA
id: 7 or "android-8"
     Name: Android 2.2
     Type: Platform
     API level: 8
     Revision: 3
     Skins: HVGA, QVGA, WQVGA400, WQVGA432, WVGA800 (default), WVGA854
id: 8 or "Google Inc.:Google APIs:8"
     Name: Google APIs
     Type: Add-On
     Vendor: Google Inc.
     Revision: 2
     Description: Android + Google APIs
     Based on Android 2.2 (API level 8)
     Libraries:
      * com.google.android.maps (maps.jar)
          API for Google Maps
     Skins: WVGA854, WQVGA400, HVGA, WQVGA432, WVGA800 (default), QVGA
id: 9 or "LGE:Real3D Add-On:8"
     Name: Real3D Add-On
     Type: Add-On
     Vendor: LGE
     Revision: 1
     Description: Real3D add-on
     Based on Android 2.2 (API level 8)
     Libraries:
      * com.lge.real3d (real3d.jar)
          Real3D library
     Skins: WVGA854, WQVGA400, Optimus3D (default), HVGA, WQVGA432, WVGA800, QVGA
id: 10 or "Samsung Electronics Co., Ltd.:GALAXY Tab Addon:8"
     Name: GALAXY Tab Addon
     Type: Add-On
     Vendor: Samsung Electronics Co., Ltd.
     Revision: 1
     Based on Android 2.2 (API level 8)
     Skins: WVGA854, WQVGA400, GALAXY Tab (default), HVGA, WQVGA432, WVGA800, QVGA
id: 11 or "android-9"
     Name: Android 2.3.1
     Type: Platform
     API level: 9
     Revision: 2
     Skins: HVGA, QVGA, WQVGA400, WQVGA432, WVGA800 (default), WVGA854
id: 12 or "Google Inc.:Google APIs:9"
     Name: Google APIs
     Type: Add-On
     Vendor: Google Inc.
     Revision: 2
     Description: Android + Google APIs
     Based on Android 2.3.1 (API level 9)
     Libraries:
      * com.google.android.maps (maps.jar)
          API for Google Maps
     Skins: WVGA854, WQVGA400, HVGA, WQVGA432, WVGA800 (default), QVGA
id: 13 or "android-10"
     Name: Android 2.3.3
     Type: Platform
     API level: 10
     Revision: 2
     Skins: HVGA, QVGA, WQVGA400, WQVGA432, WVGA800 (default), WVGA854
id: 14 or "Google Inc.:Google APIs:10"
     Name: Google APIs
     Type: Add-On
     Vendor: Google Inc.
     Revision: 2
     Description: Android + Google APIs
     Based on Android 2.3.3 (API level 10)
     Libraries:
      * com.android.future.usb.accessory (usb.jar)
          API for USB Accessories
      * com.google.android.maps (maps.jar)
          API for Google Maps
     Skins: WVGA854, WQVGA400, HVGA, WQVGA432, WVGA800 (default), QVGA
id: 15 or "Sony Ericsson Mobile Communications AB:EDK 1.1:10"
     Name: EDK 1.1
     Type: Add-On
     Vendor: Sony Ericsson Mobile Communications AB
     Revision: 1
     Description: XPERIA Device
     Based on Android 2.3.3 (API level 10)
     Libraries:
      * com.sonyericsson.media.infinite.extension_1 (com.sonyericsson.media.infinite.extension_1.jar)
          Library for Android Market filtering
      * com.sonyericsson.eventstream_1 (com.sonyericsson.eventstream.jar)
          Library for Android Market filtering
      * com.sonyericsson.eventstream_2 (com.sonyericsson.eventstream.jar)
          Library for Android Market filtering
     Skins: WVGA854, WQVGA400, HVGA, WQVGA432, WVGA800, QVGA, HVGA_XPERIA, WVGA_XPERIA (default)
id: 16 or "android-11"
     Name: Android 3.0
     Type: Platform
     API level: 11
     Revision: 2
     Skins: WXGA (default)
id: 17 or "Google Inc.:Google APIs:11"
     Name: Google APIs
     Type: Add-On
     Vendor: Google Inc.
     Revision: 1
     Description: Android + Google APIs
     Based on Android 3.0 (API level 11)
     Libraries:
      * com.google.android.maps (maps.jar)
          API for Google Maps
     Skins: WXGA (default)
id: 18 or "android-12"
     Name: Android 3.1
     Type: Platform
     API level: 12
     Revision: 3
     Skins: WXGA (default)
id: 19 or "Google Inc.:Google APIs:12"
     Name: Google APIs
     Type: Add-On
     Vendor: Google Inc.
     Revision: 1
     Description: Android + Google APIs
     Based on Android 3.1 (API level 12)
     Libraries:
      * com.android.future.usb.accessory (usb.jar)
          API for USB Accessories
      * com.google.android.maps (maps.jar)
          API for Google Maps
     Skins: WXGA (default)
id: 20 or "android-13"
     Name: Android 3.2
     Type: Platform
     API level: 13
     Revision: 1
     Skins: WXGA (default)
id: 21 or "Google Inc.:Google APIs:13"
     Name: Google APIs
     Type: Add-On
     Vendor: Google Inc.
     Revision: 1
     Description: Android + Google APIs
     Based on Android 3.2 (API level 13)
     Libraries:
      * com.android.future.usb.accessory (usb.jar)
          API for USB Accessories
      * com.google.android.maps (maps.jar)
          API for Google Maps
     Skins: WXGA (default)
input target id:

자신이 사용하고 있는 안드로이드 폰의 버전 또는 AVD 로 생성해 놓은 가상 기기의 SDK버전을 선택합니다. 저는 2.2버전의 AVD를 생성해 놓았기 때문에 id 7을 입력했습니다.

input target id:
7
input your project name:

그러면 프로젝트 이름을 물어봅니다. 편하게 아무 이름을 입력합니다 저는 HelloCocos2DX라고 적었습니다. 그러면 해당 폴더를 만들고 프로젝트 파일들을 설치합니다.

input target id:
7
input your project name:
HelloCocos2DX
Created project directory: /DevLibs/cocos2d-1.0.1-x-0.9.1/HelloCocos2DX
Created directory /DevLibs/cocos2d-1.0.1-x-0.9.1/HelloCocos2DX/src/com/myproject/cocos2dx/example
Added file /DevLibs/cocos2d-1.0.1-x-0.9.1/HelloCocos2DX/src/com/myproject/cocos2dx/example/HelloCocos2DX.java
Created directory /DevLibs/cocos2d-1.0.1-x-0.9.1/HelloCocos2DX/res
Created directory /DevLibs/cocos2d-1.0.1-x-0.9.1/HelloCocos2DX/bin
Created directory /DevLibs/cocos2d-1.0.1-x-0.9.1/HelloCocos2DX/libs
Created directory /DevLibs/cocos2d-1.0.1-x-0.9.1/HelloCocos2DX/res/values
Added file /DevLibs/cocos2d-1.0.1-x-0.9.1/HelloCocos2DX/res/values/strings.xml
Created directory /DevLibs/cocos2d-1.0.1-x-0.9.1/HelloCocos2DX/res/layout
Added file /DevLibs/cocos2d-1.0.1-x-0.9.1/HelloCocos2DX/res/layout/main.xml
Created directory /DevLibs/cocos2d-1.0.1-x-0.9.1/HelloCocos2DX/res/drawable-hdpi
Created directory /DevLibs/cocos2d-1.0.1-x-0.9.1/HelloCocos2DX/res/drawable-mdpi
Created directory /DevLibs/cocos2d-1.0.1-x-0.9.1/HelloCocos2DX/res/drawable-ldpi
Added file /DevLibs/cocos2d-1.0.1-x-0.9.1/HelloCocos2DX/AndroidManifest.xml
Added file /DevLibs/cocos2d-1.0.1-x-0.9.1/HelloCocos2DX/build.xml
Added file /DevLibs/cocos2d-1.0.1-x-0.9.1/HelloCocos2DX/proguard.cfg
만들어진 폴더로 들어가 보면 아래의 화면처럼 세개의 폴더가 만들어져 있습니다.


cocos2d-x는 C++로 작성되기 때문에 코딩 작업은 Classes 폴더에 있는 파일에 하게 됩니다.


편집기는 편한 것을 사용하시면 됩니다. 하지만! 아이폰용 혼합 프로젝트를 만들면 XCode로 쉽게 편집할 수 있기 때문에 혼합프로젝트를 만들어 작업하는게 훨씬 좋습니다. 그 내용은 다음 절에서 알아보겠습니다.

일단은 해당 내용을 이클립스에서 불러와 보겠습니다. 이클립스를 실행하고 File > New > Project 메뉴를 실행합니다.


Android Project를 선택하고 Next > 버튼을 실행합니다. 그러면 프로젝트 생성 설정창이 나오는데 아래 그림처럼 Create project from existing source 를 선택합니다. 그리고 Location 항목에서 Browse... 버튼을 선택해 위에서 만들었던  HelloCocos2DX 폴더의 android 폴더를 선택합니다. 그러면 Location항목이 /DevLibs/cocos2d-1.0.1-x-0.9.1/HelloCocos2DX/android 해당 경로로 설정되면서 Project name 과 기타 항목들이 자동으로 설정되게 됩니다.


Finish 버튼을 눌러 프로젝트 생성을 마무리합니다.


그러면 위의 화면처럼 프로젝트가 올바르게 생성된 모습을 확인할 수 있습니다. 이 화면에서 컴파일을 시도하면 에러가 발생합니다. 그 이유는 cocos2d-x는 C++로 작성되었기 때문에 해당 코드를 사용하려면 NDK로 컴파일된 오브젝트드를이 필요하기 때문입니다.

다시 콘솔을 열고 /DevLibs/cocos2d-1.0.1-x-0.9.1/HelloCocos2DX/android 폴더로 이동합니다. 매번 콘솔을 열고 들어가기가 복잡하다면 맥앱스토어에서 Go2Shell 앱을 받아보세요. Finder의 현재 경로로 이동한 콘솔을 만들어 줍니다.

NDK 컴파일을 하기 위해서는 cocos2d-x 가 제공해 주는  build_native.sh 쉘스크립트를 실행해 주면 됩니다.
cd /DevLibs/cocos2d-1.0.1-x-0.9.1/HelloCocos2DX/android
./build_native.sh
그러면 컴파일이 진행됩니다.  우선 cocos2d-x를 컴파일하고 게임 파일을 컴파일합니다.

Gdbserver      : [arm-linux-androideabi-4.4.3] libs/armeabi/gdbserver
Gdbsetup       : libs/armeabi/gdb.setup
Compile++ thumb  : cocos2d <= CCConfiguration.cpp
Compile++ thumb  : cocos2d <= CCDrawingPrimitives.cpp
Compile++ thumb  : cocos2d <= CCScheduler.cpp
Compile++ thumb  : cocos2d <= CCCamera.cpp
Compile++ thumb  : cocos2d <= CCAction.cpp
Compile++ thumb  : cocos2d <= CCActionCamera.cpp
...
StaticLibrary  : libstdc++.a
Prebuilt       : libstlport_static.a <= <NDK>/sources/cxx-stl/stlport/libs/armeabi/
SharedLibrary  : libcocos2d.so
Install        : libcocos2d.so => libs/armeabi/libcocos2d.so

...
Compile++ thumb  : game <= main.cpp
Compile++ thumb  : game <= AppDelegate.cpp
Compile++ thumb  : game <= HelloWorldScene.cpp
SharedLibrary  : libgame.so
Install        : libgame.so => libs/armeabi/libgame.so
컴파일이 완료되면 다시 이클립스로 되돌아와 F5를 눌러 Package Explorer 를 리프레쉬합니다.

그러면 jni, libs, obj 폴더가 추가되는 것을 확인할 수 있습니다. 이제 안드로이드 프로젝트를 컴파일하고 실행만 하면 되는데 그전에 해야할 일이 있습니다. 바로 리소스를 복사하는 것입니다.


/DevLibs/cocos2d-1.0.1-x-0.9.1/HelloCocos2DX/Resources 파일들을 모두 선택한 후 드래그 해서 이클립스의 assets 폴더에 놓습니다. 그러면 복사가 됩니다.


이제 이클립스에서 컴파일하고 실행을 합니다. 그러면 안드로이드 시뮬레이터 또는 안드로이드 폰이 실행되면서 HelloCocos2DX.apk 가 설치됩니다.


위의 앱을 실행하면 아래와 같이 정상적으로 cocos2d-x 로 만든 게임이 실행됩니다.


시뮬레이터에서 실행해서 프레임률이 9.9로 나오지만 실제 폰에서 실행하면 59.0 ~ 60.0 프레임이 나옵니다.


5. 아이폰과 안드로이드 혼합 프로젝트 만들기

이제 위에서 만든 프로젝트를 가지고 아이폰과 안드로이드 혼합프로젝트를 만들어 보겠습니다.

우선 XCode를 실행합니다. 저는 XCode4로 생성해 보겠습니다.


Create a new Xcode project를 선택해서 새로운 프로젝트를 만듭니다. cocos2d-x 카테고리를 선택하신 후 cocos2dx 프로젝트를 선택하고 Next 버튼을 누릅니다.


Product Name 항목에는 위에서 안드로이드 프로젝트를 만들 때 설정했던 프로젝트 이름과 동일하게 만들어 줍니다. 이부분이 중요합니다.


Next 버튼을 누른 다음 아무 폴더에 프로젝트를 만듭니다. 프로젝트가 만들어지면 프로젝트를 선택한 후 Show in Finder 메뉴를 선택해 Finder 를 실행합니다.


파인더가 실행되면 아래 화면처럼 HelloCocos2DX폴더를 선택한 다음 하위 폴더인 HelloCocos2DX폴더 내부의 파일과 디렉토리를 Cmd+c 키를 눌러서 복사를 합니다.


위의 부분이 XCode3와 XCode4의 차이점인데요 XCode3는 xcodeproj 파일(실제는 번들)과 Prefix.pch, Classes 등의 파일과 폴더들이 동일 폴더에 생성되는데 XCode4에서는 프로젝트이름으로 폴더가 생기고 그 안에 xcodeproj 파일이 생성된 다음 그 하위로 다시 프로젝트이름으로 폴더가 생성된 다음 그곳에 프로젝트 파일들이 들어 있습니다. 그래서 이 부분에서 진행 방법이 약간 다릅니다. XCode3는 제일 끝부분에서 알아보도록 하겠습니다. 우선은 XCode4를 기준으로 설명하겠습니다.

그런 다음 다시 cocos2d-x 가 설치되어 있는 폴더로 이동합니다. 제 경우에는 /DevLibs/cocos2d-1.0.1-x-0.9.1 입니다. 그리고 나서 위에서 만들었던 안드로이드 프로젝트인 HelloCocos2DX 폴더로 이동합니다. /DevLibs/cocos2d-1.0.1-x-0.9.1/Cocos2DX  그리고 복사해 두었던 내용을 그대로 붙여넣기를 합니다. 아래 그림은 붙여넣기를 하고 난 후의 /DevLibs/cocos2d-1.0.1-x-0.9.1/Cocos2DX 폴더의 구조입니다.


그리고 XCode4로 생성한 프로젝트의 폴더에서 HelloCocos2DX.xcodeproj 파일을 /DevLibs/cocos2d-1.0.1-x-0.9.1/ 에 복사해 줍니다. 아래는 모두 완료 되었을 경우 /DevLibs/cocos2d-1.0.1-x-0.9.1 폴더 구조입니다.


이제 아이폰과 안드로이드 혼합 프로젝트가 완성되었습니다. 생각보다 간다하죠 ^^

6. 혼합 프로젝트 테스트

혼합 프로젝트를 만들었으니 테스트 코드를 입력한 후 아이폰과 안드로이드 모두에 잘 적용되는지 확인해 봅시다.

위의 혼합 프로젝트에서 XCode프로젝트를 선택합니다. Objective-C는 C의 슈퍼셋이기 때문에 C와 C++문법도 지원합니다. 그리고 XCode4에서는 cclang 이라는 LLVM 의 편집기 컴포넌트가 포함되어 있기 때문에 실시간 문법 오류 등을 잡아줍니다. 따라서 이클립스 보다는 XCode로 선 코딩하고 안드로이드에 적용하는 것이 좋습니다.

아래와 같이 코드를 추가합니다.
우선 HelloWorldScene.h 파일에서 C++클래스 파일에 액션 멤버 함수를 추가합니다. 굵게 표시한 부분을 추가해 주세요.

class HelloWorld : public cocos2d::CCLayer
{
public:
    // Here's a difference. Method 'init' in cocos2d-x returns bool, instead of returning 'id' in cocos2d-iphone
    virtual bool init(); 

    // there's no 'id' in cpp, so we recommand to return the exactly class pointer
    static cocos2d::CCScene* scene();
   
    // a selector callback
    virtual void menuCloseCallback(CCObject* pSender);

   
    void scaleDown(CCNode* sender);
    void scaleUp(CCNode* sender);
    // implement the "static node()" method manually
    LAYER_NODE_FUNC(HelloWorld);
};

#endif // __HELLOWORLD_SCENE_H__
그런 다음 HelloWorldScene.cpp 파일로 이동하여 아래의 굵게 표시한 코드를 추가합니다.

bool HelloWorld::init()
{
...
    // add the sprite as a child to this layer
    this->addChild(pSprite, 0);
   
   
    this->scaleUp(pSprite);   
    return true;
}

void HelloWorld::scaleUp(CCNode* sender)
{
    CCScaleTo *scaleTo = CCScaleTo::actionWithDuration(0.5, 1.0);
    CCCallFuncN *call  = CCCallFuncN::actionWithTarget(this, callfuncN_selector(HelloWorld::scaleDown));
    sender->runAction(CCSequence::actions(scaleTo, call, NULL));
}

void HelloWorld::scaleDown(CCNode* sender)
{
    CCScaleTo *scaleTo = CCScaleTo::actionWithDuration(0.5, 2.0);
    CCCallFuncN *call  = CCCallFuncN::actionWithTarget(this, callfuncN_selector(HelloWorld::scaleUp));
    sender->runAction(CCSequence::actions(scaleTo, call, NULL));
}

이렇게 입력하고 빌드한 후 실행하면 아이폰 시뮬레이터가 실행되면서 배경화면이 확대되고 축소되고 합니다.


이제 안드로이드용으로 컴파일 해 봅시다. 이클립스로 돌아가기전에 콘솔로 /DevLibs/cocos2d-1.0.1-x-0.9.1/HelloCocos2DX/android 로 이동하여 build_native.sh 를 실행합니다.
cd /DevLibs/cocos2d-1.0.1-x-0.9.1/HelloCocos2DX/android
./build_native.sh
그런 다음 이클립스로 되돌아 옵니다. 그리고 다시 프로젝트 패키지를 선택하고 F5, 즉 리프레쉬를 해 줍니다. 이 때 assets 폴더의 내용이 지워지는데 이는 build_native.sh 에 assets폴더의 내용을 지우는 스크립트가 있어서 그렇습니다. 다음 절에서 이 부분을 생략하는 부분을 알아보겠습니다. 지금은 다시 Resources 폴더의 내용을 다시 assets폴더로 복사합니다. 그리고 다시 빌드를 한 후 실행하면 시뮬레이터가 실행되면서 아래와 같이 동일한 결과가 출력됩니다.


번외) assets 파일이 지워지는 것 막기
build_native.sh 파일을 편집기로 엽니다. 그리고 아래의 코드를 수정해 줍니다.

# 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/HelloCocos2DX
GAME_ANDROID_ROOT=$GAME_ROOT/android
RESOURCE_ROOT=$GAME_ROOT/Resource

RESOURCE_ROOT 항목을 아래처럼 변경해 줍니다. 제일 끝에 s자를 붙여주세요.

# 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/HelloCocos2DX
GAME_ANDROID_ROOT=$GAME_ROOT/android
RESOURCE_ROOT=$GAME_ROOT/Resources
번외) XCode3로 생성한 프로젝트 합치기.
XCode3로 생성했을 때는 더 간단하게 프로젝트를 합칠 수 있습니다. 어찌보면 더 깔끔합니다.

XCode3는 한 폴더 안에 모든 파일을 만들어 놓기 때문에 HelloCocos2DX 폴더 안의 모든 파일과 폴더를 그대로 복사하시면 됩니다.

이 폴더의 내용을 /DevLibs/cocos2d-1.0.1-x-0.9.1/HelloCocos2DX 에 그대로 복사합니다. 아래 화면은 복사한 후 /DevLibs/cocos2d-1.0.1-x-0.9.1/HelloCocos2DX 폴더의 구조입니다.


XCode3로 생성한 프로젝트와 안드로이드 프로젝트를 합친 샘플을 첨부합니다. 많은 도움이 되길 바랍니다. :) 참고로 맥에서 Keka 로 분할 압출하였습니다.

HelloCocos2DX.zip.001

HelloCocos2DX.zip.002


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

iOS OpenGL | ES 튜토리얼 2편  (12) 2011.09.27
iOS OpenGL | ES 튜토리얼 1편  (6) 2011.09.27
cocos3D 설치하기  (0) 2011.09.21
유니티3D 초급 강좌 모음  (2) 2011.09.20
아이폰용 오픈소스 3D 게임엔진 갤럭시  (0) 2010.10.07