Javascript 在JS中减慢.push()间隔
player.fire是一个布尔值,如果空格键处于keydown状态,该值将变为true。一切正常 我的问题是控制小行星阵列。发射。推进间隔。现在,它添加了一些实例,即使我轻轻地点击空格键。我正在使用requestAnimationFrame 如何控制推送间隔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
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与正常的键盘输入相关联,如果你按下一个键,你就会看到发生了什么。你需要发布更多的代码,因为不清楚你发布的代码是如何被调用的。你需要发布更多的代码,因为不清楚你发布的代码是如何被调用的。