본문 바로가기

게임개발팁

cocos2d-X 게임 만들기 1편


이 튜토리얼을 통해서 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)


위의 코드에서 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)

이 후 안드로이드용은 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