我在使用嵌套mc
而不循环播放时遇到问题。
在主舞台上,我有mc
,实例名称为smash1_mc
。
在那个mc中,我有另一个实例名为box1_mc
的mc。它有一个简单的补间,在第1帧上有停止操作。我已将标签implode
放在box1_mc
的第2帧上。
当implode
播放头到达第30帧时,我想要发生的是smash1_mc
;所以我在smash1_mc
的动作层中的第30帧上放置了一个关键帧。在该关键帧的actions
面板中,我尝试了一些不同的东西。
//When I use the code below, the it only plays the first frame of the "implode" //label instead of the full timeline of box1_mc
addEventListener(Event.ENTER_FRAME, boxSmash);
function boxSmash(event:Event):void
{
box1_mc.gotoAndPlay("implode");
}
//When I use 'play();' instead of gotoAndPlay("implode"); like this…
addEventListener(Event.ENTER_FRAME, boxSmash);
function boxSmash(event:Event):void
{
box1_mc.play();
}
尽管在最后一帧上执行了box1_mc
操作,但 stop();
完全播放,但它会循环播放。我真的不关心我使用哪种机制,我只是希望帧事件触发box1_mc
完整播放而不用box1_mc
之后独立循环。这似乎很简单。但我不知道出了什么问题。
如果这令人困惑,我可以发送整个.fla
文件。我实际上正在为一个培训项目做一个更大的事情,但我做了这个简单的.fla
来证明我在控制子时间轴的父时间轴上遇到的问题。
答案 0 :(得分:1)
这实际上是一个简单的逻辑。无论你在一个输入框架中输入的代码是什么,都会在每一帧上不断运行,所以如果你要求mc进入第2帧那么那个mc会不断地做什么:转到第2帧。如果不重要的话那个mc有1000帧可以播放,你告诉它去第2帧,那就是它的作用。得到它?
所以第一种情况:box1_mc.gotoAndPlay(" implode");
正确地在每一帧你的mc gotoandplay标签" implode"。这可能不是你想要的,但这就是你要求代码做的事情。
第二种情况:box1_mc.play();
正确的mc做你所问的是:无论如何,只要enterframe运行,你就继续玩。这就是mc的作用。
在这两种情况下,mc都能按照您要求的方式正确播放。既然你知道只要enterframe运行代码就会重复,而mc会执行代码所说的,你应该能找到一种方法来阻止它吗?
编辑:回答你的评论。这取决于你是否真的需要一个enterframe。在示例中,您显示的不是,但这可能仅仅是一个示例。如果您不需要输入框,则不要使用它,只需直接调用您的mc并使其播放即可。如果你确实需要一个enterframe,那么你可以阻止它:
addEventListener(Event.ENTER_FRAME, boxSmash);
function boxSmash(event:Event):void
{
box1_mc.gotoAndPlay("implode");
removeEventListener(Event.ENTER_FRAME, boxSmash);
}
或者你可以检查mc是否已经在播放
function boxSmash(event:Event):void
{
if(!box1_mc.isPlaying)
{
box1_mc.gotoAndPlay("implode");
}
}
或者您可以创建自己的支票:
var mymcisplaying:Boolean;
function boxSmash(event:Event):void
{
if(!mymcisplaying)
{
box1_mc.gotoAndPlay("implode");
mymcisplaying = true;
}
}
甚至有数百种不同的方法可以做到这一点,所以这里只有几个。