ActionScript 3中的.currentFrame

时间:2012-02-20 23:35:11

标签: flash actionscript-3 actionscript

之前我问过一个类似的问题并得到了很好的答案,所以如果这有点令人沮丧,我会道歉。希望它会很快。我正在设计一个交互式Flash教程,试图解释一个复杂的生物学问题,我已经构建了时间轴,因此不超过两帧和四层。我之前在舞台时间轴上设计了它,但它变得如此混乱,并且有一些问题,我决定我必须这样重做。

它由三个主要部分组成 - 一个标题首先在两个片段中淡化,然后是两个按钮(在它们完全淡入之前被禁用),最后是在循环中无限淡入淡出的分子动画。然后页面保持环境直到用户单击其中一个按钮。

我在主时间轴上有四个图层 - 动作,按钮,分子和标题。每个都是相关的图像和动画。

我想对它进行编码,以便每个都依次播放,但我很难通过AS3访问其他时间轴。

目前我在Actions层中有这个:

import flash.events.Event;

NRPSText_mc.addEventListener(Event.ENTER_FRAME, FadeIn);

function FadeIn(event:Event):void
{
    if (MovieClip(this.root).currentFrame > 0) {
        NRPSText_mc.gotoAndPlay("NRPSFadeIn")
    }
}

ColourButton_mc.addEventListener(Event.ENTER_FRAME, BtnFadeIn);

function BtnFadeIn(event:Event):void
{
    if (NRPSText_mc.currentFrame == 30) {
        ColourButton_mc.gotoAndPlay("ButtonPress")
    }
}

从这一点可以清楚地看出,我已经在每个时间轴上标记了某些事件,我希望它们能够完成一个完成。

问题是在每个实例中知道要放在“.currentFrame”之前的内容,而我无法在任何地方找到它!到目前为止,我已经能够使用“this”和“MovieClip(this.root)”,但我需要能够找到如何引用这些嵌入式时间轴以使其工作。我用“跟踪”尝试了这些代码,它似乎运行正常,所以我认为这就是问题所在。

1 个答案:

答案 0 :(得分:3)

首先,如果您在主时间轴而不是MovieClip(this.root).currentFrame上有代码,则可以使用currentFrame,因为您正在引用您设置脚本的对象。

第二,这个

if (MovieClip(this.root).currentFrame > 0) {
    NRPSText_mc.gotoAndPlay("NRPSFadeIn")
}
自从每帧调用后,

只会使NRPSText_mc保持在“NRPSFadeIn”标签。

第三,如果你在舞台上有一个动画片段,并且你已经设置了它的实例名称,你就可以像使用NRPSText_mc.gotoAndPlay("NRPSFadeIn")那样通过该实例名称引用它的时间轴FROM父范围(主时间轴)。如果你有一个脚本INSIDE,那么movieclip只使用gotoAndPlay()currentFrame,因为你和脚本在同一个对象中。

你也这样做有点不对劲。常见的方法是使用时间轴动画或某种补间库,如TweenMax。当您使用Flash IDE时,执行相同操作的正确方法如下:使用您想要的对象的任何动画创建单独的动画片段;把它们放在主时间轴上,它有自己的动画涉及这些剪辑;在您想要控制内部剪辑的任何帧上,使用stop()gotoAndPlay()等设置单独的脚本。

如果您希望在剪辑播放完毕后收到通知,请使用AS3事件。例如,您有一个名为mc的动画片段,将脚本添加到最后一帧dispatchEvent(new Event("stopped!")); stop();和主时间轴

mc.addEventListener("stopped!", listener);
function listener(event:Event):void {
  trace("mc stopped!");
}

这样比每个enterframe事件检查帧号要容易得多。