0

で問題が発生していsetIntervals()ます。これらの問題が頻繁に発生することは知っていますが、実装の正確な問題が何であるかを理解できないようです。新しいものをインスタンス化するたびObstacle()に、障害物のインスタンスを回転させるために使用される設定間隔がクリアされ、障害物の次のインスタンス化は 2 倍の速さで回転するように見えます! スコープに関係していると確信していますが、私は比較的初心者なので、ここで何が起こっているのかよくわかりません。それ以上の情報を提供できます。

var obstacleCount = 1;
function Obstacle(){
    this.angle = 0;
    this.id = obstacleCount;
    this.elPrefix = "cookie-";
    this.el = '.' + this.elPrefix + this.id;
    $('#game-wrapper').append('<div class="' + this.elPrefix + this.id + '"></div>');
    obstacleCount += 1;
}

var intervals = new Array();

Obstacle.prototype.roll = function() {
    self = this;
    intervals[self.id] = setInterval(function(){
        self.angle -= 3;
        $(self.el).rotate(self.angle);
    }, 5);
    $(self.el).animate({
        right: 1000
    }, 4000, 'linear', function(){
        $(self.el).remove();
        clearInterval(intervals[self.id]);
    });
};

var obstacles = new Array();

setInterval(function(){
    obstacleID = obstacleCount;
    obstacles[obstacleID] = new Obstacle();
    obstacles[obstacleID].roll();
}, 1000);
4

1 に答える 1

0

ほとんどのゲームには、ゲームのすべての更新ロジックを処理する単一の更新ループがあります。setInterval を介して各オブジェクトに独自のスケジュールされた更新を与えるのではなく、すべてのオブジェクトが更新される単一の間隔を使用することをお勧めします。更新ループ メソッドからいくつかの利点が得られます。

  1. 間隔を追跡する必要はありません。

  2. setInterval はタイミングと一致していないため (メイン スクリプトの実行が終了し、次の実行までに余分な時間があるときに起動しますが、インターバル時間が経過した場合にのみ発生します。つまり、タイミングがあなたのものであることに完全に依存することはできません。できる限り一貫性を保つために、一度にすべてのオブジェクトを更新したほうがよいでしょう。

始めるための一般的な擬似コード:

    initialize objects
    add all objects to an array 

    setInterval(updateObjects, 30);

    updateObjects(){
      for each object in array
         object.roll();
    }
于 2013-05-14T13:09:49.087 に答える