2017-08-30 14 views
0

私は参加者が20ラウンドのインタラクティブな意思決定を行うマルチプレイヤーゲーム(科学実験用)を開発しています。各ラウンドには3つのステージがあり、それぞれ最大30秒間持続する必要があります。私は、カウントダウンを実装するにはどうすればよいのだろうかと思います。流星の同期カウントダウン

現在、私はクライアントサイドのアプローチを使用しています。ラウンドテンプレートの作成時には、クライアント側のタイマーを使用して、参加者の回答が0になったときにそれを送信します。これはこれまでのところうまくいきます。(誰もが同じ時間にゲームを開始し、誰もが回答を提出した)。参加者が切断されたり(オフラインになったり、ブラウザを閉じたり、接続に問題があったりして)、セッションや何かを操作する可能性があることを考慮すると、これを行うには良い方法だとは思えません。

サーバー側のタイマーを行う方がよいでしょうか?たとえば、タイマーを含むコレクションで、参加者はそのコレクションを購読しますか?もしそうなら、どのようにサーバー側のカウントダウンを実装しますか?また、このアプローチでは、カウントダウン(テンプレートに表示する)に1秒ごとにサーバー上のデータをリッスンする必要があるため、サーバーに対する要求が高くなりますか?

答えて

2

クライアントを信頼しないでください。

これを念頭に置いて、サーバーが選択した時間に応じてクライアントが残り時間を表示する方法を見つける必要があります。まず、サーバーは作成時にラウンドの終了時間を設定します(または開始時間+継続時間)。

誰もがサーバーに応じた終了時刻を持っているので、サーバー時刻と同期する必要があります。 mizzao:timesyncを使用してみましょう。これはかなり簡単です。サーバ時間を受信し、クライアント時間との差を作成します。クライアントの時間を監視して、奇妙なクロックの変更が発生していないことを確認し、待ち時間も考慮します。これは、あなたが必要とするものより少し多いかもしれませんが、すでに完了しているので、私たちの仕事は少なくなります!

現在のサーバーの時刻とラウンド終了時刻がわかったので、残りの時間を簡単に表示できます。プレイヤーが切断または再表示された後に戻った場合、それらの時間はどちらも有効で、ゲームを続行することができます。

+0

素晴らしい!これは私が探しているものです。私は少し初心者ですので、これを実装するコードの一部を追加することができれば、私を大きく助けるでしょう! – amaatouq

+0

あなたが最初にしようとすると、私はあなたの文脈の外になるだろう...あなたが問題を抱えたり、試してみるとエラーが発生した場合は、特定のコードの助けを得るためにSOに戻ってきてください。 – Salketer