如何在各种getintervals中纠缠变量时更改变量值?

时间:2013-12-13 22:02:57

标签: javascript jquery

我有一个用于定格动画的小jquery脚本。它使用moment.js来获取时间,然后进行一些数学计算得到一个“帧”数,然后做一些填充以将其与我目录中的文件名匹配,将其吐入img src然后迭代+1。我有两个setInterval函数 - 一个控制帧速率(getframe),另一个控制客户端检查正确时间(gettime)的频率。

我刚刚发现我的目录中有一堆死帧 - 我想跳过的图像文件但我不能删除而不会搞砸我的整个序列,确切地说我想要我的脚本从image-029399.jpg跳到image-031170.jpg。因为客户端可能会在该死区的中间登录,我认为我应该有一些声明,如if(frame> = 29399&&< = 31170; {frame = 31171};)但我可以我不知道怎么把它插入到我的代码中而不会让一切都停止工作......下面是我的代码:

window.onload = $(function () {
    gettime();

    setinterval(gettime,10000);   
    setInterval(getframe,580); 

    var frame;

    function gettime() {
        now = moment().zone('+0045');

        if (now.hour()<=17) {
            now =now.subtract('day',1)
        }

        if (now.hour() >= 18) {
            now = now.subtract('hour', 18).subtract('minute', 30);
        } 
        else {
            now = now.add('hour', 6).subtract('minute', 30);
        }  

        frame = ((now.hour() * 3600) + (now.minute() * 60) + now.second()) * 2 +7463;
    } 


    function getframe() { 
        var framestr = frame? frame.toString() : "";

        function pad (str, max) {
            return str.length < max ? pad("0" + str, max) : str;
        }

        framerun = pad (framestr,6);
        var src = "https://s3.amazonaws.com/combined11/image-"+ framerun +".jpg";
        framerun1=parseInt(framerun);
        $("#frame_placeholder").attr("src", src);

        frame=framerun1 += 1;
    }
});

2 个答案:

答案 0 :(得分:1)

在您设置框架的位置更改它,即gettime。在frame = ...行下方添加此内容:

function gettime() {
    now = moment().zone('+0045');

    if (now.hour()<=17) {
        now =now.subtract('day',1)
    }

    if (now.hour() >= 18) {
        now = now.subtract('hour', 18).subtract('minute', 30);
    } 
    else {
        now = now.add('hour', 6).subtract('minute', 30);
    }  

    frame = ((now.hour() * 3600) + (now.minute() * 60) + now.second()) * 2 +7463;
    if (frame >= 29399) {
       frame += 1771;
    }
}

现在,为什么?

首先你在设置帧的地方改变它,因为这是settor的问题,而不是gettor。当然,由于您每次都要重新计算,因此请确保在重新计算后添加新代码。

起初,我考虑过你做了什么:if (frame >= 29399 && frame <= 31170) frame = 31171;,但这实际上使程序挂在1771帧的同一帧上。

然后我考虑if (frame >= 29399 && frame <= 31170) frame += 1771,但更糟糕的是 - 它会跳到右边的帧,前进到1771帧,然后跳回到第31171帧,这是不可取的。

不,你要做的就是跳过一个间隙,在那个间隙之后的所有帧必须进行相同的跳跃。因此,只要您到达间隙的低端,只需将间隙的距离(31170 - 29399)添加到所有值。

编辑实际上,我对您系统的其余部分了解不足以了解这是否是正确的答案。如果其他因素取决于frame的值,您实际上可能希望在不改变帧的基值的情况下在gettor中进行更改:

function getframe() { 
    var framestr = frame ? (frame >= 29399) ? (frame + 1771).toString() : frame.toString() : "";

根据您在死区中的行为,您可能需要使用我讨论的任何其他功能变体。         var framestr = frame? frame.toString():“”;

答案 1 :(得分:0)

getFrame的顶部看起来最有意义,不是吗?

function getframe() {
    if (frame && ((frame >= 29399) && (frame <= 31170))) {
        frame = 31171;
    }

    var framestr = frame ? frame.toString() : "";
    // etc.