Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/10.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 在JS中减慢.push()间隔_Javascript_Arrays_Instance - Fatal编程技术网

Javascript 在JS中减慢.push()间隔

Javascript 在JS中减慢.push()间隔,javascript,arrays,instance,Javascript,Arrays,Instance,player.fire是一个布尔值,如果空格键处于keydown状态,该值将变为true。一切正常 我的问题是控制小行星阵列。发射。推进间隔。现在,它添加了一些实例,即使我轻轻地点击空格键。我正在使用requestAnimationFrame 如何控制推送间隔 if(player.fire){ var angle = thisShip.rot, hyp = 10; //speed var vX = Math.cos(angle) * h

player.fire是一个布尔值,如果空格键处于keydown状态,该值将变为true。一切正常

我的问题是控制小行星阵列。发射。推进间隔。现在,它添加了一些实例,即使我轻轻地点击空格键。我正在使用requestAnimationFrame

如何控制推送间隔

    if(player.fire){
        var angle = thisShip.rot, 
        hyp = 10; //speed

        var vX = Math.cos(angle) * hyp, 
        vY = Math.sin(angle) * hyp;

        asteroids.firing.push(new asteroids.model.fire(thisShip.x, thisShip.y, vX, vY));
    }
我尝试过类似的方法,但它并没有减慢推送间隔,而是产生了一种脉冲效果,一次又一次地重新生成触发序列

    ...
    if(player.fire){
            fireInterval(thisShip);
    }

    function fireInterval(thisShip){
        var angle = thisShip.rot, 
            hyp = 10; //speed

        var vX = Math.cos(angle) * hyp, 
        vY = Math.sin(angle) * hyp;

        asteroids.firing.push(new asteroids.model.fire(thisShip.x, thisShip.y, vX, vY));

        setTimeout(function(){
            fireInterval(thisShip);
        }, 500);
    } 

你需要使用某种键盘缓冲区。 我建议你看看。 这些评论也非常有用,您可以从中找到:

您现在所做的只是将开火动作延迟半秒,但所有被捕获的按键仍会发送。
我也会考虑使用KEYUP,可能会更好。

你需要使用某种键盘缓冲区。 我建议你看看。 这些评论也非常有用,您可以从中找到:

您现在所做的只是将开火动作延迟半秒,但所有被捕获的按键仍会发送。
我也会考虑使用KEYUP,可能会更好。

发生的事情是每次更新都调用这个函数。 我不知道你的引擎是什么样子的,但如果你使用requestAnimationFrame,可能会达到60fps,如果你只是尽可能快地循环,并且更新与绘图无关,则可能会达到60fps

你需要做的是给船上的枪加上某种状态。 不管它是什么

thisShip.cooldownTime = 250; //ms
thisShip.lastFired =    oldTimestamp;

if (currentTime - thisShip.lastFired >= thisShip.cooldownTime) {
    thisShip.fire(); // push the model, set lastFired to current time, etc...
}
另外,就其他人的建议而言:

我不确定你是如何实现监听键盘事件的。。。 但是在处理JS中的键时,我最倾向于让键盘触发它想要的尽可能多的keydown和keydup事件。 键事件函数所做的唯一事情不是缓冲,而是告诉键盘对象某个键是向下键还是向上键

在更新期间轮询该键盘对象

document.addEventListener("keydown", function (e) {
    var key = e.keyCode;
    if (!!Keyboard[key]) { return; } 
    Keyboard[key] = e.timeStamp;
});


document.addEventListener("keyup", function (e) {
    var key = e.keyCode;
    delete Keyboard[key];
});
轮询以查看键是否已按下。 通过将密钥的值设置为e.timeStamp,您现在可以知道他们何时开始按住它,这样您就可以确定您的飞船开火的频率

更好的是,您可以设置一些抽象系统,如:

var Keymap = { SPACE : 32, A : 65, ... };
Player1.controls = { FIRE : "SPACE" };

var code = Keymap[Player1.controls.FIRE],
    pressedSince = Keyboard[code]; // timestamp || undefined
现在你有了一些可以与你的冷却时间和门相比较的东西。
无论键盘敲击的速度有多快,或者默认情况下键盘通过turbo fire工作,您都应该拥有防止turbo fire所需的所有数据点,以允许在250毫秒时按下auto fire选通,或者选通到屏幕上只有3颗子弹,或者其他什么,如果您检测到钥匙一直被敲击,则选通到较小的值,让按钮masher比按钮保持架稍有优势。

现在发生的是,每次更新都调用此函数。 我不知道你的引擎是什么样子的,但如果你使用requestAnimationFrame,可能会达到60fps,如果你只是尽可能快地循环,并且更新与绘图无关,则可能会达到60fps

你需要做的是给船上的枪加上某种状态。 不管它是什么

thisShip.cooldownTime = 250; //ms
thisShip.lastFired =    oldTimestamp;

if (currentTime - thisShip.lastFired >= thisShip.cooldownTime) {
    thisShip.fire(); // push the model, set lastFired to current time, etc...
}
另外,就其他人的建议而言:

我不确定你是如何实现监听键盘事件的。。。 但是在处理JS中的键时,我最倾向于让键盘触发它想要的尽可能多的keydown和keydup事件。 键事件函数所做的唯一事情不是缓冲,而是告诉键盘对象某个键是向下键还是向上键

在更新期间轮询该键盘对象

document.addEventListener("keydown", function (e) {
    var key = e.keyCode;
    if (!!Keyboard[key]) { return; } 
    Keyboard[key] = e.timeStamp;
});


document.addEventListener("keyup", function (e) {
    var key = e.keyCode;
    delete Keyboard[key];
});
轮询以查看键是否已按下。 通过将密钥的值设置为e.timeStamp,您现在可以知道他们何时开始按住它,这样您就可以确定您的飞船开火的频率

更好的是,您可以设置一些抽象系统,如:

var Keymap = { SPACE : 32, A : 65, ... };
Player1.controls = { FIRE : "SPACE" };

var code = Keymap[Player1.controls.FIRE],
    pressedSince = Keyboard[code]; // timestamp || undefined
现在你有了一些可以与你的冷却时间和门相比较的东西。 无论键盘敲击的速度有多快,或者默认情况下键盘通过turbo fire工作,您都应该拥有防止turbo fire所需的所有数据点,以允许在250毫秒时按下auto fire选通,或者选通到屏幕上只有3颗子弹,或者其他什么,如果您检测到钥匙一直被敲击,则选通到较小的值,让按钮混搭者比按钮保持者有一点优势。

我假设你在游戏循环中有ifplayer.fire{…}部分代码?如果是这样的话,这就是为什么它被频繁触发的原因。最常见的解决方案是在一次火灾事件发生后,在用户可以再次火灾之前,有一个“冷却”期。e、 g:

if ( player.fireWait > 0 ) {
  player.fireWait--;
}

if( player.fire && (player.fireWait == 0) ){
  player.fireWait = 20;
  fire( thisShip );
}
上面提到的一个问题是,如果用户反复点击fire按钮,他们将无法再次开火,直到.fireWait计数器再次点击0。这就是为什么无论您的onkeydown位于何处,您都需要执行以下操作:

player.fireWait = 0;
然而,另一张海报正确地指出,为了让你的射击机制像大多数游戏一样工作,你还需要使用键盘缓冲区。如果用户 在太空中,你会得到一个奇异的镜头。。。过了一段时间,你会突然被快速射击。这是因为keydown与正常的键盘输入相关联,如果你按下一个键,你就会看到发生了什么。

我假设你有ifplayer.fire{…}部分代码在游戏循环中?如果是这样的话,这就是为什么它被频繁触发的原因。最常见的解决方案是在一次火灾事件发生后,在用户可以再次火灾之前,有一个“冷却”期。e、 g:

if ( player.fireWait > 0 ) {
  player.fireWait--;
}

if( player.fire && (player.fireWait == 0) ){
  player.fireWait = 20;
  fire( thisShip );
}
上面提到的一个问题是,如果用户反复点击fire按钮,他们将无法再次开火,直到.fireWait计数器再次点击0。这就是为什么无论您的onkeydown位于何处,您都需要执行以下操作:

player.fireWait = 0;

然而,另一张海报正确地指出,为了让你的射击机制像大多数游戏一样工作,你还需要使用键盘缓冲区。如果没有缓冲区,如果用户按住空格,您将得到一个单发镜头。。。过了一段时间,你会突然被快速射击。这是因为keydown与正常的键盘输入相关联,如果你按下一个键,你就会看到发生了什么。

你需要发布更多的代码,因为不清楚你发布的代码是如何被调用的。你需要发布更多的代码,因为不清楚你发布的代码是如何被调用的。