在keydown上,使用JavaScript只运行一次计时器

在keydown上,使用JavaScript只运行一次计时器,javascript,jquery,timer,setinterval,Javascript,Jquery,Timer,Setinterval,我正在制作一个网络游戏,我想在用户启动游戏时调用计时器。基本上,我要做的就是当一个WASD键被按下时,启动定时器。问题是,如果你多次按按键,它每次都会启动计时器。我只想调用函数一次。我正在考虑clearInterval(),但这会停止计时器。不理想 这是我的密码。(下面是小提琴链接) 我认为应该发生的是,当按下任何键时,它将首先检查fired是否等于false。如果是,则将其设置为true。然后,如果按下W、A、S或D键,则启动计时器 然后,当钥匙返回时,再次将fired设置为false var

我正在制作一个网络游戏,我想在用户启动游戏时调用计时器。基本上,我要做的就是当一个WASD键被按下时,启动定时器。问题是,如果你多次按按键,它每次都会启动计时器。我只想调用函数一次。我正在考虑
clearInterval()
,但这会停止计时器。不理想

这是我的密码。(下面是小提琴链接)

我认为应该发生的是,当按下任何键时,它将首先检查
fired
是否等于
false
。如果是,则将其设置为
true
。然后,如果按下W、A、S或D键,则启动计时器

然后,当钥匙返回时,再次将
fired
设置为false

var fired = false;
var timer = document.getElementById("timer");

var playerObj = {
    elapsedTime: 0,
    startTimer: function () {
        setInterval(function () {
            playerObj.elapsedTime += 1;
            timer.innerHTML = playerObj.elapsedTime;
        }, 1000);
    }
};

var fired = false;
document.onkeydown = function (e) {
    var w = e.keyCode == '87',
        a = e.keyCode == '65',
        s = e.keyCode == '83',
        d = e.keyCode == '68';
    if (!fired) {
        fired = true;
        if (w || a || s || d) {
           playerObj.startTimer();
        }
    }
};

document.onkeyup = function () {
     fired = false;
};
我参考了答案,并试图使用一个标志,但它似乎没有做的把戏


我认为您需要更改流程以执行以下操作:

onkeydown 检查w/a/s/d标志,然后设置标志和启动计时器

onkeyup 如果不带a/s/d键,则将标志设置为false


基本上就是你在这里要做的。我认为这就是区别所在,因此在按下enter/g/h/etc时停止。

我认为您需要更改流程以执行以下操作:

onkeydown 检查w/a/s/d标志,然后设置标志和启动计时器

onkeyup 如果不带a/s/d键,则将标志设置为false


基本上就是你在这里要做的。我认为这就是区别所在,因此在按下enter/g/h/etc时停止。

我认为您需要更改流程以执行以下操作:

onkeydown 检查w/a/s/d标志,然后设置标志和启动计时器

onkeyup 如果不带a/s/d键,则将标志设置为false


基本上就是你在这里要做的。我认为这就是区别所在,因此在按下enter/g/h/etc时停止。

我认为您需要更改流程以执行以下操作:

onkeydown 检查w/a/s/d标志,然后设置标志和启动计时器

onkeyup 如果不带a/s/d键,则将标志设置为false


基本上就是你在这里要做的。我认为这就是区别所在,所以在按下enter/g/h/etc时停止。

关键思想是只有在
触发时启动计时器
false
。 如果您希望计时器在每场比赛中启动一次,请在第一次按键事件中将
fired
设置为
true
,然后启动计时器。在随后的按键事件中,检查
激发的值
,并拒绝启动计时器

var fired=false;
var timer=document.getElementById(“计时器”);
变量playerObj={
elapsedTime:-1,
更新:函数(){
playerObj.elapsedTime+=1;
timer.innerHTML=playerbj.elapsedTime;
},
startTimer:函数(){
playerObj.update();
设置间隔(playerbj.update,1000);
}
};
document.onkeydown=函数(e){
var w=e.keyCode=='87',
a=e.keyCode=='65',
s=e.keyCode=='83',
d=e.keyCode==68';
如果(!发射){
激发=真;
if(w | a | s | d){
playerObj.startTimer();
}
}
};
#计时器{
字体系列:无衬线;
字体大小:24px;
颜色:#444;
边框:1px实心#ddd;
显示:内联块;
填充:5px15px;
}

-
关键思想是仅当
触发时启动计时器
false
。 如果您希望计时器在每场比赛中启动一次,请在第一次按键事件中将
fired
设置为
true
,然后启动计时器。在随后的按键事件中,检查
激发的值
,并拒绝启动计时器

var fired=false;
var timer=document.getElementById(“计时器”);
变量playerObj={
elapsedTime:-1,
更新:函数(){
playerObj.elapsedTime+=1;
timer.innerHTML=playerbj.elapsedTime;
},
startTimer:函数(){
playerObj.update();
设置间隔(playerbj.update,1000);
}
};
document.onkeydown=函数(e){
var w=e.keyCode=='87',
a=e.keyCode=='65',
s=e.keyCode=='83',
d=e.keyCode==68';
如果(!发射){
激发=真;
if(w | a | s | d){
playerObj.startTimer();
}
}
};
#计时器{
字体系列:无衬线;
字体大小:24px;
颜色:#444;
边框:1px实心#ddd;
显示:内联块;
填充:5px15px;
}

-
关键思想是仅当
触发时启动计时器
false
。 如果您希望计时器在每场比赛中启动一次,请在第一次按键事件中将
fired
设置为
true
,然后启动计时器。在随后的按键事件中,检查
激发的值
,并拒绝启动计时器

var fired=false;
var timer=document.getElementById(“计时器”);
变量playerObj={
elapsedTime:-1,
更新:函数(){
playerObj.elapsedTime+=1;
timer.innerHTML=playerbj.elapsedTime;
},
startTimer:函数(){
playerObj.update();
设置间隔(playerbj.update,1000);
}
};
document.onkeydown=函数(e){
var w=e.keyCode=='87',
a=e.keyCode=='65',
s=e.keyCode=='83',
d=e.keyCode==68';
如果(!发射){
激发=真;
if(w | a | s | d){
playerObj.startTimer();
}
}
};
#计时器{
字体系列:无衬线;
字体大小:24px;
颜色:#444;
边框:1px实心#ddd;
显示:内联块;
填充:5px15px;
}

-
关键思想是仅当
触发时启动计时器
false
。 如果您希望计时器在每场比赛中启动一次,请在第一次按键事件中将
fired
设置为
true
,然后启动计时器。关于后续键控ev
var timer = document.getElementById("timer");

var playerObj = {
    elapsedTime: 0,
    startTimer: function () {
        setInterval(function () {
            playerObj.elapsedTime += 1;
            timer.innerHTML = playerObj.elapsedTime;
        }, 1000);
    }
};

// keep track of keys indiividually
var keyPressed = {
    w: false,
    a: false,
    s: false,
    d: false
};

// make it easy to translate keyCodes to key names
var CODES = {
    87: 'w',
    65: 'a',
    83: 's',
    68: 'd'
};

document.onkeydown = function (e) {

    // look up the key
    var keyName = CODES[e.keyCode];

    // if it's one we're interested in and it hasn't been pressed yet
    if (keyName && !keyPressed[keyName]) {
        playerObj.startTimer();

        // mark it as having been pressed
        keyPressed[keyName] = true;
    }
};
document.onkeydown = function (e) {
    var w = e.keyCode == '87',
        a = e.keyCode == '65',
        s = e.keyCode == '83',
        d = e.keyCode == '68';

    if (w || a || s || d) {
       playerObj.startTimer();
       document.onkeydown = null;
    }
};