2015-02-02 6 views
1

Я хотел бы знать, как изменить скорость setInterval в реальном масштабе времени, например:Как изменить скорость setInterval в реальном времени

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

Я знаю, что этот метод не работает, но есть способ, которым я могу достичь этого по-другому?

+1

clearInterval и повторно установить его. – artm

+0

Что вы подразумеваете под «другим способом»? В чем разница? Помимо этого вопроса: Нет никакого способа изменить скорость существующего интервала, не создавая новый интервал, используя стандартную интервальную функциональность JavaScript. – Matmarbon

ответ

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 Fiddle http://jsfiddle.net/bq926xz6/

+0

Хорошая реализация! Благодарю. – TeaAnyOne

2

Вы можете использовать clearInterval:

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

Но это зависит от контекста. Если этот фрагмент выполняется чаще, чем он должен быть, вам понадобится какой-то механизм, чтобы он не мог постоянно переустанавливать ваш интервал.

Но есть (как я писал в комментарии к вопросу), нет способа использовать clearInterval и изменение интервал сам. По крайней мере, не заменяя его новым интервалом, как показано выше.

2

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

Это похоже на приятное предложение, лучше моего. Но я бы создал функцию, которая воссоздает интервал вместо установки переменной .. может быть. – Matmarbon

+0

@Matmarbon - переменная или флаг или механизм выбора должны использоваться там, чтобы указать, что интервал необходимо изменить, но в конце текущего интервала. В противном случае интервал был бы коротким и выглядел бы прерывистым. –

+0

Хорошая точка. За исключением того, что вы могли ... _theoretically_ ... регистрировать текущее время ('(новая дата()). GetTime()') для каждого вызова 'repeataterFn', а затем ... wow не будет думать, что до конца .. он либо дал бы огромный беспорядок, либо был бы милями исходного кода. Забудь об этом. – Matmarbon

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/

Смежные вопросы