0

我的setIntervals(). 我知道这些问题经常出现,但我似乎无法弄清楚我的实现的确切问题是什么。每次我实例化一个新的Obstacle()时,它都会清除用于旋转障碍物实例的设置间隔,并且障碍物的下一个实例化似乎以两倍的速度旋转!我确定这与范围有关,但我是一个相对初学者,所以我不太确定这里发生了什么。可以提供更多信息。

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 回答