반응형
블로그 이미지
개발자로서 현장에서 일하면서 새로 접하는 기술들이나 알게된 정보 등을 정리하기 위한 블로그입니다. 운 좋게 미국에서 큰 회사들의 프로젝트에서 컬설턴트로 일하고 있어서 새로운 기술들을 접할 기회가 많이 있습니다. 미국의 IT 프로젝트에서 사용되는 툴들에 대해 많은 분들과 정보를 공유하고 싶습니다.
솔웅

최근에 받은 트랙백

글 보관함

Game Center Integration (iOS)

2012. 1. 19. 13:26 | Posted by 솔웅


Tutorial: Game Center Integration (iOS)
Jonathan Beebe

iOS의 게임센터를 이용할 수 있는 기능이 daily build 2012.725에 포함 됐습니다.
이 iOS 의 Game Center를 어떻게 이용해야 하는지 살펴보겠습니다.
이번에 선보인 iOS Game Center 이용 기능은 기존의 gameNetwork API의 연장입니다.

iOS Game Center를 이용하기 위해 Apple side에서 어떤 일을 해야 하고 (iTunes Connect), 코로나에서는 어떤 셋업이 필요한지 그리고 여러분의 앱에서 이 기능을 제대로 이용하려면 어떻게 해야 되는지에 대해 간단히 알아보겠습니다.

Game Center는 다른 game networks(OpenFeint, Papaya)와 비교해서 좀 다른식으로 적용해야 합니다. build.settings와 System Event 파트를 다룰 때 이 부분을 이야기 하겠습니다.

***** iTunes Connect
Link: Visit the iTunes Connect Portal

Game Center를 이용하기 위해 Apple 쪽에서 해야 할 일에 대해서는 자세히 언급하지는 않겠습니다.
간단히 말해서 여러분은 여러분의 앱에서 Game Center 기능을 이용하기 위해 우선 Leaderboard(high score boards)와 Achievements 를 생성해야 합니다.
또한 개개의 Leaderboard와 Achievement ID도 할당해 줘야 합니다.

1. Manage Your Application 링크를 클릭


2. 여러분의 앱 아이콘을 클릭


3. 오른쪽에 있는 파란색의 Manage Game Center 버튼을 클릭



4. Enable 버튼을 클릭


5. Leaderboard 와 Achievements 부분에 있는 Edit(Set up) 을 클릭


6. Leaderboards와 Achievements를 추가


7. 각각의 Leaderboard ID와 Achievement ID



물론 여러분의 게임에 Achievements(혹은 Leaderboard)를 넣고 싶지 않다면 이 부분은 그냥 지나가셔도 됩니다.

***** build.settings

주목:이 파트는 여러분들이 Game Center를 이용하려고 하던지 OpenFeint와 Game Center를 동시에 이용하려고 하던지 어떤 경우에도 아주 중요합니다.
만약 여러분이 OpenFeint를 사용하지 않고 오직  Game Center만 사용하려고 한다면 코로나에 openfeint 컴포넌트를 앱에서 빼내 버리고 컴파일 하라고 알려줘야 합니다.

그 방법은 아래와 같이 components 테이블에 빈 대괄호만 넣어 주면 됩니다.
settings =
{
    iphone =
    {
        components = {}
    }
}

OpenFeint와 Game Center 를 모두 사용하시려면 openfeint 컴포넌트를 사용할 거라고 build.settings에서 확실히 알려 줘야 합니다.
settings =
{
    iphone =
    {
        components = { "openfeint" }
    }
}

build.settings와 관련해서 알아야 할 또 하나는 Leaderboards 와 Achievements를 셋업하지 않고 테스트만 하고자 할 경우 여러분은 GKTapper Xcode 샘플을 이용해서 구현 할 수 있습니다.
그러기 위해서는 아래와 같이 하시면 됩니다.
settings =
{
    iphone =
    {
        plist =
        {
            CFBundleIdentifier = "com.appledts.GKTapper",  -- temporary line for testing!
        },
        components = {}
    }
}

***** System Events and initCallback
일반적으로 gameNetwork.init()은 main.lua 처음 시작할 때 불려 집니다. 그리고 앱이 끝날 때까지 다시 불려질 일은 없습니다. Game Center를 이용하는 방법은 이 gameNetwork.init()과 비교해서 크게 두가지 다른 점이 있습니다.
Game Center는 iOS안의 system-wide 프로세스입니다. 유저들은 앱이 suspend될 때마다 Game Center에서 로그 아웃 됩니다. 그래서 앱이 applicationStart 시스템 이벤트를 Receive 받을 때마다 gameNetwork.init()을 불러야 할 겁니다. 이것이 첫번째 다른 점 입니다.
두번째 다른 점은 init request가 마무리 됐을 때 한번 불려지는 initCallback 함수 입니다.

아래 소스는 network 제공자로 Game Center를 사용할 때 gameNetwork.init()을 어떻게 사용해야 하는지를 보여주는 코드입니다.

local gameNetwork = require "gameNetwork"
local loggedIntoGC = false

-- called after the "init" request has completed
local function initCallback( event )
    if event.data then
        loggedIntoGC = true
        native.showAlert( "Success!", "User has logged into Game Center", { "OK" } )
    else
        loggedIntoGC = false
        native.showAlert( "Fail", "User is not logged into Game Center", { "OK" } )
    end
