Flash CS5 + AS3时间线导航

时间:2011-02-17 22:29:45

标签: flash actionscript-3 actionscript mouseevent flash-cs5

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

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

所以有两个问题。 1. Am I doing this right? 2. Why doesn't MouseEvent work when the code is in the .as file?

Form.fla - 第1帧代码片段

var form:Form = new Form();
addChild(form);

Form.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();
        }
    }
}

2 个答案:

答案 0 :(得分:1)

您必须使用 setter 函数将主时间轴的引用传递给Form类

var form:Form = new Form();
form.mainTimeline = this;
addChild(form);

在您的Form类中(不是片段,类是正确的术语),添加以下函数和变量:

private var _mainTimeline:Object;

public function set mainTimeline(mtl:Object):void
{
    _mainTimeline = mtl;
}

然后在你的前进/后退功能中将prevFrame()和nextFrame()更改为:

_mainTimeline.prevFrame();
_mainTimeline.nextFrame();

有几种方法可以实现您想要实现的目标,这意味着更改部分的方法。你的方式是一种方法。可能有一些更好的方法,但你的方法不是明显错误或任何东西。 :)

答案 1 :(得分:0)

更好更清晰的方法是使用Document类。通过使Form类充当时间轴本身,Document Class将不再需要将时间轴引用传递给Form类。

这是你如何做到的。在fla文件中取消选择您选择的任何对象,然后查看属性工具栏。在“发布”标题下,您将看到一个可编辑的文本字段,旁边写着“Class:”。为你的fla输入相对于你的类的路径,在这种情况下,这只是类名,因为你没有定义包。所以只需在那里输入“Form”。文档类总是必须扩展DisplayObjectContainer,其中包括MovieClip和Sprite,因此您已经编写的Form类应该可以正常工作。

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