MILLEN BOX

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

Game Center 3歩目。ハイスコアの送信に対応する [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

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

Githubは以下です。

GitHub - anthrgrnwrld/renda

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

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

ではいきましょう。

自分ポイント1

まずスコアの送信機能の実装から。
スコア送信処理を別ファイルにて作成します。ファイル名は GKScoreUtil.swift です。
GKScoreUtil.reportScores がスコア送信関数になります。

//
//  GKScoreUtil.swift
//

import UIKit
import GameKit

struct GKScoreUtil {
    
    static func reportScores(value:Int, leaderboardid:String){
        println("\(__FUNCTION__) is called")
        
        var score:GKScore = GKScore();
        score.value = Int64(value);
        score.leaderboardIdentifier = leaderboardid;
        var scoreArr:[GKScore] = [score];
        
        GKScore.reportScores(scoreArr, withCompletionHandler:{(error:NSError!) -> Void in
            if( (error != nil)){
                println("reportScore NG");
            }else{
                println("reportScore OK");
            }
        });
        
    }
}

自分ポイント2

スコアが確定する箇所で、自分ポイント1で作成した GKScoreUtil.reportScores を実行します。 第1引数にはハイスコアを、第2引数にはLeaders Board ID を指定します。
Leaders Board IDの取得方法については、以下のページの前半部を参照のこと。

Game Center機能を実装する - Qiita

今回の連打アプリの場合には、ゲーム開始から10秒経過後のタイミングになります。

import UIKit
import GameKit

class ViewController: UIViewController {

    ...
    
    /**
    ゲーム完了時に実行する関数。
    */
    func timeupFunc() {
        highScore = countPushing > highScore ? countPushing : highScore
        timerState = false
        startState = false
        countupTimer = 0
        countPushing = 0
        timer.invalidate()
        println("highScore is \(highScore)")
        ud.setInteger(highScore, forKey: udKey)     //ハイスコアをNSUserDefaultsのインスタンスに保存
        ud.synchronize()                            //保存する情報の反映
        GKScoreUtil.reportScores(highScore, leaderboardid: leaderboardid)   //GameCenter Score Transration
    }
    
    ...

}

これで送信処理の対応は完了しました。
しかしこのままではハイスコアの確認や、はたまた本当に送信できているのかの確認ができませんね。
そこで次回は送信したハイスコアの確認方法を行ってみたいと思います。
Game Center編は次回にて完結の予定です。