【问题标题】:JavaScript/JQuery how set time before method can be called again?JavaScript/JQuery 如何在再次调用方法之前设置时间?
【发布时间】:2014-03-16 05:28:11
【问题描述】:

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

这是我当前的事件监听器:

function shootingHandler(key){
    switch(parseInt(key.which, 10)){
        case UpArrow:
        case Spacebar:
            setTimeout(player.shoot(), 1000);
            break;
    }
}

setTimeout() 方法对此不起作用,因为它只是调用该方法,然后等待指定的时间,然后触发它。所以在我的示例代码中,我试图让player 每秒只能开枪,但如果玩家按住空格键,它会自动开枪数千次。

有什么好的方法可以让一个方法一次只能被调用一次,每隔几秒左右只能调用一次?

【问题讨论】:

    标签: javascript jquery events queue keypress


    【解决方案1】:
    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;
        }
    }
    

    【讨论】:

    • 哇,效果真的很好!你知道我是否有办法做到这一点,如果他们在重新启用之前按SpacebarUpArrow,一旦启用它就会自动拍摄?
    • 我已经编辑了我的答案,所以我认为它会达到你的要求。
    • 完美。非常感谢!
    • 很好地使用递归:D
    【解决方案2】:

    查看fiddle

    var timerActive;
    function shootingHandler(key){
      switch(parseInt(key.which, 10)){
        case UpArrow:
        case Spacebar:
                if (timerActive){
                    clearTimeout(timerActive);
                 }
                timerActive= setTimeout(player.shoot(), 1000);
                };
            break;
        }
    }
    

    这里,如果函数shootingHandler在上一次调用的1秒之前再次调用,计时器将被重置回0。所以只有当玩家释放空格键1秒时才会触发该函数。 这是一个古老的技巧,用于防止在拖动时触发数百次调整窗口大小。

    【讨论】:

    • 我不太明白你在做什么,而且它似乎并没有真正起作用。完全没有。
    • 这里,如果在1秒之前再次调用该函数,定时器将被重置。所以只有当玩家释放空格键 1 秒时才会触发该功能。这是一个古老的技巧,用于防止窗口调整大小在拖动时触发数百次..
    • 否,因为每次按下SpacebarUpArrow 时,您都会调用resizeTime = blabla
    • 你看不到if (resizeTimer){ clearTimeout(resizeTimer); } 上面的setTimeOut 吗?如果计时器已设置并处于活动状态,它将重置计时器。函数player.shoot() 只有在有指定间隔的间隙时才会被触发。否则它将不断将计时器重置为 0
    • 这可能是您的意思,但是您有一个额外的结束块“}”,或者您缺少else
    【解决方案3】:

    如果您被允许使用其他第三方库,请查看下划线

    http://underscorejs.org/

    它有一个非常好的功能,可以完全满足您的需求。

    var throttled = _.throttle(updatePosition, 100);
    $(window).scroll(throttled);
    

    在本例中,updatePosition 不会在每 100 毫秒之前被调用一次。

    【讨论】:

    • 似乎是个好主意...如何调用我已经调用 _.throttle() 的方法?
    • 主要思想是用这个...包装一个事件处理程序......好吧,包装器。而是调用您的方法,而是创建一个新方法...类似于: this.wrappedMethod = _.throttle(this.Method);然后调用你调用原始方法的 wrapperMethod
    【解决方案4】:

    player.shoot(),先检查是否允许玩家射击。类似if(allowedToShoot) { ... }

    shootingHandler 中,调用将标志设置为true 的函数,调用player.shoot(),然后将标志设置回false。类似setTimeout(allowShooting(), 1000);

    function allowShooting(){
        allowedToShoot = true;
        player.shoot();
        allowedToShoot = false;
    }
    

    【讨论】:

      猜你喜欢
      • 2011-04-07
      • 2022-11-16
      • 2023-01-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-28
      • 1970-01-01
      相关资源
      最近更新 更多