将一系列背景图像更改为spritesheet

时间:2013-08-30 05:27:05

标签: javascript jquery html5

我有开发的对话屏幕我计划每隔一毫秒更改背景图像,使其看起来像动画。我尝试使用jquery settimeout和setinterval,但是在小间隔内更改图像堆栈的方式会挂起浏览器,以及如何完成任务的任何想法。

function change_background(new_image_source) { 
    var myimage = $( '#spriteanim' );
    myimage.attr('src','style/images/Sprites/Screen1/'+new_image_source+'.png');
    console.log(myimage.attr('src'));
    timer = setTimeout( function () {
        new_image_source = new_image_source+1;
        change_background(new_image_source);
    }, 50);

    if(new_image_source>=10899){
        change_background(new_image_source);
        clearTimeout(timer);
    }
} 

3 个答案:

答案 0 :(得分:1)

更改src属性永远不会按您的意愿工作。那是因为浏览器需要时间来加载图像。即使它被缓存,它仍然太慢,无法动画。我建议将您的图像组合成精灵并更改背景位置。你甚至可以用纯css过渡来做到这一点。

例如 - > http://jsfiddle.net/krasimir/uzZqg/

HTML

<div class="image"></div>

CSS

.image {
    background: url('...');
    width: 200px;
    height: 200px;
    transition: all 4000ms;
    -webkit-transition: all 4000ms;
}
.image:hover {
    background-position: -500px 0;
}

您甚至可以使用keyframes

以下是预装图片的方法http://jsfiddle.net/krasimir/DfWJm/1/

HTML

<div id="preloader"></div>

JS

var images = [
'http://www.australia.com/contentimages/about-landscapes-nature.jpg',
'http://www.australia.com/contentimages/about-landscapes-nature.jpg',
'http://www.australia.com/contentimages/about-landscapes-nature.jpg',
'http://www.australia.com/contentimages/about-landscapes-nature.jpg',
'http://www.australia.com/contentimages/about-landscapes-nature.jpg',
'http://www.australia.com/contentimages/about-landscapes-nature.jpg'    
];

var preloader = document.getElementById("preloader");
var preloadImages = function(callback) {
    if(images.length == 0) {
        callback();
        return;
    }
    var image = images.shift();
    var img = document.createElement("IMG");
    img.setAttribute("src", image);
    preloader.appendChild(img); 
    img.addEventListener("load", function() {
        console.log("image loaded");
        preloadImages(callback);
    });    
}

preloadImages(function() {
    // your animation starts here
    alert("Images loaded");
});

当然,您可以使用 display:none 隐藏 #preader div;

答案 1 :(得分:0)

结帐http://spritely.net/

它将处理spritesheet动画的细节。我们设置FPS并控制播放。

答案 2 :(得分:0)

我认为'每毫秒'有点太快了 图像加载需要一些时间。我想,你应该在开始动画之前加载所有图像一次。这需要一些时间,因为您使用的图像数量似乎 10899 。并且每隔几毫秒就隐藏一个除了一个。 “几毫秒”,而不是“每毫秒”,应该完成你的工作。

更新:
为您的图片命名spriteanim0spriteanim1 ......就像这样。加载完所有图像并且所有图像都已分配display: none后,请调用此js函数:

    var new_image_source1;
    function change_background(prev_image_source, new_image_source) {
        document.getElementById('spriteanim' + prev_image_source).style.display = 'none';
        document.getElementById('spriteanim' + new_image_source).style.display = 'block';
        if (new_image_source >= 10899)
            new_image_source1 = 0;
        else
            new_image_source1 = new_image_source + 1;
        window.setTimeout(
            function () {
                change_background(new_image_source, new_image_source1);
            },
            50);
    }

您可以尝试此操作,并根据需要相应地更改setTimeout间隔值。