我想知道如何实时更改setInterval的速度,例如:
if (score < 10)
repeater = setInterval(function() {
spawnEnemy();
}, 1000);
if (score => 10)
repeater = setInterval(function() {
spawnEnemy();
}, 500);
我知道这种方法不起作用,但有没有办法可以通过其他方式实现这一目标?
答案 0 :(得分:3)
<强> jsFiddle Demo
强>
一旦运行,就无法改变间隔速度。唯一的方法是为速度设置一个变量,然后清除间隔并以新的速度开始一个新的。
var speed = 500;
var changeSpeed = speed;
repeater = setInterval(repeaterFn, speed);
function repeaterFn(){
spawnEnemy();
if( changeSpeed != speed ){
clearInterval(repeater);
speed = changeSpeed;
repeater = setInterval(repeaterFn, speed);
}
}
function changeRepeater(){
changeSpeed = 700;
}
答案 1 :(得分:2)
您可以使用clearInterval
:
if (score < 10) {
clearInterval(repeater);
repeater = setInterval(spawnEnemy, 1000);
}
if (score => 10) {
clearInterval(repeater);
repeater = setInterval(spawnEnemy, 500);
}
但这取决于具体情况。如果此片段的执行频率高于必须,则需要某种机制来防止它一直重置您的间隔。
但是(正如我在问题的评论中写的那样)没有办法使用clearInterval
和更改间隔本身。至少不是没有用如上所示的新间隔替换它。
答案 2 :(得分:2)
另一种方法是使用 setTimeout 而不是 setInterval 。每次都要进行检查,这样你就可以将速度逻辑保持在单独的功能中。
var game_over = false;
var score = 0;
function getSpeedFromScore(score)
{
if (score > 20) {
game_over = true;
}
if (score < 10) {
return 1000;
} else {
return 500;
}
}
function spawnEnemyThenWait() {
if (!game_over) {
spawnEnemy();
var speed = getSpeedFromScore(score);
setTimeout(spawnEnemyThenWait, speed);
}
}
答案 3 :(得分:0)
您可以使用游戏循环并跟踪敌人类中的生成状态:
// press f12 so see console
function Enemy() {
this.spawned = false;
this.spawnOn = 20;
this.tick = function () {
this.spawnOn = this.spawnOn - 1;
if (this.spawnOn == 0) {
this.spawned = true;
}
}
this.goBackToYourCage = function () {
this.spawnOn = Math.floor(Math.random() * 50) + 1;
this.spawned = false;
}
}
var enemy = new Enemy();
window.setInterval(function () {
enemy.tick();
if (enemy.spawned) {
console.log('spawned');
enemy.goBackToYourCage();
console.log('Next spawin in :' + enemy.spawnOn);
}
}, 100);