2

スコアが最高でなくても、投稿したばかりのプレーヤーのスコア ランクを取得する方法はありますか?

[GKScore reportScoreWithCompletionHandler:] は GameCenter にスコアを投稿するために使用されますが、その「ランク」は常にゼロです。「ランク」値は [GKLeaderboard loadScoresWithCompletionHandler:] を呼び出す場合にのみ有効ですが、今日/週/全期間におけるプレーヤーの最高スコアのランクです。

最適な場所は [GKScore reportScoreWithCompletionHandler:] で、gamecenter から返されたときに「ランク」値を有効にします。

ありがとうございました。

4

1 に答える 1

1

AFIK そのような解決策はありません。GameCenter はプレイヤーのベストスコアのみを保存します。

これを読む

したがって、本当にそれをやりたい場合は、プレーヤーを自分でランク付けする必要があります。

  1. リーダー ボードからすべてのスコアを取得します。
  2. 現在のスコアのランクを確認します。

-以下のサンプルコード

-(void) findRankWithScore: (int64_t)score
{
    GKLeaderboard *leaderboard = [[GKLeaderboard alloc] init];

    if (leaderboard != nil) {
        leaderboard.category = @"YourCategory";
        leaderboard.timeScope = GKLeaderboardTimeScopeWeek; //or all time, day... pick one.

        [leaderboard loadScoresWithCompletionHandler:^(NSArray *scores, NSError *error) {
            int rank = 0;
            if (error == nil && scores != nil) {
                for (GKScore* refScore in scores) {
                    //NOTE: Retrieved score array is sorted already.
                    if (refScore.value <= score) {
                        rank = refScore.rank - 1;
                        if (rank < 1) {
                            rank = 1;
                        }
                        break;
                    }
                }
                //show the rank to player. using delegate, notification, popups etc...

            }else {
                //handle errors
            }
        }];
    }
}

また、ランク結果ごとに GameCenter からすべてのスコアを取得するには、多くのコストがかかりました。

そのため、スコア配列を保存して再利用することをお勧めします。ただし、ランキングの精度は多少犠牲になります。(そして、スコア配列をある時間間隔またはそのようなもので更新します)

于 2013-09-06T10:21:43.920 に答える