Flash 闪存CS5+;AS3时间轴导航

Flash 闪存CS5+;AS3时间轴导航,flash,actionscript-3,actionscript,mouseevent,flash-cs5,Flash,Actionscript 3,Actionscript,Mouseevent,Flash Cs5,CS5和AS3新手,所以如果我犯了一个根本性的错误,请毫不犹豫地纠正我 我试图构建一个相当长且复杂的表单。因此,这将需要通过它的不同部分进行导航。我不熟悉Flash和AS3,所以我开始做一些原型设计,并有两个按钮在时间轴上向前和向后导航。我现在的问题是,当我试图将它从“代码片段”(正确的术语?)区域带到我的主ActionScript文件中时。按钮出现,但按下它们不会执行MouseeEvent 所以有两个问题。 1。我这样做对吗? 2。当代码位于.as文件中时,MouseEvent为什么不工作?

CS5和AS3新手,所以如果我犯了一个根本性的错误,请毫不犹豫地纠正我

我试图构建一个相当长且复杂的表单。因此,这将需要通过它的不同部分进行导航。我不熟悉Flash和AS3,所以我开始做一些原型设计,并有两个按钮在时间轴上向前和向后导航。我现在的问题是,当我试图将它从“代码片段”(正确的术语?)区域带到我的主ActionScript文件中时。按钮出现,但按下它们不会执行MouseeEvent

所以有两个问题。
1。我这样做对吗?
2。当代码位于.as文件中时,MouseEvent为什么不工作?

Form.fla-第1帧代码段

var form:Form = new Form();
addChild(form);
表格A.as

package  
{
    import flash.display.MovieClip;
    import fl.controls.Button;
    import flash.events.MouseEvent;

    public class Form extends MovieClip 
    {
        private var nextButton:Button;
        private var prevButton:Button;

        public function Form() 
        {
            setupNavigation();
        }

        private function setupNavigation():void
        {
            nextButton = new Button();
            nextButton.label = "Next";
            // ... size and position code
            nextButton.addEventListener(MouseEvent.CLICK, moveForward);

            prevButton = new Button();
            prevButton.label = "Previous";
            // ... size and position code
            prevButton.addEventListener(MouseEvent.CLICK, moveBackward);

            addChild(nextButton);
            addChild(prevButton);
        }

        // Setup Mouse events
        private function moveForward(event:MouseEvent):void
        {
            nextFrame();
        }

        private function moveBackward(event:MouseEvent):void
        {
            prevFrame();
        }
    }
}

您必须使用setter函数将主时间线的引用传递给表单类

var form:Form = new Form();
form.mainTimeline = this;
addChild(form);
在表单类(不是代码段,类是正确的术语)中,添加以下函数和变量:

private var _mainTimeline:Object;

public function set mainTimeline(mtl:Object):void
{
    _mainTimeline = mtl;
}
然后在向前/向后移动函数中,将prevFrame()和nextFrame()更改为:


有几种方法可以实现您想要实现的目标,也就是改变部分的方法。你的方法就是一种方法。也许有一些更好的方法,但您的方法并没有明显的错误或任何东西。:)

更好更干净的方法是使用文档类。文档类通过使表单类充当时间线本身,将不再需要向表单类传递时间线引用

这是你要怎么做的。在fla文件中,取消选择已选择的任何对象,然后查看“属性”工具栏。在“Publish”标题下,您将看到一个可编辑的文本字段,旁边写着“Class:”。输入fla的类相对路径,在本例中,该路径仅为类名,因为没有定义包。所以只要在里面输入“表单”。文档类始终必须扩展DisplayObjectContainer,其中包括MovieClip和Sprite,因此您已经编写的表单类应该可以完美地工作


完成后,您可以像在问题中那样调用nextFrame()和prevFrame(),它应该可以正常工作。

您可以将
\u main timeline
属性键入MovieClip而不是Object,并对
mtl
参数执行相同的操作。Taurayi是正确的,这将更加具体和正确。
_mainTimeline.prevFrame();
_mainTimeline.nextFrame();