我有以下模式来重复动画(本身由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的值是多少,动画都只会发生一次.
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。