1

私が取り組んでいるゲームは、正確に 2 人のプレーヤーの間でターン ベースです。これが最初のラウンドであり、プレーヤーがまだ見つからない場合、プレーヤーの注文を送信する方法について少し混乱しています。

- (void)endTurnWithNextParticipants:(NSArray *)nextParticipants turnTimeout:(NSTimeInterval)timeout matchData:(NSData *)matchData completionHandler:(void (^)(NSError *error))completionHandler
4

2 に答える 2

0

これは古いスレッドですが、最近これに関連する問題に苦しんでいたので、これが通過する他の人に役立つかもしれないと思いました:

参加者は、占有されているかどうかに関係なく、ゲームのスロットです。プレーヤーは、見つかったときにそれらのスロットを埋めます。「常に私の番です」ということは、次のようなものです。事前に設定された数の参加者 (スロット) でゲームを操作していますが、それらのスロットはまだ埋まっていない可能性があります。これにより、場合によってはユーザーに情報を表示することが非常に困難になります。これは、空の参加者フィールドから NULL が返されるだけであり、そのような状況を適切に処理する必要があるためです。最初のターンでは、前の各プレイヤーがターンを完了するまで、後続のユーザーは自分が招待されたことさえ知りません。ターンをしてからゲームプレイの蒸気を取り除きますあなたの招待者は、プレイできないため辞退します。IMO、モデルはオートマッチでのみ実行可能です。友達を試合に招待するときのユーザー エクスペリエンスがあまり好きではありません。でも、その通りです。

したがって、ターンを終了するには、基本的に match.participants 配列を取得し、現在の (別名ローカル) プレーヤーをリストの最後に移動します。match.participants を直接編集しようとしないでください。あらゆる種類の不安定さの原因となります。代わりに、新しい配列を作成し、必要な順序でアイテムを挿入します。私はこのコードを使用しました。これは、元は Ray Wenderlich のサイトから来たものだと思います。

    NSMutableArray *nextParticipants = [NSMutableArray new];
    for (GKTurnBasedParticipant *participant in theMatch.participants)
    {
        if ([participant.player.playerID isEqualToString:[GKLocalPlayer localPlayer].playerID])
        {
            [nextParticipants addObject:participant];
        }
        else
        {
            [nextParticipants insertObject:participant atIndex:0];
        }
    }

その後、次のようにターンを終了しました。

    [theMatch endTurnWithNextParticipants:nextParticipants
                              turnTimeout:timeOutSeconds                     
                                matchData:updatedMatchData
                        completionHandler:^(NSError *error)
    {
           ....
    }];

これが機能するのは、プレイヤーが参加者スロットを埋めたかどうかに関係なく、マッチがインスタンス化された瞬間からすべての参加者スロットが存在するためです。埋められていないスロットは、「招待済み」または「マッチング」状態になります。これらのスロットの 1 つがアレイの一番上にバブルして「自分の番」になると、ゲームセンターは招待された/自動対戦プレーヤーを探してスロットを埋めて順番を取りに行きます。

于 2015-03-08T15:43:02.130 に答える