如何实时更改setInterval的速度

时间:2015-02-02 22:21:26

标签: javascript

我想知道如何实时更改setInterval的速度,例如:

if (score < 10)
    repeater = setInterval(function() {
        spawnEnemy();
    }, 1000);
if (score => 10)
    repeater = setInterval(function() {
        spawnEnemy();
    }, 500);

我知道这种方法不起作用,但有没有办法可以通过其他方式实现这一目标?

4 个答案:

答案 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);
    }
}

JS小提琴http://jsfiddle.net/bq926xz6/

答案 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);

http://jsfiddle.net/martijn/qxt2fe8y/2/