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

次のように、setIntervalではなくsetTimeoutを使用する必要があります。

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 に答える