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