これはかなり複雑な質問ですが、できるだけ簡単かつ簡潔に説明しようとします...
Firebase を使用して、マルチユーザーの Web ベースのゲームを構築しています。ゲームのすべてのラウンドのリストを保持しています。ラウンドの最後に、次のラウンドを開始する準備ができたときにクリックする「開始」ボタンがすべてのユーザーに表示されます。少なくとも 50% のユーザーが「開始」をクリックすると、ラウンドが開始されます。
gameRef
ゲームの Firebase リファレンスroundListRef
、ラウンドのリストを表すリファレンス、およびroundRef
現在のラウンドを表すリファレンスがあります。
新しいラウンドが追加されたときに全員の現在のラウンドになるように、child_added
コールバックを添付しました。roundListRef
roundListRef.on('child_added', function(childSnapshot, prevChildName) {
roundRef = childSnapshot.ref();
});
そこから 50% を簡単に追跡newRoundVotes
して計算できます。activePlayers
50% に達すると、新しいラウンドが追加され、全員のchild_added
イベントがトリガーされ、そこから新しいラウンドが開始されます...
gameRef.child('newRoundVotes').on('value', function(snapshot) {
var newRoundVotes = snapshot.val();
gameRef.child('activePlayers').once('value', function(snapshot) {
var activePlayers = snapshot.val();
if (newDriveVotes / activePlayers >= 0.5)
addNewRound();
});
});
私の質問は、新しいラウンドが 1 つだけ追加され、全員が同じラウンドに参加していることを確認するにはどうすればよいですか?
たとえば、10 人のプレイヤーがいて、4 人が次のラウンドの開始に投票したとします。5 番目のプレイヤーからイベントがトリガーされる前に 6 番目のプレイヤーが投票した場合、6 番目のプレイヤーchild_added
のラウンドも追加されます。
.set()
問題はvsに似て.transaction()
いますが、まったく同じではありません (私の理解から)。
誰にも解決策がありますか?