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();
}
}
}
答案 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(),它应该可以正常工作。