1

iOS6 以降で実行している場合にのみ表示される、GKMatchmakerViewController の直接のドロップイン置換としてカスタム マッチメーカーを実装しました。完全に機能していますが、GKMatchmakerViewController の UI の一部がわかりません。

2 プレイヤー (request.minPlayers = 2、request.maxPlayers = 2) の自動対戦を開始する場合、GKMatchmakerViewController は、接続状態に変わる前に見つかったプレイヤーの表示名と写真で UI を更新できます。 .

次のコードを使用して、自動一致を開始します。接続が確立され、ゲームが開始され、すべて問題ありません。

[[GKMatchmaker sharedMatchmaker] findMatchForRequest:matchRequest withCompletionHandler:^(GKMatch *match, NSError *error) {
    if (error != nil) {
        // ...the error handling code...
    } else if (match != nil) {
        NSLog(@"An auto-match has been found: %@", match);

        if (match.expectedPlayerCount == 0) {
            [[GKMatchmaker sharedMatchmaker] finishMatchmakingForMatch:match];
        } else {
            NSLog(@"player IDs: %@", match.playerIDs);
        }
    }
}];

ただし、次の方法で GKPlayerStateConnected に変更されるまで、playerID を取得できません。

- (void)match:(GKMatch *)match player:(NSString *)playerID didChangeState:(GKPlayerConnectionState)state;

一致が見つかると、そのプレーヤーは GKPlayerStateUnknown になります。ただし、コード内の一致 NSLog() は playerID を示しています (これは間違いなく localPlayer の ID ではありません。実際の番号は編集されています)。

An auto-match has been found: <GKMatch 0x210b2c90 expected count: 1 seqnum: 0
    G:1234567890:unknown
reinvitedPlayers:(
)>

試合の playerIDs 配列 (2 番目の NSLog()) は、試合が作成されるとすぐに空になります。これは、まだ公式に接続が確立されていないため意味があります。

player IDs: (
)

ようやく質問にたどり着きました(ご辛抱いただきありがとうございます):

1a) 不明な状態のプレーヤーの ID はどこから来たのですか?

1b) それは明らかに試合中にありますが、正確にはどこに保管されていますか? playerID に関連して見えるのは、空の配列だけです。

2) その playerID を取得する他の (合法的な) 方法はありますか? つまり、接続状態に変わる前に

4

2 に答える 2

0

わかりました、私自身の質問に答えます。それは次のように行うことができます:

NSLog(@"An auto-match has been found: %@", match);

NSString * matchDescription = [match description];
NSLog(@"%@", matchDescription);   // displays the same thing as NSLog(@"%@", match)

NSRange gRange = [matchDescription rangeOfString:@"G:"];
if (gRange.location != NSNotFound) {
    NSRange endSearchRange;
    endSearchRange.location = gRange.location + 2;  // skip the G:
    endSearchRange.length = matchDescription.length - endSearchRange.location;
    NSRange endRange = [matchDescription rangeOfString:@":" options:NSLiteralSearch range:endSearchRange];

    if (endRange.location != NSNotFound) {
        NSUInteger idSpan = endRange.location - gRange.location;
        gRange.length = idSpan;
        NSString * opponentPlayerID = [matchDescription substringWithRange:gRange];
        NSLog(@"%@", opponentPlayerID);    // G:1234567890

        // update the UI with the opponent's info
    }
}
于 2013-03-13T14:22:09.560 に答える
0

完了ハンドラーに次のものがありplayerIDました。findMatchForRequest

[[GKMatchmaker sharedMatchmaker] findMatchForRequest:matchRequest withCompletionHandler:^(GKMatch *match, NSError *error) {
  // -- removed error checking code for short --
  puts( "PLAYER ID's:" ) ;
  for( NSString* ns in match )
      puts( [ ns UTF8String ] ) ; // FORMAT: G:37145177499. DO NOT FUDGE WITH THE STRING.

    [GKPlayer loadPlayersForIdentifiers:theMatch.playerIDs withCompletionHandler:^( NSArray *players, NSError *nsError ) {
      puts( "The REMOTE player aliases are:" ) ;
      if( !nsError )
        for( GKPlayer* p in players )
          puts( [p.alias UTF8String ] ) ;
   } ] ;
}];

その後、 GKPlayer の loadPlayersForIdentifiers:withCompletionHandlerからプレーヤーのエイリアスなどを取得できます。

于 2013-04-14T23:18:35.270 に答える