如何在 javascript 中减慢我的 spritesheet 动画?

Posted

技术标签:

【中文标题】如何在 javascript 中减慢我的 spritesheet 动画?【英文标题】:How can i slow down my spritesheet animation in javascript? 【发布时间】:2016-06-24 06:43:13 【问题描述】:

我做了一个简单的 spritesheet 动画,但是太快了。由于某种原因,它也在闪烁。 我的代码:

<!doctype html>
<html>
    <head>
        <script type="text/javascript" src="raf.js"></script>
        <script>
            var ctx;
            var count = 0;
            var x;
            var y;
            var img = new Image();
            img.src = "images/character.png";
            img.onload = draw;

            function draw() 
                requestAnimationFrame(draw)

                ctx.clearRect(0,0,450,586);

                x = (count % 16) * 450;
                y = Math.floor(count / 16) * 586;
                ctx.drawImage(img, x, y, 450, 586, 0, 0, 450, 586);

                if(count == 16)
                    count = 0;
                 else 
                    count++;
                
            

            function init() 
                ctx = document.getElementById("canvas").getContext("2d");
            

        </script>
    </head>
    <body onload = "init()">
        <canvas id="canvas"  >
        </canvas>
    </body>
</html>

有没有办法解决这个问题?

【问题讨论】:

requestAnimationFrame 以监视器刷新速度运行(或尝试运行)回调。控制动画速度的标准解决方案是将值更改绑定到时间,而不是屏幕更新。 @VallyN 但是我该怎么做呢?我已经尝试过 setInterval 和 setTimeout 之类的方法,但到目前为止我还没有让它们工作。 不不不。只是让计数增长不像现在那么快。将count++ 替换为count+=.1 并亲自查看。 @VallyN 我用 count+=.1 替换了 count++,但现在我的 spritesheet 只是从右向左滚动了一段时间,然后就消失了。很奇怪。它现在也一直在闪烁。 x = (count % 16) * 450:将16乘以450并与宽度进行比较。 【参考方案1】:

基本上,您需要限制动画帧速率。

        var ctx;
        var count = 0;
        var x;
        var y;
        var img = new Image();
        img.src = "images/character.png";
        img.onload = draw;

        var time = Date.now();
        var delay = 100;

        function draw() 
            requestAnimationFrame(draw)

            ctx.clearRect(0,0,450,586);

            x = (count % 16) * 450;
            y = Math.floor(count / 16) * 586;
            ctx.drawImage(img, x, y, 450, 586, 0, 0, 450, 586);

            if(Date.now() - time >= delay)
                if(count == 16)
                    count = 0;
                 else 
                    count++;
                
                if ((Date.now() - time - delay) > delay)
                    time = Date.now();
                 else 
                    time += delay;
                
            
        

        function init() 
            ctx = document.getElementById("canvas").getContext("2d");
        

delay 是以毫秒为单位的帧延迟(例如 100,意味着 ~10 fps),time 用于跟踪当前帧显示的时间。

闪烁问题可能与精灵表中缺少精灵有关。

【讨论】:

【参考方案2】:

您可以使用 SpriteAnimJS 完成上述操作,它可以配置为使用 WebGL 和画布作为后备。

要使用它运行 spritesheet,根据它的演示:

var mySpriteAnimation = new SpriteAnim(canvasIdHere,useOnlyCanvasBoolean)
mySpriteAnimation.start(
            frameWidth: 100,
            frameHeight: 100,
            image: image_element, // must be preloaded
            fps: 10,
            className: 'class_name',
            loop: true,
            onStart: function() ,
            onComplete: function() 
        );

正如您在设置中看到的,您可以轻松设置 FPS,无需自己计算。

库+演示here

【讨论】:

以上是关于如何在 javascript 中减慢我的 spritesheet 动画?的主要内容,如果未能解决你的问题,请参考以下文章

如何在调用我的 api 之前减慢/​​等待?

故意减慢 HTML/PHP 页面加载以进行测试

稳步减慢从 javascript 对 WCF 服务的 ajax 调用

Android - 如何减慢电池消耗

使用SPRY框架,提升Web开发效率

如何减慢 GNU Radio 中的文件源?