2

ゲーム セッションが進行中で、他のプレイヤーとデータを通信できないときに、ローカル プレイヤーの切断メッセージを取得するにはどうすればよいでしょうか。「このメソッドは、接続が失敗するたびに通知します」というドキュメントには何もないので、私は少し途方に暮れています.

このコードのチャンクが機能することを期待して使用しようとしていましたが、無駄です。「私たちは切断されています。」メッセージがトリガーされることはありません。

- (void)match:(GKMatch *)theMatch player:(NSString *)playerID didChangeState:(GKPlayerConnectionState)state {
  if (self.match != theMatch) return;

  switch (state) {

    case GKPlayerStateDisconnected:
      //disconnected
      NSLog(@"player status changed: disconnected");
      matchStarted = NO;
      GKLocalPlayer *player = [GKLocalPlayer localPlayer];
      if ([playerID isEqualToString:player.playerID]) {

        // We have been disconnected
        NSLog(@"We're disconnected.");
      }
      if ([delegate respondsToSelector:@selector(matchEnded)]) {
        [delegate matchEnded];
      }
      break;
  }
}

私が見つけた他の唯一の行は、通信できないことを示している可能性があるのは、実際に次のようなデータを送信したときです。

- (void)sendRandomMatchData:(NSData *)data {  
  GKMatch *match = [GCHelper sharedInstance].match;
  BOOL success = [match sendDataToAllPlayers:data
                                withDataMode:GKMatchSendDataReliable
                                       error:nil];
  if (!success) {
    [self matchEnded];
  }
}

ただし、相手が切断されてメッセージを送信できなくなった場合も、「成功」は偽になると思います。

私は非常に厳格なゲーム ロジックを持っています。誰かが切断された場合、試合を続けることができず、負けたことを知らせる必要があります。

どんな助けでも大歓迎です。

4

2 に答える 2

1

これを行うことができる場所は 2 つあります。どちらもGKMatchDelegateプロトコルにあります。

最初の実装は次のとおりです。

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

2 人対戦の場合、切断をキャッチできる 2 番目の場所は次のとおりです。

- (BOOL)match:(GKMatch *)theMatch shouldReinvitePlayer:(NSString *)playerID
{
}

が終了すると、これらのイベントは両方とも確実に発生しGKMatchます。スタンの答えがあなたの質問に答えた場合は、入手可能な場所ならどこでもキャッチする練習をすることを強くお勧めします! NSError多くの時間を節約できます。

したがって、データを送信してエラーをキャッチするには:

NSError* nsErr ;
int result = [theMatch sendData:nsd toPlayers:theMatch.playerIDs
              withDataMode:GKMatchSendDataReliable error:&nsErr] ;
if( !result ) { // NO if the match was unable to queue the data.
  error( nsErr, "Failed to sendRoundtripPing" ) ;
}
于 2013-05-27T17:00:37.003 に答える
0

error次のコード行の後を調べるのはどうですか?

  BOOL success = [match sendDataToAllPlayers:data
                                withDataMode:GKMatchSendDataReliable
                                       error:nil]; //replace nil with NSError variable

多分errorあなたにあなたが必要とする追加の情報を与えるでしょう。
もう1つのアイデアは、NSTimerを作成し、移動/ターンを行うための特定の時間を設定することです。一部のプレーヤーが一定時間成功しなかった場合は、このプレーヤーが切断されていると想定します。また、インターネット接続の状態をチェックして、接続が失われた可能性があることを確認できます。これが、データを送受信できない理由です。
また、GCを使用して少量のデータを送信することで、すべてのプレーヤーを定期的にチェックして、回答を得ることができます。このようにして、すべてのプレーヤーが「生きている」ことを確認したり、「ゾンビ」を検出したりできます。
プレーヤーがホームボタンを使用してゲームをバックグラウンドに移動した場合、ゲーム内のcuzコードが実行されないことを覚えておいてください。そして、この状況は、プレイヤーが「ゾンビ」であることを意味するものではありません。プレーヤーは、通話や別のアプリのようなもので忙しい可能性があります。プレーヤーが一時的にインターネット接続を失う可能性があります。これは、彼/彼女がすぐにゲームに戻ることができることを意味します...

于 2012-12-05T20:54:26.477 に答える