在JavaScript中执行无限动画的模式而不会导致堆栈溢出

我有以下模式来重复动画(本身由x帧组成),t次:

sprite.prototype.loop = function(t,animation_name,frame_delay) {
    if(t > 0) {
        function next_run() {
            this.loop(t-1,animation_name,frame_delay);
        } 
        this.run(animation_name,frame_delay,next_run);
      }
    };

sprite.prototype.run = function(animation_name,frame_delay,frame_count,callback) {
    frame_count ||= 0;
    var s = this;
    if(frame_count < this.paths[animation_name].length) { // x frames
        setTimeout( function () {
            s.blit(s.paths[animation_name][frame_count]);
            s.run(animation_name,frame_delay,frame_count+1);
            }, frame_delay );
        }
    } else {
        if(!!callback) callback();
    }

super_mario.loop(10000,'mushroom_death',40);

显然,如果x * t大于最大堆栈深度,则会发生堆栈溢出.

问题:是否可以将此模式扩展到无限次运行动画的情况,或者是否有更正确的方法来执行无限循环情况?

解决方法:

我将重写您的循环函数,如下所示:

sprite.prototype.loop = function (t, animation_name, frame_delay) {
    var s = this;
    var frames = s.paths[animation_name];
    var x = frames.length;

    for (var i = 0; i < t; i++) {
        for (var frame_count = 0; frame_count < x; frame_count++) {
            setTimeout(function (frame_count) {
                s.blit(frames[frame_count]);
            }, (i * x + frame_count) * frame_delay, frame_count);
        }
    }
};

而已.因为没有递归,所以不会有任何堆栈溢出.

编辑:正如just2n提到的,您的代码还有另一个问题.实际上您同时为所有相同的帧调用setTimeout时,两个相同的帧之间不会有任何延迟.因此,无论t的值是多少,动画都只会发生一次.

相关文章

HTML5和CSS3实现3D展示商品信息的代码
利用HTML5中的Canvas绘制笑脸的代码
Html5剪切板功能的实现
如何通过HTML5触摸事件实现移动端简易进度条
Html5移动端获奖无缝滚动动画实现
关于HTML5和CSS3实现机器猫的代码