2014년 7월 31일 목요일

ios에서 cocos2d-x(3.x)의 game view를 특정 뷰의 child view에 붙이기

cocos2d-x의 게임뷰를 특정 뷰의 child뷰로 가져오기 위한 방법입니다.
(cocos2d-x 3.2 버전 기준)


1. cocos2d-x기반의 빈 프로젝트(hello world)를 만듭니다.

2. AppController.mm의 didFinishLaunchingWithOptions 함수 안에
GLView를 생성하고 싱글톤 객체인 cocos2d::Director를 구동하는 코드가 있는데
여기서 이것들을 하면 안되니 모두 지워버립니다. ㅎㅎ

나머지 applicationDidEnterBackground, applicationWillEnterForeground 등의 함수안의 코드는 그냥 그대로 둡니다.


3. 새로운 컨트롤러(이하 CustomViewController)를 만들고 게임뷰를 담을 UIVIew(이하 viewGLViewContainter)객체를 하나 만들어 놓습니다.


4. CustomViewController 소스에서 아래 두 함수를 통해 게임뷰를 생성하여 viewGLViewContainter붙이고 정리하는 코드를 추가합니다.
- (void)viewWillAppear:(BOOL)animated
- (void)viewWillDisappear:(BOOL)animated

소스파일(CustomViewController.mm 소스 파일)에 아래 2개의 헤더를 import합니다.
- cocos2dx의 cpp코드를 사용해야 하니 mm 파일로 만들어야 합니다.

#import "cocos2d.h"
#import "CCEAGLView.h"


viewWillAppear함수에 아래 코드를 추가합니다.
- (void)viewWillAppear:(BOOL)animated
{
    [super viewWillAppear:animated];
    
    // Init the CCEAGLView
    CCEAGLView *eaglView = [CCEAGLView viewWithFrame: self.viewGLViewContainter.bounds
                             pixelFormat: kEAGLColorFormatRGBA8
                             depthFormat: GL_DEPTH24_STENCIL8_OES
                      preserveBackbuffer: NO
                              sharegroup: nil
                           multiSampling: NO
                         numberOfSamples: 0];
    
   
    [self.viewGLViewContainter addSubview:eaglView];

    cocos2d::GLView *glview = cocos2d::GLView::createWithEAGLView(eaglView);
    cocos2d::Director::getInstance()->setOpenGLView(glview);
    
    cocos2d::Application::getInstance()->run();
}

viewWillDisappear함수에 아래 코드를 추가합니다.
- (void)viewWillDisappear:(BOOL)animated
{
    cocos2d::Director::getInstance()->end();

    cocos2d::Director::getInstance()->mainLoop();

    [super viewWillDisappear:animated];
}


정상적이라면 아래와 유사한 화면을 볼 수 있겠습니다.


2014년 7월 30일 수요일

Genymotion Google Play 스토어 설치하기

Genymotion는 구글 플레이스토어를 제공하지 않습니다.
아래와 같은 절차로 스토어 앱을 설치할 수 있습니다.
  1. genymotion 과 VirtualBox을 최신버전으로 업그레이드 합니다.
  2. 두개의 파일을 다운로드 합니다.
    ARM Translation Installer v1.1  http://filetrip.net/dl?4SUOrdcMRv
      arm기반 프로그램을 x86으로 변환해주기 위해 필요합니다.
    -
    Google Apps for Android 4.4 - http://wiki.cyanogenmod.org/w/Google_Apps#gappsCM11  
  3. genymotion 에뮬레이터를 열고 홈스크린으로 이동합니다.Genymotion-ARM-Translation_v1.1.zip 홈파일을 홈스크린에 드레그&드롭합니다.
    파일 작업을 위한 다이알로그가 나타나고 작업진행을 묻는 다이알로그가 나타납니다.
    OK를 누르고 genymotion을 재구동합니다.(adb reboot명령을 쓰거나 아예 다시 띄우거나...)
  4. 다음으로 스토어앱 파일인  gapps-kk-signed.zip 을 위(3)와 같은 방법으로 설치합니다.
  5. 'Google Apps Services'의 크래쉬가 반복적으로 나타나는데  스토어 앱을 열어 계정을 설정하고 구글 스토어앱을 상위버전으로 업데이트 하면 더이상 크래쉬 오류가 발생하지 않습니다.

2014년 7월 5일 토요일

xcode script build phase를 이용해서 build-date 앱에 기록하기

xcode프로젝트 셋팅에 들어가서
Build Phase를 선택합니다.

좌상단의 + 버튼을 눌러 'New Run Script Build Phase' 선택합니다.

shell  /bin/sh 아래 입력창에 다음 내용을 추가합니다.

builddate=`date "+%Y-%m-%d %H:%M:%S"`
if [[ -n "$builddate" ]]; then
# if BuildDateString doesn't exist, add it
/usr/libexec/PlistBuddy -c "Add :BuildDateString $builddate" "${PROJECT_DIR}/${INFOPLIST_FILE}"
# and if BuildDateString already existed, update it
/usr/libexec/PlistBuddy -c "Set :BuildDateString $builddate" "${PROJECT_DIR}/${INFOPLIST_FILE}"

fi;

빌드 타임에 해당 스크립트가 수행되면서 현재 날자를
'1999-01-01 12:00:00'과 같은 형식으로 info.plist파일에 추가하게 됩니다.
이때 추가되는 키는 BuildDataString입니다.

앱 코드에서는 다음과 같이 간단히 빌드날자를 얻어올 수 있습니다.

buildDate = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"BuildDateString"];


* 위 내용은 xcode 5.1.1 버전에서 검토한 내용입니다.