addFrameScript在Document Class中工作,在时间轴上完全崩溃了吗?

时间:2011-02-20 13:44:54

标签: actionscript-3

我有一个问题,我将以下测试编写为一个类:

package 
{
    import flash.display.MovieClip;
    import flash.display.FrameLabel;

    public class FrameLabels extends MovieClip
    {
        public function FrameLabels ()
        {
            var labelsList:Array = currentLabels;

            for (var i:int = 0; i < currentLabels.length; i++)
            {
                if (currentLabels[i].name == "monday")
                {
                    addFrameScript (currentLabels[i].frame-1, mondayHandler);
                }
                if (currentLabels[i].name == "tuesday")
                {
                    addFrameScript (currentLabels[i].frame-1, tuesdayHandler);
                }
                if (currentLabels[i].name == "wednesday")
                {
                    addFrameScript (currentLabels[i].frame-1, wednesdayHandler);
                }
            }
        }

        private function mondayHandler():void
        {
            trace("at monday at frame " + currentFrame);
        }
        private function tuesdayHandler():void
        {
            trace("at tuesday! at frame " + currentFrame);
        }
        private function wednesdayHandler():void
        {
            trace("at wednesday! at frame " + currentFrame);
        }




    }
}

我有框架标签: 星期一 星期二 星期三

这在文档类中很有用,但是,当我把它放在我的时间轴的第1帧时,它会崩溃Flash。

我在最后一帧上有停止操作,因此播放头不应该一遍又一遍地运行脚本,是否有任何原因导致崩溃?

时间轴代码:

var labelsList:Array = currentLabels;

for (var i:int = 0; i < currentLabels.length; i++)
{
    if (currentLabels[i].name == "monday")
    {
        addFrameScript (currentLabels[i].frame-1, mondayHandler);
    }
    if (currentLabels[i].name == "tuesday")
    {
        addFrameScript (currentLabels[i].frame-1, tuesdayHandler);
    }
    if (currentLabels[i].name == "wednesday")
    {
        addFrameScript (currentLabels[i].frame-1, wednesdayHandler);
    }
}


function mondayHandler ():void
{
    trace ("at monday at frame " + currentFrame);
}
function tuesdayHandler ():void
{
    trace ("at tuesday! at frame " + currentFrame);
}
function wednesdayHandler ():void
{
    trace ("at wednesday! at frame " + currentFrame);
}

2 个答案:

答案 0 :(得分:1)

由于SWF电影是专为流媒体设计的,因此第1帧的代码将在第1帧加载后立即执行。如果影片的其余部分尚未完成加载,则会有一个很好的更改:currentLabels属性或您要分配处理程序脚本的帧尚未设置(null),这将导致播放器崩溃。 / p>

您必须确保仅在SWF完全加载时才执行脚本。通过属性面板将影片中的所有内容导出到第1帧(因此在加载第1帧后加载所有内容),或者(更好)创建预加载器循环以检查bytesLoaded / bytesTotal。

这适用于文档类,因为在文档SWF完成加载后调用构造函数。

答案 1 :(得分:0)

我接受了你并试图模仿你的问题(仅使用时间轴代码)

我找到了什么:

  • 第1层第1帧上的代码
  • 星期一在第2层第1帧,星期二在第2层第11帧,星期三在第2层第21帧
  • 第1层第21帧
  • stop()

对我来说没有错误,但我确实发现星期三的处理程序在触发stop()之前运行。我建议你在处理程序之后加一个stop(),这样timline就不会在第一时间出现了。让我知道我还能做些什么来帮助你。