当使用多个来自object方法时,setInterval()会加速

时间:2013-05-14 12:50:44

标签: javascript oop setinterval

我的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);

1 个答案:

答案 0 :(得分:0)

在大多数游戏中,只有一个更新循环可以处理游戏的所有更新逻辑。我建议使用单个时间间隔来更新所有对象,而不是通过setInterval为每个对象提供自己的预定更新。您可以从更新循环方法中获得一些优势:

  1. 不必跟踪间隔。

  2. 因为setInterval与定时不一致(它在主脚本执行完毕时触发,并且在下一次运行之前有一些额外的时间,但只有当它的间隔时间到了。这意味着你不能完全依赖它的时间就是你所要求的。)你最好在当时更新所有物体,这样你才能保持稳定。

  3. 使您开始的常规伪代码:

        initialize objects
        add all objects to an array 
    
        setInterval(updateObjects, 30);
    
        updateObjects(){
          for each object in array
             object.roll();
        }