2

我正在尝试用 HTML5 Canvas 制作一个简单的游戏。我最多需要每秒两个键盘输入。

到目前为止,这是我的代码:

function move( x, y, r ) {
  var canid=document.getElementById("draw");
  canid.addEventListener('keydown',readkey,false);

  function readkey(e) {
    if(e.keyCode == 37) {
      clearField();
      x = x-draw.width / 10;
      redrawpic(x,y,r);
    }
    else if(e.keyCode == 38){
      clearField();
      y = y-draw.height / 10;
      redrawpic( x, y, r );
    }

    //..........etc
  }
}

函数 move 用于将图片从一个单元格移动到另一个单元格。如何在两个动作之间设置延迟a?

4

2 回答 2

5

您可以使用时间戳来检查最后一个事件发生的时间:

function move(x,y,r){

   /* your variable declarations*/
   var d1 = Date.now();
   var d2;

        function readkey(e){
             d2 = Date.now();

             // difference between timestamps needs to be 500ms
             if(d2-d1 > 500){
                  // set old Timestamp to new one
                  d1 = d2;
                  /*
                     Rest of your code
                  */
             }

这允许每 500 毫秒发生一个键事件。与 1 秒内的 2 个事件不完全相同(可能在 50 毫秒内发生,然后暂停 950 毫秒),但可能足够接近?

超时/间隔也是可能的,但我个人不喜欢连续(可能不必要的)超时调用的开销。

于 2013-07-06T14:03:29.923 回答
3
var throttle = false;
function readkey(e) {
    if (throttle)
        return;
    throttle = true;
    setTimeout(function () { throttle = false; }, 500);
    /* the rest of your code */

500 毫秒是每秒两个输入,但它们是单独限制的。您还可以计算一秒钟内有多少输入。就像是

    if (throttle > 1)
        return;
    throttle++;
    setTimeout(function () { throttle = 0; }, 1000);
于 2013-07-06T14:05:14.397 回答