1

GameCenter と Real Time サーバー クライアント ネットワーキング戦略を使用してカード ゲームを作成しました。サンド ボックスでテストしている間、ゲームは問題なく動作し (接続を確立し、最適なホストを選択し、データを送受信します)、時にはゲームが実際に問題なく完了することさえあります。ただし、ほとんどの場合、両方のデバイスで、相手のユーザーが切断されたことを知らせる match:player:didChangeState: コールバックを受け取ります。いらいらするほど頻繁に発生し、非アクティブまたはタイムアウトとは何の関係もないようです。私の考えでは、GameCenter サーバーで通常のネットワーク遅延に対処している可能性があります。これは、プレイヤーが再接続してデータを再送信するようなまれなケースがあったためです。GKMatch と Real Time GameCenter を使用してこれらの問題に対処している人はいますか? iOS 6.1 を実行し、同じ Wi-Fi ネットワークに接続されている iPhone 5 と iPhone 4 でアプリをテストしています。

4

2 に答える 2

1

MAXプレーヤー= 2でも同じ問題がありました。私にとって GKMatch のデリゲート

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

ユーザーがゲームでアクティブであっても、「状態」を「GKPlayerStateDisconnected」として返します。解決策は次のとおりです。私の NetworkManager クラスでは、現在の一致を gkMatch として参照しています。したがって、「状態」が「GKPlayerStateDisconnected」になるたびに、リモート プレーヤーから本当に切断されているかどうかを確認します。そのために、次のように「gkMatch」データを使用しています: ps: セッションが実際に切断されていない場合は、「接続済み」として文字列が含まれています。

NSString *gkMatchString = [NSString stringWithFormat:@"%@",[NetworkManager sharedManager].gkMatch];

        if ([gkMatchString rangeOfString:@"connected"].location == NSNotFound) 
          {
            NSLog(@"Session is actually closed.");
          }else{
            NSLog(@"Session is NOT yet closed.");
          }

それは私にとってはうまくいくので、誰かに役立つかどうか教えてください。

于 2013-03-21T11:22:19.660 に答える
0

切断の正確な解決策は見つかりませんでしたが、次の問題にパッチを当てました。また、切断中に送信されたメッセージが失われないようにするために、メッセージが実際に対戦相手によって受信されたかどうかを検出する「応答」ハンドラーを実装しました (メッセージが対戦相手によって受信されない場合、信頼できるデータ送信モードはエラーになりません)。接続の問題のため)。

ゲームが開始されると、ユーザーをホストとして決定し (chooseBestHostPlayerWithCompletionHandler:^)、切断を検出すると、ホスト プレーヤーは非サーバー プレーヤーをゲームに再度招待します。これは、ゲームが招待によって開始された場合でも、「今すぐプレイ」によって開始された場合でも機能します。1v1 および招待マッチでのみ機能する「ShouldReconnect」の問題を解決しました。非ホスト プレイヤーが招待を受け入れると、プログラムでマッチメイキングを完了して、MatchMakerViewController が画面上に表示されないようにします。再接続すると、問題なく試合が再開されます。

- (void)reinvitePlayer {
    GKMatchRequest *request = [[GKMatchRequest alloc] init];
    request.minPlayers = 2;
    request.maxPlayers = 2;
    request.playersToInvite = @[_opponent.playerID];
    request.inviteMessage = @"Reconnect?";
    request.inviteeResponseHandler = ^(NSString *playerID, GKInviteeResponse response)
    {
        DLog(@"Player response = %i.",response);
        // [self updateUIForPlayer: playerID accepted: (response == GKInviteeResponseAccepted)];
    };
    [[GKMatchmaker sharedMatchmaker] addPlayersToMatch:_match matchRequest:request completionHandler:^(NSError *error) {
        if (error != nil) {
            DLog(@"Unable to add player to match.");
        } else {
            DLog(@"Successfully reconnected");
            [[GKMatchmaker sharedMatchmaker] finishMatchmakingForMatch:_match];
        }
    }];
}
于 2013-01-20T16:27:05.237 に答える