JavaScript/JQuery如何设置再次调用方法之前的时间?
我正在做一个游戏。我的事件处理程序使用JQuery,游戏是用JavaScript编写的,我一直在试图找到最好的方法来设置时间,然后才能从我的事件侦听器中再次调用方法 以下是我的当前事件侦听器:JavaScript/JQuery如何设置再次调用方法之前的时间?,javascript,jquery,events,queue,keypress,Javascript,Jquery,Events,Queue,Keypress,我正在做一个游戏。我的事件处理程序使用JQuery,游戏是用JavaScript编写的,我一直在试图找到最好的方法来设置时间,然后才能从我的事件侦听器中再次调用方法 以下是我的当前事件侦听器: function shootingHandler(key){ switch(parseInt(key.which, 10)){ case UpArrow: case Spacebar: setTimeout(player.shoot(), 1
function shootingHandler(key){
switch(parseInt(key.which, 10)){
case UpArrow:
case Spacebar:
setTimeout(player.shoot(), 1000);
break;
}
}
setTimeout()
方法对此不起作用,因为它只调用该方法,然后等待指定的时间,然后触发它。在我的示例代码中,我试图使播放器每秒只能发射一次,但如果播放器按住空格键,它会自动发射数千次
使方法一次只能调用一次,只能每隔几秒钟左右调用一次的好方法是什么?如果允许使用其他第三方库,请签出下划线
它有一个非常好的功能,完全满足您的需要
var throttled = _.throttle(updatePosition, 100);
$(window).scroll(throttled);
在本例中,updatePosition不会在每100毫秒之前调用一次。检查此项
在此,如果在前一次调用的1秒之前再次调用函数shootingHandler
,计时器将重置回0。因此,只有当玩家释放空格键1秒时,该功能才会被触发。
这是一个老把戏,用来防止窗口大小调整在拖动时触发数百次。在player.shoot()
中,首先检查播放器是否允许射击。类似于if(allowedtoshot){…}
在shootingHandler
中,调用一个函数,将标志设置为true
,调用player.shoot()
,然后将标志设置回false
。类似于setTimeout(allowShooting(),1000)代码>
我真的不明白你在做什么,而且看起来也不起作用。在这里,如果在1秒之前再次调用该函数,计时器将被重置。因此,只有当玩家释放空格键1秒时,该功能才会被触发。这是一个老把戏,用来防止窗口在拖动时触发数百次调整大小..不,因为每次按下Spacebar
或UpArrow
时都会调用if(resizeTimer){clearTimeout(resizeTimer);}
在设置超时上方
?如果计时器已设置并处于活动状态,它将重置计时器。只有当间隙达到指定间隔时,才会触发函数player.shoot()
。否则,它将继续将计时器重置回0,这可能是您的本意,但您有一个额外的结束块“}”,或者您缺少一个,否则似乎是个好主意。。。我如何调用一个我已经调用过的.throttle()
方法?主要思想是用这个函数包装一个事件处理程序。。。嗯,包装纸。创建一个新方法,而不是调用您的方法。。。类似这样的内容:this.wrappedMethod=u.throttle(this.Method);然后调用wrapperMethod,在这里调用最初的oneWow,它工作得非常好!你知道我有没有办法,如果他们在重新启用前按空格键
或向上箭头
,它会在启用后自动拍摄?我编辑了我的答案,这样我想它会达到你的要求。太好了。非常感谢你!递归的良好使用:D
var timerActive;
function shootingHandler(key){
switch(parseInt(key.which, 10)){
case UpArrow:
case Spacebar:
if (timerActive){
clearTimeout(timerActive);
}
timerActive= setTimeout(player.shoot(), 1000);
};
break;
}
}
function allowShooting(){
allowedToShoot = true;
player.shoot();
allowedToShoot = false;
}
var disabled = false;
var shootOnEnabled = false;
function shootingHandler(key){
switch(parseInt(key.which, 10)){
case UpArrow:
case Spacebar:
if (disabled) {
shootOnEnabled = true;
break;
}
shoot();
disabled = true;
setTimeout(function () {
disabled = false;
if (shootOnEnabled) {
shootOnEnabled = false;
shootingHandler(key);
}
}, 1000);
break;
}
}