MILLEN BOX

音楽好きの組み込みソフトエンジニアによるプログラミング(主にiOSアプリ開発)の勉強の記録

Game Center 4歩目(完結)。Leaders Boardでハイスコアの確認に対応する [swift1.2] [Game Center]

またまた間が空きましたが、Game Center対応を引き続き行っていきます。
(何をしたか忘れかけてる...)

前回まででハイスコアの送信まで対応済みの状態です。

SwiftでのGameCenterはじめの一歩。ログインを簡単に行う [Game Center初心者向け] [Swift1.2] - MILLEN BOX
Game Center 2歩目。非アクティブからの復帰時のGame Centerログインに対応する [Game Center初心者] [swift1.2] - MILLEN BOX
Game Center 3歩目。ハイスコアの送信に対応する [swift1.2] [Game Center] - MILLEN BOX

本日は、ハイスコアの送信と、その確認を行えるようにしたいと思います。
引き続き、高橋名人もびっくりの連打アプリに機能追加していきたいと思います。
Githubは以下です。

GitHub - anthrgrnwrld/renda

以下のサイトを参考に実装しました。

GameCenterのGKScoreでスコア表示 - Swiftサラリーマン
Game Center機能を実装する - Qiita

ではいきましょう。

自分ポイント1

まずはGame Center Leaders Boardを表示するためのボタンを追加しておきましょう。

import UIKit
import GameKit

class ViewController: UIViewController {

    ...

    /**
    GameCenterボタンを押した時に実行する関数
    */
    @IBAction func pressGameCenter(sender: AnyObject) {
        //後ほどここに送信したスコアをLeaderboardで確認する処理を記載します。
    }
}

自分ポイント2

送信したスコアをLeaderboardで確認する関数を追加します。 そしてその関数を自分ポイント1で追加したボタンのアクション内で呼び出します。
一方、自分ポイント2の作業をするとコンパイルが通らなくなります。
自分ポイント3に進んで解決しましょう。

import UIKit
import GameKit

class ViewController: UIViewController {

    ...

    /**
    GameCenterボタンを押した時に実行する関数
    */
    @IBAction func pressGameCenter(sender: AnyObject) {
        //後ほどここに送信したスコアをLeaderboardで確認する処理を記載します。
        showLeaderboardScore()
    }

    /**
    GKScoreにてスコアが送信されたデータスコアをLeaderboardで確認する
    */
    func showLeaderboardScore() {
        var localPlayer = GKLocalPlayer()
        localPlayer.loadDefaultLeaderboardIdentifierWithCompletionHandler({ (leaderboardIdentifier : String!, error : NSError!) -> Void in
            if error != nil {
                println(error.localizedDescription)
            } else {
                let gameCenterController:GKGameCenterViewController = GKGameCenterViewController()
                gameCenterController.gameCenterDelegate = self  //このViewControllerにはGameCenterControllerDelegateが実装されている必要があります
                gameCenterController.viewState = GKGameCenterViewControllerState.Leaderboards
                gameCenterController.leaderboardIdentifier = self.leaderboardid //該当するLeaderboardのIDを指定します
                self.presentViewController(gameCenterController, animated: true, completion: nil);
            }
        })
        
    }
}

自分ポイント3

自分ポイント2にてコンパイルエラーになるのは、ViewControllerに GameCenterControllerDelegate が実装されていない為です。
ViewControllerを継承するクラスに GameCenterControllerDelegate を追加しましょう。
しかし、実は追記しても、まだコンパイルできません。(そうですよね?)
引き続き自分ポイント4に進んで下さい。

import UIKit
import GameKit

class ViewController: UIViewController, GKGameCenterControllerDelegate { //GKGameCenterControllerDelegateを追加
    ...
}

自分ポイント4

GKGameCenterControllerDelegate を実装した場合、 gameCenterViewControllerDidFinish をViewController内に実装することは必須の作業になります。
これはLeaders Board表示中に、[DONE]ボタンを押した時の処理の部分になります。
今回はLeasers BoardをCloseする処理を追加します。
追加後、コンパイルエラーは消えているはずです。

import GameKit

class ViewController: UIViewController, GKGameCenterControllerDelegate {

    ...
    
    /**
    Leaderboardを"DONE"押下後にCloseする
    */
    func gameCenterViewControllerDidFinish(gameCenterViewController: GKGameCenterViewController!) {
        //code to dismiss your gameCenterViewController
        gameCenterViewController.dismissViewControllerAnimated(true, completion: nil);
    }

}

実装後のgifアニメをのせときます。
f:id:anthrgrnwrld:20150830183104g:plain

以上で、4回にわたって渡ってお送りしたGame Center実装編は完結です。
ただ実装中にハマったところがありまして、原因は非常にしょーもないことなのですが、気をつけて欲しい思いを込めまして、次回は番外編としてそれを投稿しようと思っています。