2016-06-04 2 views
0

Я нашел похожие темы, но они только говорят об удалении начальной задержки, а не о задержке.Хотите добавить Delay к событию Keydown

У меня есть игра, которая перемещает пользователя соответственно, если 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(); 
} 

Моей проблема: я могу нажать «а», например, и масштаб по всей карте почти мгновенно. Я хочу, чтобы их задержка, например, 200-500 мс, чтобы они двигались с постоянной скоростью. Как это исправить?

+0

Можете ли вы также по st код для достижения масштабирования? –

+0

Установить интервал onkeydown, очистить его onkeyup? – Koborl

+0

Вы пробовали этот http://stackoverflow.com/questions/1909441/jquery-keyup-delay? –

ответ

3

Вот небольшой демо, которая использует максимальную частоту автоповтора один раз в 250 мс.

Нажмите фрагмента кода кнопку Run, мыши в пустой области, чтобы дать ему фокус, затем нажмите WASD на клавиатуре

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

Huzzah! Это работает, большое спасибо и извините за задержку в подтверждении ответа. :) – Timble

0

var moveListener = null; 
 

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

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

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

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

Не проверял, но вы получите общее представление.

-1

Вы можете попробовать

window.addEventListener("keydown", 
      setTimeout(function(){ 
       onKeyDown() 
       }, 5000) 
    , false); 
-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(); 
} 

попробовать это:

 Смежные вопросы

  • Нет связанных вопросов^_^