end

-- function to listen for system events
local function onSystemEvent( event )
    if event.type == "applicationStart" then
        gameNetwork.init( "gamecenter", initCallback )
        return true
    end
end
Runtime:addEventListener( "system", onSystemEvent )

initCallback 리스너 함수를 보면 event 테이블에는 한개의 프로퍼티 event.data 가 있습니다. 이것은 Game Center 에 로그인이 성공하면 true가 되고 실패하면 nil이 됩니다.
유저가 로그인 상태가 아닐 경우 체크해서 어떤 핸들링을 할 수가 있습니다.
좀 더 자세한 사실은 gameNetwork.init() documentation 를 보세요.


***** Game Center Request
Game Center를 사용할 때 아래 열거한 것들을 gameNetwork.request()와 함께 사용될 수 있습니다.
    •    setHighScore
    •    loadScores
    •    loadLocalPlayer
    •    loadPlayers
    •    loadFriends
    •    loadAchievements
    •    unlockAchievement
    •    resetAchievements
    •    loadAchievementDescriptions
    •    loadFriendRequestMaxNumberOfRecipients
    •    loadLeaderboardCategories

보다 자세한 용도를 보려면 gameNetwork.init() documentation 를보세요.
대부분의 위 request들은 요청한 데이터를 받기 위한 리스너를 가질 수 있습니다.
Game Center request(요청) 들에서 가장 헛갈리는 부분은 이 이벤트 테이블을 통해서 어떤 데이터가 당신의 callback 리스너에 전달 되느냐 입니다. 다시 한번 말씀드리자면 보다 자세한 사항은 gameNetwork.init() documentationOfficial Game Kit Documentation 안의 해당 페이지를 통해 알아 볼 수 있습니다.
만약에 fail일 경우 JSON 스트링을 통해 event table에 encode됩니다. 그리고 전화기의 native alert으로 전화기 화면에 표시 됩니다. 아래 샘플 예제를 참조하세요.
local gameNetwork = require "gameNetwork"
local json = require "json"

-- callback listener for Game Center requests
local function requestCallback( event )
    if event.type == "loadFriends" then
        local data = json.encode( event.data )
       
        -- show encoded json string via native alert
        native.showAlert( "event.data", data, { "OK" } )
    end
end

gameNetwork.request( "loadFriends", { listener=requestCallback } )

***** Corona GCTapper Sample
이상으로 GameCenter의 아주 기본적인 사항들을 살펴 봤습니다.
Corona SDK에서는 Apple의 GKTapper Xcode Sample 을 수정해서 Corona에서 사용할 수 있도록 했습니다.
아래 링크를 클릭하시면 그것을 이용한 샘플 코드를 받아 보실 수 있습니다.
View the Corona Game Center Sample Project on Github

위 내용 원본은  Corona SDK 웹싸이트에있습니다.
http://blog.anscamobile.com/2012/01/tutorial-game-center-integration-ios/

오늘은 iOS Game Center를 사용하기 위한 기초 지식을 공부했구요.
다음엔 위에 다운 받은 샘플 파일을 분석할 생각입니다.

반응형

Comment

  1. 안녕하세요, 네트워크 부분에서 여쭙고 싶은게 있습니다.

    제가 게임서버를 구현해놨는데 여러가지 문제 때문에
    한글도 지원할 수 있게 하려고 하는데요.
    이름에 영어로만 구성해놨던 서버에서는 잘 되던게 한글이 들어가니
    nil value라고 에러가 나더라고요.
    자세히 출력을 해보니 network.request에서 event.response로 받은 값이 아무 것도 없는 값이더군요. (그렇다고 event.isError가 있는 것도 아니었습니다.) 또 아예 브라우저상으로 출력값을 봤을 때도 한글로 잘 출력이 되었구요. (서버 문제는 아니라는 뜻)
    결국 클라이언트에서 문자열을 받아올 때 문제가 있다는 것 같은데, 한글 처리를 어떻게 하는지 혹시 아시나요.

    • 솔웅 2012.02.12 05:25 신고

      가끔 중국어,일본어,한국어 출력 문제로 글이 올라오는걸 보긴 했습니다.
      외국애들은 CJK text display 문제라고 하더라구요.
      어떤 경우에는 Corona SDK 버전에 따라 문제가 발생하기도 하고 어떤 경우에는 iOS 버전같은 OS 버전에 따라 문제가 발생하기도 합니다.
      그리고 lua 파일을 UTF-8 형식으로 저장하면 해결 되는 문제도 있구요.
      Language 관련한 문제는 아래 Community에서 다루고 있습니다.
      http://developer.anscamobile.com/forum/11?page=7

      그리고 일본어가 출력되지 않는다는 질문에 여러 답글들이 올라왔는데 혹시 그 중에 도움 될만한 답이 있을까해서 아래 링크도 올릴께요.
      http://developer.anscamobile.com/forum/2011/12/11/japanese-texts-cant-display-property-device-newtext-bug

      제가 경험이 없어서 크게 도움은 드리지 못하네요.
      빨리 잘 해결되길 바랍니다.
      그리고 해결하시면 이곳에 댓글 부탁드려요.
      많은 도움 될겁니다.

      감사합니다.