私は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
ました。これUser2
でChildUpdate
イベントが発生し、彼が知る限り、User2
完全にプレイする準備が整いました。
User1 timer
が最初に終了する(事実)ので、彼のタイマーが終了すると、秒 のUser2 timer
ままになります。さて、時間通りにゼロになったので、彼は部屋から追い出され、各ユーザーノードでイベントを送信します. これが起こっている間、この非常に小さな「ギャップ」で、(終了のゼロ時間と時計ショーの1秒(事実)の間-そして彼は準備ボタンを押します。彼はそれがプレーする準備ができていると思っています.ゲームが始まるよりも。1
User1
removeValue
User1 timer
User2
User1
最終結果 -
両方のプレイヤーが Firebase から削除されました
User1 が部屋から出ています
ユーザー 2 がゲームを開始します (そして、彼は自分が対戦相手だと思っています)
この最終シナリオをどのように解決できますか? 、「UpdateChild状態」が完了したときにのみ関数を呼び出してみstartGame
ましたが、おそらくupdateChild、およびremoveValueの順序が原因で、まだ入りますか?
助言がありますか?そして、常に到達してくれたFirebaseチームに感謝します!!!