이 튜토리얼을 통해서 cocos2d-x를 이용하여 아이폰 및 안드로이드를 지원하는 게임을 만들어 보려고 합니다. 만들어 보려고 하는 게임은 http://www.cocos2d-x.org 에도 나와 있는 Ray Wenderlich 의 게임입니다.
1. 통합프로젝트 만들기
우선 아이폰과 안드로이드를 동시에 지원하는 프로젝트를 생성합니다. 이 방법은 예전에 글을 작성하였으므로 넘어가도록 하겠습니다. 아직 못 보신 분들은 아래 링크를 참고해 주세요.
2. 기본 뼈대 만들기
기본으로 생성된 프로젝트의 코드를 제거하고 검은 화면만 나오도록 소스 파일을 수정합니다. 참고로 C++ 코드 작성은 XCode로 하는 것이 정말 편합니다. 특히 XCode4 편집기 능력이 아주 끝내줍니다 :)
프로젝트에서 새로운 파일 추가를 하여 GameScene.h 파일과 GameScene.cpp파일을 추가합니다. 이 파일에 게임씬을 구현하려고 합니다.
파일을 추가한 다음 아래처럼 코드를 작성해 주세요.
// // GameScene.h // NinjaGame // // Created by SUNG CHEOL KIM on 11. 10. 12.. // Copyright 2011 individual. All rights reserved. // #ifndef NinjaGame_GameScene_h #define NinjaGame_GameScene_h #include "cocos2d.h" class GameScene : public cocos2d::CCLayer { public: //: 초기자 //: 아이폰용 cocos2d에서는 id를 반환하지만 cocos2d-x에서는 bool을 반환해야 합니다. virtual bool init(); //: CCScene을 반환하는 클래스 메서드 //: 아이폰에서 cocos2d로 게임을 만들 때 CCLayer를 상속받은 커스텀레이어에서 //: 이런 식으로 클래스 메서드를 만들어서 씬을 많이 반환해 보셨을 겁니다. static cocos2d::CCScene* scene(); //: static node() 메서드를 구현합니다. LAYER_NODE_FUNC(GameScene); }; #endif
// // GameScene.cpp // NinjaGame // // Created by SUNG CHEOL KIM on 11. 10. 12.. // Copyright 2011 individual. All rights reserved. // #include "GameScene.h" //using namespace cocos2d 의 약자 매크로입니다. USING_NS_CC; CCScene *GameScene::scene() { // GameScene레이어를 담아 반환할 씬을 하나 만듭니다. // 자동 메모리 해제 되는 인스턴스입니다. CCScene *scene = CCScene::node(); // 레이어를 생성합니다. GameScene *layer = GameScene::node(); // 레이어를 자식으로 씬에 추가합니다. scene->addChild(layer); return scene; } // 레이어를 초기화합니다. bool GameScene::init() { if( !CCLayer::init() ) { // 초기화에 실패하면 false를 반환합니다. return false; } return true; }
AppDelegate.cpp 파일도 아래처럼 수정해 줍니다. 기존에 있던 #include "HelloWorldScene.h" 문을 지운 다음 CCScene을 GameScene객체로 바꾸어 줍니다.
#include "AppDelegate.h" #include "cocos2d.h" #include "GameScene.h" ... bool AppDelegate::applicationDidFinishLaunching() { ... // create a scene. it's an autorelease object CCScene *pScene = GameScene::scene(); // run pDirector->runWithScene(pScene); return true; }
이제 HelloWorldScene.h 와 HelloWorldScene.cpp 파일을 지우고 iOS와 Android용으로 컴파일해서 원하는 결과가 나오는지 확인해 봅니다.
안드로이드용으로 만들기 위해서는 수작업으로 해 줘야할 것이 있습니다. 매번 소스 파일 추가하거나 삭제할 때 해 줘야 합니다. 프로젝트의 폴더를 $(PROJECT)라고 하겠습니다. 그러면 아래의 경로로 이동하여 Android.mk 파일을 수정합니다.
vi $(PROJECT)/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)/../../../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) \
-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)/../../../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) \
-lcocos2d -llog -lcocosdenshion \
-L$(call host-path, $(LOCAL_PATH)/../../../../cocos2dx/platform/third_party/android/libraries) -lcurl
include $(BUILD_SHARED_LIBRARY)
위의 코드에서 HelloWorldScene.cpp 파일은 사용하지 않으니 해당 줄을 삭제한 다음에 아래 코드처럼 GameScene.cpp 파일을 넣어 줍니다.
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := game
LOCAL_SRC_FILES := main.cpp \
../../../Classes/AppDelegate.cpp \
../../../Classes/GameScene.cpp
LOCAL_C_INCLUDES := $(LOCAL_PATH)/../../../../cocos2dx \
$(LOCAL_PATH)/../../../../cocos2dx/platform \
$(LOCAL_PATH)/../../../../cocos2dx/include \
$(LOCAL_PATH)/../../../../CocosDenshion/include \
$(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) \
-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/GameScene.cpp
LOCAL_C_INCLUDES := $(LOCAL_PATH)/../../../../cocos2dx \
$(LOCAL_PATH)/../../../../cocos2dx/platform \
$(LOCAL_PATH)/../../../../cocos2dx/include \
$(LOCAL_PATH)/../../../../CocosDenshion/include \
$(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) \
-lcocos2d -llog -lcocosdenshion \
-L$(call host-path, $(LOCAL_PATH)/../../../../cocos2dx/platform/third_party/android/libraries) -lcurl
include $(BUILD_SHARED_LIBRARY)
이 후 안드로이드용은 build_native.sh 을 실행한 다음에 이클립스 프로젝트를 리프레쉬 한 다음 빌드를 해야 합니다. 아래는 각 환경에서 코드를 컴파일 후 실행해 본 결과화면입니다.
이번 튜토리얼은 여기서 마치고 다음 편에서 스프라이트를 추가해 보겠습니다. :)
'게임개발팁' 카테고리의 다른 글
cocos2d-X 게임 만들기 3편 (11) | 2011.10.13 |
---|---|
cocos2d-X 게임 만들기 2편 (8) | 2011.10.13 |
iOS OpenGL | ES 튜토리얼 3편 (3) | 2011.10.02 |
iOS OpenGL | ES 튜토리얼 2편 (12) | 2011.09.27 |
iOS OpenGL | ES 튜토리얼 1편 (6) | 2011.09.27 |