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();
역시나 다른 버튼으로 도전과제를 출력하면
스샷과 같이 나옵니다.
이 외에도 도전과제 목록을 요청해서 받을 수 있는기능이 있는 듯 합니다. 추가적인 사항은 애플 개발자 센터 가이드를 참고하세요.
댓글
댓글 쓰기