繁体   English   中英

如何实时更改setInterval的速度

[英]How to change the speed of setInterval in real time

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

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

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

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;
}

您可以使用clearInterval

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

但这取决于背景。 如果更经常地执行这个片段中,比它必须是,你将需要某种机制,以防止其重置间隔所有的时间。

但是(正如我在问题的评论中写的那样)没有办法使用clearInterval改变间隔本身。 至少不是没有用如上所示的新间隔替换它。

另一种方法是使用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/

您可以使用游戏循环并跟踪敌人类中的生成状态:

// 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/

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM