1

私はnode.jsとexpressを使用しており、nowjsを使用してサーバー側関数を呼び出し、変数を同期しています。ユーザーがキャンバス上にスプライトとして描かれているとします。彼の x、y 座標はサーバー側の「位置」配列に保持されます。

サーバ側:

position = { x : 0; y : 0 } 

updatePosition = function (a,b) 
{ 
  playerPosition.x += a; 
  playerPosition.y += b; 
} 

クライアント側:

if keypress('right'){ updatePosition(32,0); }

これらは疑似コードです。ユーザーが「右」ボタンを押すと、サーバー側の「updatePosition」関数が呼び出され、「位置」配列の x 座標に 32 (ピクセル) が追加されます。この配列はクライアントと共有され、クライアント側の関数を使用して新しい位置がキャンバスに描画されます。

スプライトを新しい位置に即座に描画したくないとします。スプライトを徐々に右に 32 ピクセル移動し、完了するまでに約 1 秒かかる歩行アニメーションを再生したいと考えています。私はこのように実装するかもしれません:

  1. ユーザーが「右」ボタンを押します。
  2. クライアント側でアニメーションの再生が開始されます。
  3. updatePosition は通常どおりサーバー側で呼び出されます。
  4. クライアントでのアニメーションが終了したら、クライアント側の最終位置がサーバー側に保存された座標と一致するかどうかを確認します。

ユーザーが「右」のボタン/キーを押すと、1 秒後までキーを押すことができません。1 秒間の「歩く」アニメーションが完了し、最終的な位置がサーバー側の座標でチェックされてから、もう一度「右」を押してスプライトを移動する必要があります。

質問: サーバー側で 1 秒を追跡するにはどうすればよいですか? ユーザーがクライアントをハックしてアニメーション時間を短縮できるため、クライアント側では実行できません。

位置配列を「タイムスタンプ」する解決策はありますか? 例: 位置 = { x : 0; y:0、時間:0}。ユーザーがもう一度「右」ボタンを押すと、サーバーは最後の位置更新が 1 秒以上前かどうかを確認します。1 秒未満の場合、サーバーはそれを無視します。

4

1 に答える 1

0

ユーザーセッションに単に「ロック」を保存しないのはなぜですか?

session.editLock = new Date().getTime();

クライアントによって別の編集がトリガーされた場合は、次のようにします。

if(session.editLock && new Date().getTime() - session.editLock > 1000) {
  // Return error
}

位置オブジェクトを変更することは、私には適切ではありません。位置オブジェクトは、時間ではなく位置を格納するためのものです。

于 2012-05-25T08:25:11.693 に答える