cocos2d-x iOS Game Center Achievements 연동

 지난 포스팅에서 cocos2d-x에 iOS Game Center의 Leaderboard를 연동했었습니다. 이번에는 도전과제인 Achievements를 연동하는 것을 정리해봅니다. 본격적인 작업에 앞서 링크에서 GameCenter 초기화 부분과 iTunes Connect에서 설정작업이 되어 있다는 전제하에 진행합니다. 참고로 Leaderboard 작업분은 object-c로 진행했는데 Achievements는 class 선언과 구현부를 c++로 코딩했습니다.

///< GameCenter.h 파일

///< 기존 GKLeaderboardViewControllerDelegate만 있던것에 GKAchievementViewControllerDelegate 추가해준다.

NSObject<
GKLeaderboardViewControllerDelegate
GKAchievementViewControllerDelegate>


///< GameCenter.mm

///< 도전과제 제출. pszAchievementId - 웹에서 추가한 도전과제ID
void GameCenter::reportAchievement( const char* pszAchievementId, float percent )
{
    GKAchievement* pAchievement = [[[GKAchievement alloc] initWithIdentifier:[NSString stringWithUTF8String:pszAchievementId]] autorelease];
    
    if( pAchievement )
    {
        ///< 도전과제 진행률 설정
        pAchievement.percentComplete = percent;
        [pAchievement reportAchievementWithCompletionHandler:^(NSError *error)
        {
            if( error != nil )
            {
                CCMessageBox("reportAchievement Error", "Game Center" );
            }
            else
            {
                CCLOG("GameCenter reportAchievement - %s, %d", pszAchievementId, percent);
            }
        }];
    }
}

///< 도전과제 출력
void GameCenter::showAchievement()
{
    GKAchievementViewController* pGKViewController = [[[GKAchievementViewController alloc] init] autorelease];
    
    if( pGKViewController != nil )
    {
        pGKViewController.achievementDelegate = self;
        ///< UIViewController* gBoardUIViewController = 0; 전역 변수
        if( gBoardUIViewController != nil )
        {
            [gBoardUIViewController release];
        }
        
        gBoardUIViewController = [[UIViewController alloc] init];
        [[[EAGLView sharedEGLView] window] addSubview:gBoardUIViewController.view];
        [gBoardUIViewController presentModalViewController:pGKViewController animated:YES];
        CCLOG("GameCenter showAchievement");
    }
}

///< 도전과제 창이 닫힐 때
- (void) achievementViewControllerDidFinish:(GKAchievementViewController *)viewController
{
    [viewController dismissModalViewControllerAnimated:YES];
    [viewController.view.superview removeFromSuperview];

}

///< 서버상의 도전과제 내역을 삭제
void GameCenter::resetAchievements()
{
    [GKAchievement resetAchievementsWithCompletionHandler:^(NSError *error)
    {
        if( error != nil )
        {
            CCMessageBox("resetAchievements Faile", "Game Center" );
        }
        else
        {
            CCMessageBox("resetAchievements Success", "Game Center" );
        }
    }];
}

 리더보드와 비슷한 점이 많고, 리더보드 할 때와같이 예외상황은 발생하지 않아 간단하게 주석으로 설명을 대체했습니다.

GameCenter::sharedGameCenter()->reportScore"testLBId"100 );
 간단히 버튼을 눌러 도전과제 퍼센트를 설정하고 

GameCenter::sharedGameCenter()->showAchievement();
 역시나 다른 버튼으로 도전과제를 출력하면

 스샷과 같이 나옵니다.

 이 외에도 도전과제 목록을 요청해서 받을 수 있는기능이 있는 듯 합니다. 추가적인 사항은 애플 개발자 센터 가이드를 참고하세요.

댓글

이 블로그의 인기 게시물

라즈베리파이 라즈비안 한글 입력하기 - IBus

라즈베리파이 라즈비안 한글 깨짐 수정하기

'xxx.exe' 프로그램을 시작할 수 없습니다. 지정된 파일을 찾을 수 없습니다.