我写了一个小动作,基本上告诉影片剪辑去播放阵列中列出的随机帧。这是代码:
function getRandomLabel(): String {
var labels: Array = new Array("e1", "e2", "e3");
var index: Number = Math.floor(Math.random() * labels.length);
return labels[index];
}
mc.gotoAndStop(getRandomLabel());
我想解决的问题是防止连续两次选择相同的随机帧标签。
答案 0 :(得分:1)
如果你想要做的就是确保没有从列表中选择当前的帧标签,你可以通过简单地过滤出阵列中的当前标签来做到这一点:
function getRandomLabel(currentLabel:String):String {
var labels:Array = ["e1", "e2", "e3"];
var currentIndex:int = labels.indexOf(currentLabel);
if (currentIndex > -1)
labels.splice(currentIndex, 1);
var index:Number = Math.floor(Math.random() * labels.length);
return labels[index];
}
mc.gotoAndStop(getRandomLabel(mc.currentLabel));
事实上,如果您要做的只是转到任何框架标签而不是当前框架标签,您可以使用MovieClip/currentLabels
并将其作为任何可重复使用的功能MovieClip
:
function gotoRandomFrameLabel(mc:MovieClip):void {
var labels:Array = mc.currentLabels.filter(function(frame:FrameLabel, ...args):Boolean {
return frame.name != mc.currentLabel;
});
var index:int = Math.random() * labels.length;
mc.gotoAndStop(labels[index].frame);
}
gotoRandomFrameLabel(mc);
gotoRandomFrameLabel(other_mc);
答案 1 :(得分:0)
我的建议是每n
次getRandomLabel
次调用将数组洗牌,其中n
是labels
数组的长度。随机播放时,请确保最近使用的标签不是数组中的第一项。
// this array can be of any length, and the solution should still work
var labels:Array = ["e1","e2","e3"];
var count:int = labels.length;
labels.sort(randomSort);
function getRandomLabel(): String {
count--;
var randomLabel:String = labels.shift();
labels.push(randomLabel);
// when the counter reaches 0, it's time to reshuffle
if(count == 0)
{
count = labels.length;
labels.sort(randomSort);
// ensure that the next label isn't the same as the current label
if(labels[0] == randomLabel)
{
labels.push(labels.shift());
}
}
return randomLabel;
}
// this function will "shuffle" the array
function randomSort(a:*, b:*):int
{
return Math.random() > .5 ? 1 : -1;
}