想要将延迟添加到Keydown事件

Tim*_*ble 1 javascript keyboard-events

我发现了类似的线程,但是他们只谈论删除初始延迟,而不是设置延迟。

我有一个游戏,如果按下wasd,它将相应地移动用户,并将其移动到下一个网格坐标。但是,如果用户按住任何wasd键,他们几乎会立即拍摄,而我不希望这样。我试图在机芯上创建一个延迟,如果您快速按下该键,则不起作用,但如果按住该键则无效。我有以下代码:

window.addEventListener("keydown", onKeyDown, false);

function onKeyDown(event) {
 var keyCode = event.keyCode;
  if (canMove == true) {
   switch (keyCode) {
    case 68: //d
     keyD = true;
     canMove = false;
     break;
    case 83: //s
     keyS = true;
     canMove = false;  
     break;
    case 65: //a
     keyA = true;
     canMove = false;    
     break;
    case 87: //w
     keyW = true;
     canMove = false;
     break;
 }
setTimeout(function(){canMove = true;}, 400); 
}
checkMovement();
}
Run Code Online (Sandbox Code Playgroud)

我的问题:例如,我可以按“ a”并几乎立即缩放地图。我希望它们延迟200-500毫秒,以便它们以稳定的缓慢速度移动。如何解决这个问题?

Tha*_*you 5

这是一个小示例,该示例使用每250毫秒一次的最大密钥重复率。

单击Run code snippet按钮,在空白区域中使其具有焦点,然后按W A S D键盘上的。

window.addEventListener("keydown", (function(canMove) {
  return function(event) {
    if (!canMove) return false;
    canMove = false;
    setTimeout(function() { canMove = true; }, 250);
    switch (event.keyCode) {
      case 68: return move("right");
      case 83: return move("down");
      case 65: return move("left");
      case 87: return move("up");
    }  
  };
})(true), false);

function move(direction) {
  console.log("move: %s", direction);
}
Run Code Online (Sandbox Code Playgroud)