Javascript JQuery-JS-Keydown
当我按下任何箭头或使用WSAD时,在第一次“激活”keydown事件之后,会有轻微的延迟,直到下一次,但在那之后是正常的。示例:按住箭头键,移动1px,稍等片刻,然后开始按1px周期正常移动 我的代码:Javascript JQuery-JS-Keydown,javascript,jquery,keydown,Javascript,Jquery,Keydown,当我按下任何箭头或使用WSAD时,在第一次“激活”keydown事件之后,会有轻微的延迟,直到下一次,但在那之后是正常的。示例:按住箭头键,移动1px,稍等片刻,然后开始按1px周期正常移动 我的代码: //========== KEY LOGGING ========== var pressedKeys = []; //declare as globals coz of debug var x; var y;
//========== KEY LOGGING ==========
var pressedKeys = [];
//declare as globals coz of debug
var x;
var y;
var x2;
var y2;
function checkMove(checkX, checkY, cSize, cSpeed, direction) {
x = checkX - cSpeed;
y = checkY - cSpeed;
x2 = checkX + cSize + cSpeed;
y2 = checkY + cSize + cSpeed;
switch (direction) {
case 1:
// left
if (x > 0) {
return checkX - cSpeed;
} else {
return 0;
}
break;
case 2:
// up
if (y > 0) {
return checkY - cSpeed;
} else {
return 0;
}
break;
case 3:
// right
if (x2 < width) {
return checkX + cSpeed;
} else {
return width - cSize;
}
break;
case 4:
// down
if (y2 < height) {
return checkY + cSpeed;
} else {
return height - cSize;
}
break;
default:
return; // exit this handler for other keys
}
}
// == KEYDOWN ==
$(document.body).keydown(function (e) {
pressedKeys[e.which] = true;
$.each(playerList, function (i, currentPlayer) {
//player 1
if (currentPlayer.id == 0) {
//left
if (pressedKeys[37] == true) {
currentPlayer.x = checkMove(currentPlayer.x, currentPlayer.y, currentPlayer.size, currentPlayer.speed, 1)
}
//up
if (pressedKeys[38] == true) {
currentPlayer.y = checkMove(currentPlayer.x, currentPlayer.y, currentPlayer.size, currentPlayer.speed, 2)
}
//right
if (pressedKeys[39] == true) {
currentPlayer.x = checkMove(currentPlayer.x, currentPlayer.y, currentPlayer.size, currentPlayer.speed, 3)
}
//down
if (pressedKeys[40] == true) {
currentPlayer.y = checkMove(currentPlayer.x, currentPlayer.y, currentPlayer.size, currentPlayer.speed, 4)
}
}
//player 2
else if (currentPlayer.id == 1) {
//left
if (pressedKeys[65] == true) {
currentPlayer.x = checkMove(currentPlayer.x, currentPlayer.y, currentPlayer.size, currentPlayer.speed, 1)
}
//up
if (pressedKeys[87] == true) {
currentPlayer.y = checkMove(currentPlayer.x, currentPlayer.y, currentPlayer.size, currentPlayer.speed, 2)
}
//right
if (pressedKeys[68] == true) {
currentPlayer.x = checkMove(currentPlayer.x, currentPlayer.y, currentPlayer.size, currentPlayer.speed, 3)
}
//down
if (pressedKeys[83] == true) {
currentPlayer.y = checkMove(currentPlayer.x, currentPlayer.y, currentPlayer.size, currentPlayer.speed, 4)
}
}
//addplayer
if (pressedKeys[80] == true && id < 5) {
addPlayer("red", size, width / 2, height / 2);
}
//+
if (pressedKeys[107] == true) {
currentPlayer.speed += 1;
}
//-
if (pressedKeys[109] == true && currentPlayer.speed > 1) {
currentPlayer.speed -= 1;
}
});
});
// == KEYUP ==
$(document.body).keyup(function (e) {
delete pressedKeys[e.which];
});
/=============密钥记录==========
var pressedKeys=[];
//声明为调试的全局coz
var x;
变量y;
var-x2;
变量y2;
函数checkMove(checkX、checkY、cSize、cSpeed、direction){
x=检查x-cSpeed;
y=检查y-cSpeed;
x2=检查X+cSize+cSpeed;
y2=检查Y+cSize+cSpeed;
开关(方向){
案例1:
//左
如果(x>0){
返回checkX-cSpeed;
}否则{
返回0;
}
打破
案例2:
//向上
如果(y>0){
返回checkY-cSpeed;
}否则{
返回0;
}
打破
案例3:
//对
如果(x2<宽度){
返回checkX+cSpeed;
}否则{
返回宽度-cSize;
}
打破
案例4:
//向下
如果(y2<高度){
返回checkY+cSpeed;
}否则{
返回高度-cSize;
}
打破
违约:
return;//退出其他键的处理程序
}
}
//==按下键==
$(document.body).keydown(函数(e){
按按键[e.which]=true;
$.each(playerList,function(i,currentPlayer){
//玩家1
如果(currentPlayer.id==0){
//左
如果(按键[37]==true){
currentPlayer.x=checkMove(currentPlayer.x,currentPlayer.y,currentPlayer.size,currentPlayer.speed,1)
}
//向上
如果(按键[38]==true){
currentPlayer.y=checkMove(currentPlayer.x,currentPlayer.y,currentPlayer.size,currentPlayer.speed,2)
}
//对
如果(按按键[39]==true){
currentPlayer.x=checkMove(currentPlayer.x,currentPlayer.y,currentPlayer.size,currentPlayer.speed,3)
}
//向下
如果(按[40]==真){
currentPlayer.y=checkMove(currentPlayer.x,currentPlayer.y,currentPlayer.size,currentPlayer.speed,4)
}
}
//玩家2
else if(currentPlayer.id==1){
//左
如果(按按键[65]==真){
currentPlayer.x=checkMove(currentPlayer.x,currentPlayer.y,currentPlayer.size,currentPlayer.speed,1)
}
//向上
如果(按键[87]==真){
currentPlayer.y=checkMove(currentPlayer.x,currentPlayer.y,currentPlayer.size,currentPlayer.speed,2)
}
//对
如果(按键[68]==真){
currentPlayer.x=checkMove(currentPlayer.x,currentPlayer.y,currentPlayer.size,currentPlayer.speed,3)
}
//向下
如果(按按键[83]==true){
currentPlayer.y=checkMove(currentPlayer.x,currentPlayer.y,currentPlayer.size,currentPlayer.speed,4)
}
}
//addplayer
如果(按按键[80]==true&&id<5){
addPlayer(“红色”,尺寸,宽度/2,高度/2);
}
//+
如果(按[107]==真){
currentPlayer.speed+=1;
}
//-
如果(按按键[109]==true&¤tPlayer.speed>1){
currentPlayer.speed-=1;
}
});
});
//==KEYUP==
$(document.body).keyup(函数(e){
删除按过的键[e.which];
});
您的问题主要在于操作系统键盘设置中设置的“重复延迟”。在Windows 7中,如果您转到控制面板,然后转到键盘设置,您将看到您可以在其中设置单个和重复按键事件之间的延迟以及按键重复的频率
显然,由于这是一个O/S设置,您不能通过浏览器更改它,也不能更改自己的设置,因为不是每个人都会共享这些设置
最好的方法是使用keydown和keyup事件以及计时器。因此,当一个键触发一个keydown事件时,您可以设置一个间隔计时器,该计时器使用您的函数每隔x毫秒触发一次,然后在触发keydup时取消该间隔。正如@Lee所述,这是操作系统的一项功能。唯一可以修复它的方法是使用
setInterval
函数:
var pressedKeys = [];
$(document.body).keydown(function(e){
if (!pressedKeys[e.which]){
pressedKeys[e.which] = setInterval(function(){
console.log(1);
}, 0);
}
});
$(document.body).keyup(function (e) {
if (pressedKeys[e.which]){
clearInterval(pressedKeys[e.which]);
delete pressedKeys[e.which];
}
});
它甚至可以让您更好地控制键下
回调,因为您可以调整setInteval
的延迟,从而获得更好的acr性能