Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/475.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/85.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JavaScript/JQuery如何设置再次调用方法之前的时间?_Javascript_Jquery_Events_Queue_Keypress - Fatal编程技术网

JavaScript/JQuery如何设置再次调用方法之前的时间?

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

我正在做一个游戏。我的事件处理程序使用JQuery,游戏是用JavaScript编写的,我一直在试图找到最好的方法来设置时间,然后才能从我的事件侦听器中再次调用方法

以下是我的当前事件侦听器:

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;
    }
}