2016-10-01 121 views
1

我想让西蒙说游戏。我有一个函数遍历数组数组。每个数字都与一个动作相关联(所以适当的按钮动画)。当序列只有1个值时,这个工作正常,但是他们都只是一次玩。我已经找到了在迭代之间加入延迟的方法,但是对于包含if/else语句的循环没有任何发现。延迟在for循环中有if/else语句的迭代

我想一个解决方案,我发现here

function show_sequence() { 
    var k = right_seq.length; 

    //assign each button a number 
    //when the loop goes over it that button's animation plays 
    (function animation(i) { 
      setTimeout(function() { 
      if (i == 1) { 
       setTimeout(function() { 
        TweenMax.from("#pink", 0.6, {opacity:0.3, scale:0.8, ease:Elastic.easeOut}); 
        one.play(); 
       }, 1000); 
      } else if (i == 2) { 
       setTimeout(function() { 
        TweenMax.from("#blue", 0.6, {opacity:0.3, scale:0.8, ease:Elastic.easeOut}); 
        two.play(); 
       }, 1000); 
      } else if (i == 3) { 
       setTimeout(function() { 
        TweenMax.from("#yellow", 0.6, {opacity:0.3, scale:0.8, ease:Elastic.easeOut}); 
        three.play(); 
       }, 1000); 
      } else { 
       setTimeout(function() { 
        TweenMax.from("#green", 0.6, {opacity:0.3, scale:0.8, ease:Elastic.easeOut}); 
        four.play(); 
       }, 1000); 
      }; //end for loop 
      if (--i) { 
       animation(i); 
      } 
     }, 200); 
})(k); 
} 

和它的作品,因为它增加了动画和声音之间的延迟,但它并没有以正确的顺序播放。例如,如果数组为[3,4,1,2],则不会将动画放置在这些按钮上,但是按[4,3,2,1]顺序排列,并且它不能运行超过4轮。

这是fiddle但游戏没有完成,所以我不知道它是否会有所帮助。按下小绿圈开始/继续添加回合。

+0

一个更好的办法可能是使用['动画()'](http://api.jquery.com/ animate /)和它的“完成”回调。 – DelightedD0D

回答

0

这是一个快速修复。你可以做很多事情来改善它,但是这会让你超越当前的障碍。

问题是你根本没有使用你的序列。你传递给show_sequence的数字只是数组的长度 - 你正在递减(这是4,3,2,1来自哪里)。你从来没有真正得到键索引你的顺序排列的

function show_sequence() { 
    var k = right_seq.length; 

    //assign each button a number 
    //when the loop goes over it that button's animation plays 
    (function animation(i) { 
    if (i >= right_seq.length) { 
     return; 
    } 
    setTimeout(function() { 
     if (right_seq[i] == 1) { 
     setTimeout(function() { 
      TweenMax.from("#pink", 0.6, { 
      opacity: 0.3, 
      scale: 0.8, 
      ease: Elastic.easeOut 
      }); 
      one.play(); 
     }, 1000); 
     } else if (right_seq[i] == 2) { 
     setTimeout(function() { 
      TweenMax.from("#blue", 0.6, { 
      opacity: 0.3, 
      scale: 0.8, 
      ease: Elastic.easeOut 
      }); 
      two.play(); 
     }, 1000); 
     } else if (right_seq[i] == 3) { 
     setTimeout(function() { 
      TweenMax.from("#yellow", 0.6, { 
      opacity: 0.3, 
      scale: 0.8, 
      ease: Elastic.easeOut 
      }); 
      three.play(); 
     }, 1000); 
     } else { 
     setTimeout(function() { 
      TweenMax.from("#green", 0.6, { 
      opacity: 0.3, 
      scale: 0.8, 
      ease: Elastic.easeOut 
      }); 
      four.play(); 
     }, 1000); 
     }; //end for loop 
     animation(++i); 
    }, 200); 
    })(0); 
} 
+0

谢谢,这个修好了! –

+0

@ l-emi你应该看看@ trincot的回答。这可能接近你想要去的地方。特别是因为你可以折叠大部分show_sequence函数来使用一个只包含这样的事物的数组:'[{button:'pink',sound:one},{button:'blue',sound:two} .. 。]'而不是'if(i == 1).. if(i == 2)..'结构 – Tibrogargan

2

而不是使用所有这些计时器,利用该方法staggerFrom,这将做延迟你的。若要从right_seq阵列系列producesd,该数组转换为元素名称的列表:

function show_sequence() { 
    var k = right_seq.length; 
    var circles = right_seq.map(function (num) { 
     return ['#pink','#blue','#yellow','#green'][num-1]; 
    }); 
    // this will apply the animation in sequence 
    TweenMax.staggerFrom(circles, 0.6, {opacity:0.3, scale:0.8, ease:Elastic.easeOut}, 0.6); 
} 

既然你都这样了,你可能需要检查动画本身,因为这种方法将设置所有受影响的元素立即到他们的初始样式,但在“交错”延迟执行动画。

如果不奏效,使用onComplete财产实现你的循环:

function show_sequence() { 
    var circles = right_seq.map(function (num) { 
     return ['#pink','#blue','#yellow','#green'][num-1]; 
    }); 
    (function loop(i) { 
     if (i>=circles.length) return; 
     TweenMax.from(circles[i], 0.6, { 
      opacity:0.3, scale:0.8, ease:Elastic.easeOut, 
      onComplete: loop.bind(this,i+1) 
     }); 
    })(0); 
} 
+0

谢谢你,这看起来更干净,我会给它去一个 –

+0

我添加了第二个选项if在CSS样式方面,第一种解决方案无法为您解决问题。 – trincot