2016-03-25 9 views
2

私はkeydownのdivの連続的な動きを得ようとしています。動きは始まりますが、動きが遅くなり、動きが鈍くなります。どうすればこの問題を解決できますか?ここkeydown()のdivのスムーズなアニメーション()

$(document).keydown(function(e) { 
    width = $(this).width(); 

    switch(e.which) { 
     case key.LEFT: 
      $('.character').stop().animate({ 
       left:'-=' + width 
      }, 2000); 

      break; 

     case key.RIGHT: 
      $('.character').stop().animate({ 
       left:'+=' + width 
      }, 2000); 

      break; 
    } 

    e.preventDefault(); 
}).keyup(function() { 
    $('.character').stop(); 
}); 

とは、あなたがanimate()stop()を使用しているので、問題は単純であるjsfiddle

答えて

1

です:ここに私のコードです。​​関数は、キーが押された状態でUIが再描画されるたびに一度呼び出されます。これは潜在的に数百または数千回/秒です。したがって、あなたはアニメーションを定義し、それらのイベントごとにアニメーションを停止していました。

より良いアプローチは、​​イベントが発生するたびに、.character要素の位置を加算または減算することです。このような何か:

$(document).keydown(function(e) { 
    e.preventDefault(); 
    width = $('.character').width(); 

    switch (e.which) { 
     case key.LEFT: 
      $('.character').css('left', function(i, v) { 
       return parseInt(v, 10) - width; 
      }); 
      break; 

     case key.RIGHT: 
      $('.character').css('left', function(i, v) { 
       return parseInt(v, 10) + width; 
      }); 
      break; 
    } 
}); 

Working example

はまた、あなたの委任イベントハンドラに必要な要素の幅を取得することに注意してくださいあなたはdocumentを参照しますthisとして直接.characterセレクタを使用する必要があります。

+0

おかげで追加します。どのように私は動きを躍動的に見せないようにすることができますか?代わりにそれを連続的にしますか? – laurad

+0

各keydownイベントでジャンプしたギャップを減らすことができます:https://jsfiddle.net/4yq2pgdx/4/。しかし、あなたはブラウザのイベント検出率の恩恵を受けているので、いつも比較的不安定に見えます。 –

+0

@lauradスプライトベースのゲームをプログラムする場合は、[Phaser](http://phaser.io/)などの既存のフレームワークを使用することを検討する価値があります。 –

0

前述のように、stop()関数は本質的にアニメーションを停止しています。 あなたは単にそれを削除しようとすることができ、時間を説明するための https://jsfiddle.net/aluminium22/5uxwckz9/

$(document).ready(function() { 
     var key = { 
     LEFT:37, 
     RIGHT:39, 
     UP:38 
     }; 

     $(document).keydown(function(e) { 
      width = $(this).width(); 

      switch(e.which) { 
      case key.LEFT: 
       $('.character').animate({ 
       left:'-=' + width 
       }); 
       break; 

      case key.RIGHT: 
       $('.character').animate({ 
       left:'+=' + width 
       }); 

       break; 
      } 

      e.preventDefault(); 
     }).keyup(function() { 
      $('.character').stop(); 
     }); 
    }); 
関連する問題