3

我正在制作一个类似于俄罗斯方块的小游戏。随着玩家得分的提高,我需要块落得更快我目前有这个代码:

setInterval(function(){
    if(gameOn == 1){
        gravity();
    }
},1000);

这调用了我的重力函数,它使块下降并进行所有的碰撞检测等。

var time = 1000 - score;

setInterval(function(){
        if(gameOn == 1){
            hideStuff('hover');
            gravity();
            time = 1000 - score;
        }
    },time);

我认为这样的事情可能会奏效,但似乎没有。有任何想法吗?谢谢

4

6 回答 6

3

每当您想更改延迟时,您都需要清除间隔并重新启动它:

window.icount = setInterval(function(){
    if(gameOn == 1){
        gravity();
    }
},1000);


var time = 1000 - score;

clearInterval(window.icount);
window.icount = setInterval(function(){
        if(gameOn == 1){
            hideStuff('hover');
            gravity();
            time = 1000 - score;
        }
    },time);
于 2012-10-31T15:25:26.330 回答
3

你可以做一个setTimeout循环。这样,每次调用都setTimeout将反映对值所做的任何更改time

var time = 1000;

(function foo(){

  if(gameOn == 1){
    hideStuff('hover');
    gravity();
    time = 1000 - score;
  }

  setTimeout(foo,time);

}());
于 2012-10-31T15:25:57.487 回答
1

您可以使用超时而不是间隔,并在回调结束时使用所需时间设置新的超时。这样您就不需要在每次想要更改时间时清除间隔。

像这样的东西:

// Some initial time to use
var time = 1000;
// Set the first timeout
setTimeout(callback, time);

function callback(){
    if(gameOn == 1){
        hideStuff('hover');
        gravity();
        time = 1000 - score;
        // Set a new timeout with your new time
        setTimeout(callback, time);
    }
 }
于 2012-10-31T15:25:15.263 回答
1

您需要使用 setTimeout 而不是 setInterval,如下所示:

setTimeout (function play () {
   if (gameOn == 1){
     hideStuff('hover');
     gravity();
     time = 1000 - score;
     setTimeout (play, 1000 - score);
   }
}, 1000);
于 2012-10-31T15:26:18.843 回答
1

如果第一个代码确实有效(但没有变得更快),这是一个答案,您还没有真正告诉我们发生了什么。

使用您的系统,由于计时器设置为零或更低,因此您无法在不破坏事物的情况下获得等于或超过 1000 的分数。我只是慢慢地减少每个“滴答”的时间,并有一个最小值(比如 100)。

于 2012-10-31T15:30:13.773 回答
0

您必须清除现有的计时器对象并使用修改后的时间创建一个新对象。

于 2012-10-31T15:26:02.557 回答