想要将延迟添加到Keydown事件

时间:2016-06-04 06:15:18

标签: javascript keyboard-events

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

我有一个游戏,如果按下了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();
}

我的问题:我可以按“a”为例,几乎可以立即放大地图。我希望他们是一个延迟,比如200-500毫秒,这样他们就会以稳定的慢速移动。如何解决这个问题?

4 个答案:

答案 0 :(得分:3)

这是一个使用每250毫秒一次最大键重复率的小型演示。

单击运行代码段按钮,单击空白区域以使其聚焦,然后按 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);
}




答案 1 :(得分:0)

var moveListener = null;

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

function onKeyDown(event) {
	var keyCode = event.keyCode;
  //prevent reseting event listener on hold down also will prevent up,left diagonal type movement
  if (moveListener === null) {
   	moveListener = setInterval(move(keyCode),400);
  }
}

function onKeyUp (event){
  	clearInterval(moveListener);
    moveListener = null;
}

function move (direction){
	//move code here
}

没有测试过,但你得到了一般的想法。

答案 2 :(得分:-1)

你可以尝试

   window.addEventListener("keydown", 
             setTimeout(function(){ 
               onKeyDown()
              }, 5000) 
   , false);

答案 3 :(得分:-1)

function onKeyDown(event) {
    var keyCode = event.keyCode;

    if (canMove == true) {
        setTimeout(function () {
            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;
            }
        }, 400);
    }
    checkMovement();
}

试试这个: