我正在开发一款游戏。我的事件处理程序正在使用JQuery,游戏是用JavaScript编写的,我一直试图找到最好的方法来设置时间,然后再从我的事件监听器调用一个方法。
这是我当前的事件监听器:
function shootingHandler(key){
switch(parseInt(key.which, 10)){
case UpArrow:
case Spacebar:
setTimeout(player.shoot(), 1000);
break;
}
}
setTimeout()
方法不适用于此,因为它只调用方法,然后等待指定的时间,然后触发它。所以在我的示例代码中,我试图让它成为player
只能每秒发射一次,但如果玩家按住空格键则会自动射击数千次。
使一个方法一次只能被调用一次的好方法是什么,每隔几秒只能调用一次?
答案 0 :(得分:1)
选中此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;
}
}
这里,如果在前一次调用的1秒之前再次调用函数shootingHandler
,则计时器将重置为0.因此,只有当玩家释放空格键1秒钟时才会触发该功能。
这是一个老技巧,用于防止窗口大小调整在拖动时触发数百次。
答案 1 :(得分: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;
}
}
答案 2 :(得分:0)
如果您被允许使用其他第三方库,请查看下划线
它有一个非常好的功能,可以完全满足你的需要。
var throttled = _.throttle(updatePosition, 100);
$(window).scroll(throttled);
在此示例中, updatePosition 将在每100毫秒之前调用。
答案 3 :(得分:0)
在player.shoot()
中,首先检查玩家是否被允许射击。类似于if(allowedToShoot) { ... }
。
在shootingHandler
中,调用一个将标志设置为true
的函数,调用player.shoot()
,然后将标志设置回false
。类似于setTimeout(allowShooting(), 1000);
。
function allowShooting(){
allowedToShoot = true;
player.shoot();
allowedToShoot = false;
}