2

私はリアルタイムのマルチプレーヤー ゲームを構築しようとしていますが、現在、Google がマルチプレーヤー用に提供するサンプル ゲームを調査しています。リンクは…

https://github.com/playgameservices/android-samples/tree/master/ButtonClicker

問題は、要件に従って自動一致基準の構成を変更したときです

void startQuickGame() {
final int MIN_OPPONENTS = 1, MAX_OPPONENTS = 3;
   Bundle autoMatchCriteria = RoomConfig.createAutoMatchCriteria(MIN_OPPONENTS,
           MAX_OPPONENTS, 0);
   RoomConfig.Builder rtmConfigBuilder = RoomConfig.builder(this);
   rtmConfigBuilder.setMessageReceivedListener(this);
   rtmConfigBuilder.setAutoMatchCriteria(autoMatchCriteria);
   rtmConfigBuilder.setRoomStatusUpdateListener(this);

   getGamesClient().createRoom(rtmConfigBuilder.build());
}

次に、このコードは部屋の3番目または4番目のプレイヤーを待たず( MAX_OPPONENTS で設定したように)、ゲームは2人のプレイヤー(1人の対戦相手)ですぐに開始されます。ここにタイマーを追加したいのですが、指定された時間の後にゲームが開始されます。

驚くべきことに、ルームの作成後、MIN_PLAYER の値は、デフォルトのルーム UI 用のこのコードではまったく機能しません。

   final int MIN_PLAYERS = 2;
   Intent i = getGamesClient().getRealTimeWaitingRoomIntent(room, MIN_PLAYERS);

   // show waiting room UI
   startActivityForResult(i, RC_WAITING_ROOM);

私の要件は、部屋の作成後、特定の時間待機してから、参加したプレーヤーでゲームを開始することです。それらが 2 、 3 、または 4 であっても。

4

2 に答える 2

0

自動マッチング アルゴリズムは、対戦に参加するプレーヤーの数を最大化しようとはしません。最小値を 1 に、最大値を 3 に設定すると、2 プレーヤー ゲームが可能になります。

この場合にすべきことは、MIN_OPPONENTS と MAX_OPPONENTS を 3 に設定し、コードからゲーム開始ロジックを処理することです。

このタイマー ロジックを実装する場合、組み込みの待合室 UI は使用できません。これは、時間に基づいてゲームを早期に開始することをサポートしていないためです。そのため、代わりに、次のロジックを使用して独自の待合室を実装してください。

  1. タイマーを開始します。

  2. onPeerConnected() と onPeerDisconnected() およびその他のコールバックを介してピアが接続または切断されているのを確認しながら、進行状況を画面に表示します。RoomStatusListener および RoomStatusUpdateListener を参照してください。

  3. タイマーが切れたら、何をするかを決めます。たとえば、2 人以上のプレーヤーが接続されている場合は、ゲームを開始します。そうでない場合は、もう少し待つか、あきらめるかなどです。

  4. 誰かがゲームに遅れて参加した場合のケースを処理します。これは、2 人のプレイヤーが参加し、タイマーが時間切れになり、ゲームが開始され、3 人目または 4 人目のプレイヤーが現れた場合に発生します。経験が彼らにとってひどいものではないことを確認してください(ただ追い出さないでください):-) 進行中のゲームにそれらを統合できない場合は、「観客モード」のままにして次のラウンドに参加させることができます/マッチなど

重要: 上記のロジックでは、異なるプレイヤーのタイマーが同期されないことに注意してください。そのため、ゲームを開始することを決定したときに、リアルタイムで信頼できるメッセージをすべてのピアに送信して、ゲームが開始されたことを知らせる必要があります。ゲーム画面に移動する必要があります。

ロジックがより複雑になる場合は、「サーバー」を選択するのが理にかなっています。たとえば、(辞書順で) 最小の参加者 ID を持つクライアントがサーバーであると言うことによって、これを行うことができます。「ゲームを作った人は誰でもサーバーだ」と言うのは良くありません。なぜなら、自動対戦では、誰もが自分がゲームを作ったと思っているからです。

これが役に立ったことを願っています!

于 2013-05-28T21:58:37.843 に答える
-1

あなたの問題に関して他の人にとって興味深いかもしれない、ここからのこの抜粋に出くわしました:

getRealTimeWaitingRoomIntent() の 2 番目のパラメーターは、[再生を開始] オプションが表示される前にルームに接続する必要があるプレーヤーの数を示します。この例では、[再生を開始] オプションが表示されないことを示す MAX_VALUE を指定しています。代わりに、すべてのプレイヤーが接続されると、待合室の UI が自動的に終了します。

そのため、組み込みの待合室インテントを使用するときに MAX_VALUE を設定しない場合は、プレイヤーが最小人数でゲームを開始するか、より多くの人が参加するのを待つかをプレイヤーに任せることができます。

于 2013-08-18T17:04:12.283 に答える