1

私はピアツーピアのiPhoneゲームがかなりうまく機能している。利用可能なピアを表示するテーブルを作成しました。(これまでのところ)最大4つのデバイスを接続して、ゲームの最初から最後までフルラウンドでプレイできます。

ピアピッカー

しかし、ここに私の問題があります...

GKSessionを使用して一方のデバイスで作成し、を使用してもう一方のデバイスを作成GKSessionModeClientGKSessionModeServerます。クライアントはサーバーを確認し、接続を選択してから、サーバーが承認します。すべてのピアが接続されたら、サーバーは「ゲームの開始」をタップできます。

サーバーがゲームを開始する前に、クライアントが「戻る」ボタンをタップして前の画面に移動した場合、カスタムピアピッカーの表示がビューからポップされ、セッションが「破棄」されます...

[_gkSession disconnectFromAllPeers];
[_gkSession setAvailable:NO];
[_gkSession setDelegate:nil];
[_gkSession setDataReceiveHandler:nil withContext:nil];

ここで、クライアントがピアピッカーに戻ってサーバーに再度参加すると、GKSessionStateConnected状態が再び取得されsendDataToAllPeers:ますが、クライアントに何も到達しない場合。1つのデバイスがゲームを開始し、3つのデバイスが参加してから、サーバーが「ゲームの開始」をタップすると、問題なく動作します。ただし、ゲームが開始する前に誰かが終了した場合、セッションの再作成と参加は失敗します。

何か案は?この時点で考えられる唯一のハックは、ユーザーがサーバーに接続したときに「戻る」をタップできないようにすることですが、そのようなことはやっかいです...気が変わったらアプリを完全に終了する必要があります。この接続の問題を除いて、アプリが実行されているので、私はこれで終わりです。一種のエッジケースですが、セッションをクリアするためにアプリケーションを再起動せずにゲームを開始できない場合、ユーザーがイライラしているのを見ることができます。

できればこれを賞金にします。助けてください!

@byteclubを編集

  • ゲームが始まる前にクライアントが離れた場合、サーバーは関連するすべてのデータ構造を正しくクリーンアップしますか?

サーバーが接続を受け入れた後にクライアントがゲームロビーを離れると、クライアントのセッションは破棄されます。

- (void)destroySession
{
    trace(@"destroySession");

    self.gameDelegate = nil;
    self.lobbyDelegate = nil;

    [_gkSession disconnectFromAllPeers];
    [_gkSession setAvailable:NO];
    [_gkSession setDelegate:nil];
    [_gkSession setDataReceiveHandler:nil withContext:nil];

    [_peerList removeAllObjects];
}

ただし、サーバーデバイスでdisconnectFromPeersメソッドを呼び出すことはありません。

* Is the client-disconnect-cleanup procedure different for cases when the

ゲームはもう始まっていますか?

少しだけ、クライアントが切断すると、全員が「ピア終了」通知を受け取り、ゲームが終了します。この場合、再接続の心配はありません。これは主に、クライアントが「キャンセル」して問題のあるホーム画面に戻ることができるゲームロビーにあります。この場合、クライアントのセッションは破棄されます。その後、ロビーに戻って新しいGKSessionが割り当てられた場合でも、サーバーに接続できますが、接続するとsendDataToAllPeersは機能しなくなります。

* Do you still have a problem if, before reconnecting, you restart the

クライアントですが、サーバーはそのまま実行しますか?

クライアントはどのような場合でも再接続できます。終了して戻ってアプリを再起動し、問題なく再接続できます。サーバーとクライアントの両方を再起動しない限り、sendDataToPeersは失敗します。

* Do you completely destroy GKSession object on the client side

ユーザーが「戻る」をタップすると?

はい。(上記のコードを参照)

これはおそらく遠くからデバッグするのは非常識だと思いますが、私が調べられることについて何か提案があれば、それをいただければ幸いです。

4

1 に答える 1

1

1つのデバイスがゲームを開始し、3つのデバイスが参加してから、サーバーが「ゲームの開始」をタップすると、問題なく動作します。ただし、ゲームが開始する前に誰かが終了した場合、セッションの再作成と参加は失敗します。

私がこの権利を読んでいると、ある場合には正しく機能しているように見えますが、そうでない場合もあります。ロジックをチェックして、クライアントの接続/切断が毎回同じ(正しい)方法で処理されることを確認します。

いくつかの質問:

  • ゲームが始まる前にクライアントが離れた場合、サーバーは関連するすべてのデータ構造を正しくクリーンアップしますか?
  • ゲームがすでに開始されている場合、client-disconnect-cleanupの手順は異なりますか?
  • 再接続する前にクライアントを再起動しても、サーバーをそのまま実行したままにしておくと、まだ問題がありますか?
  • ユーザーが「戻る」をタップすると、クライアント側のGKSessionオブジェクトを完全に破棄しますか?
于 2010-06-28T21:58:26.690 に答える