1

私はiOSゲームを構築しています。各ゲームルームは 2 人のユーザーで構成されています。2 人のユーザーが一致した後、両方のデバイスに「応答待ち」タイマーが表示されます。8 秒以内に「準備完了」ボタンをクリックする必要があります。そうしないと、両方とも部屋から追い出され、Firebase から削除されます。 .

ユーザーの正しい状態 (各ユーザーが [I'm Ready] ボタンをクリックする前):

Parent
      Matches
             User 1
                   opponent : User2
                   state : "NotReady"
             User 2
                   opponent : User1
                   state : "NotReady"

重要な注意事項 - 両方のデバイスのタイマーの時間差は +-2 秒です。つまり、デバイスのタイマーがもう一方のタイマーよりも先に終了します。

ユーザーが「I'm Ready」ボタンを押すと、私は を更新しstate : "userReady"、他のユーザーも準備ができているかどうかを確認します (その値を観察しstateます)。

両方のユーザーがuserReadyの場合- ゲーム オン。

問題

そのため、100% のケースで、両方のデバイス間にわずかな時間差があることを既に確認しています。しかし、たとえば、

User1ボタンをクリックしI'm Readyました。これUser2ChildUpdateイベントが発生し、彼が知る限り、User2完全にプレイする準備が整いました。

User1 timerが最初に終了する(事実)ので、彼のタイマーが終了すると、秒 のUser2 timerままになります。さて、時間通りにゼロになったので、彼は部屋から追い出され、各ユーザーノードでイベントを送信します. これが起こっている間、この非常に小さな「ギャップ」で、(終了のゼロ時間と時計ショーの1秒(事実)の間-そして彼は準備ボタンを押します。彼はそれがプレーする準備ができていると思っています.ゲームが始まるよりも。1User1removeValueUser1 timerUser2User1

最終結果 -

両方のプレイヤーが Firebase から削除されました

User1 が部屋から出ています

ユーザー 2 がゲームを開始します (そして、彼は自分が対戦相手だと思っています)

この最終シナリオをどのように解決できますか? 、「UpdateChild状態」が完了したときにのみ関数を呼び出してみstartGameましたが、おそらくupdateChild、およびremoveValueの順序が原因で、まだ入りますか?

助言がありますか?そして、常に到達してくれたFirebaseチームに感謝します!!!

4

1 に答える 1