想要将延迟添加到 Keydown 事件
Want to add Delay to a Keydown event
我找到了类似的帖子,但他们只谈论删除初始延迟,而不是设置延迟。
我有一个游戏,如果按下 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();
}
我的问题:例如,我可以按 'a' 并几乎立即缩放地图。我希望它们有延迟,比如 200-500 毫秒,以便它们以稳定的慢速移动。如何解决这个问题?
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
}
还没有测试过,但你大概明白了。
你可以试试
window.addEventListener("keydown",
setTimeout(function(){
onKeyDown()
}, 5000)
, false);
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();
}
试试这个:
这是一个使用每 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);
}
我找到了类似的帖子,但他们只谈论删除初始延迟,而不是设置延迟。
我有一个游戏,如果按下 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();
}
我的问题:例如,我可以按 'a' 并几乎立即缩放地图。我希望它们有延迟,比如 200-500 毫秒,以便它们以稳定的慢速移动。如何解决这个问题?
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
}
还没有测试过,但你大概明白了。
你可以试试
window.addEventListener("keydown",
setTimeout(function(){
onKeyDown()
}, 5000)
, false);
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();
}
试试这个:
这是一个使用每 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);
}