3

iOS 9 では、Applepublic func turnBasedMatchmakerViewController(_ viewController: GKTurnBasedMatchmakerViewController, didFind match: GKTurnBasedMatch) GKTurnBasedMatchmakerViewControllerDelegate.

Apple の指示は、 のfunc player(_ player: GKPlayer, receivedTurnEventFor match: GKTurnBasedMatch, didBecomeActive: Bool)方法を使用することですGKLocalPlayerListener

only を使用receivedTurnEventFor matchすると、次のシナリオが発生します。

  1. ユーザーがタップ+すると、 が表示されますGKTurnBasedMatchmakerViewController
  2. ユーザーがタップするPlay Nowと、Game Center が一致を検索します。
  3. Game Center は空のマッチ (新しいマッチ) を返すmatchDataか、進行中のマッチにユーザーを配置します — そして、ゲームは を通じてこれを通知されreceivedTurnEventFor matchます。

( を使用して) 新しい一致が作成されたかどうかを判断するのは簡単ですがmatchData、すべてのイベントが を通過するときに一致が見つかったのか、一致が更新されたのかを判断する方法はないようreceivedTurnEventFor matchです。

私の質問はこれです:

GKLocalPlayerListenerのメソッドを使用receivedTurnEventFor matchする場合、ターン イベントがマッチメイキングの結果であるかどうかを判断する方法はありますか?

4

2 に答える 2

2

4 つのケースがあります: 1. 新しいマッチに参加し、自分のターン (マッチの作成者) 2. 新しいマッチに参加し、他のプレイヤーのターン (マッチを見つけた) 3. 既存のマッチに参加し、それはあなたの番です 4. あなたは既存の対戦に参加し、他のプレイヤーの番です。ケース 3 と 4 は、マッチを切り替えたり、マッチに再参加したりする場合に発生する可能性があります。

プロパティをチェックmatch.currentPatriticantして、どちらのケースが発生するかを判断できます。lastTurnDate

プレイヤーが新しいマッチを作成した場合 (receivedTurnEventForはマッチメイキングの結果として呼び出されます)、match.participants[0].lastTurnDateは nil であり、match.currentParticipant?.player?.playerID等しいですGKLocalPlayer.localPlayer().playerID(ケース 1)。

既存の試合に参加した場合: match.participants[0].lastTurnDateisnilmatch.currentParticipant?.player?.playerIDis NOT equal GKLocalPlayer.localPlayer().playerID(新しい試合に参加しましたが、他のプレイヤーがターン中 - ケース 2)

lastTurnDateすべての参加者をチェックして、ローカル プレーヤーと現在のプレーヤーを比較できるケース 3 と 4 を明確に判断してください。

于 2017-02-12T10:59:39.337 に答える
0

これに関してはゲームセンターは役に立たないと思います。オーバーロードされた関数へのさらに別のあいまいな呼び出しのように見えreceivedTurnEventForMatchます。しかし、これは自分で管理できると思います。なぜなら、元のプレイヤーが常に他の参加者よりも先に試合を見ることを知っているからです。

ここには4つのケースがあるようです:

プレーヤーは、少なくとも 1 人の自動対戦参加者との新しい対戦を作成します。新しい対戦を受け取ると、参加者は「マッチング」ステータスになるため、これを検出できます。この場合、オリジネーターとして、どのプレーヤーが招待され、どのプレーヤーが自動対戦であるかを示すフラグを対戦データに設定できます。

プレーヤーは招待状を使用して新しい対戦を作成します。この場合、すべての参加者を新しく受信した対戦に設定する必要があります。ここでも、後続のプレイヤーが読み取れるように、マッチ データにフラグを設定できます。

自動対戦として作成された対戦にプレーヤーが参加する: 2 人のプレーヤーのみをサポートする場合、player2 がこの対戦を受信した時点で、両方の playerID が設定されます。より多くをサポートする場合、一部のスロットが引き続き自動対戦に設定される (信頼できない) 可能性がありますが、これはあまり役に立ちません。ただし、元のプレイヤーが自動対戦スロットに対して招待されたプレイヤーを示すフラグをマッチ データに設定した場合、このプレイヤーは自分のステータスを判断できます。

プレーヤーが 1 つ以上の招待を受けて試合に参加した場合:前の状況と同じです。参加するプレーヤーは、ゲーム センターから有用なものを判断できず、元のプレーヤーが試合に追加したデータに依存します。

于 2017-01-10T18:16:26.827 に答える