2

我遇到了问题,从时间轴代码切换到 OOP/文档类。我设法在时间线上用 AS3 构建了 Fla,没有任何问题。但是在 OOP 上时完全一无所知。

有人告诉我场景不好,我应该坚持将我的场景保存为电影剪辑。

我的情况是这样的:我有 8 页 PSD 文件,我将每个 PSD 导入 Flash Pro,每个 PSD 都有几个按钮和文本输入。第一页是登录页面,第二页是注册页面等。

我的问题是:

1.) 我应该如何保存 PSD?我是否将它们保存为嵌套动画,(给 PSD 上的每个项目一个符号?按钮和文本输入?)然后将该 PSD 保存为 1 个影片剪辑(嵌套动画?)我已经尝试将带有 Flash 图层的 PSD 导入舞台,然后给每个按钮和 Textinput 它们的属性然后将它们保存为嵌套动画,但是我是否从 Class 文档中调用该 Movieclip?或者我是否链接文档类(Main.as)中的所有影片剪辑?

2.) 我如何从 Class 文件中访问 Movieclip,我尝试了 var login:Login = New Login,然后 addChild(login)。这添加了电影剪辑,但没有任何功能起作用,并且错误显示每个按钮名称的未定义属性的访问。

3.) 如果单击 1 个按钮并链接到另一个页面(PSD),我会执行以下操作吗?

h.addEventListener(MouseEvent.CLICK, fl_ClickToGohome);

 function fl_ClickToGohome(event:MouseEvent):void
{
    gotoAndStop("register.as");

谢谢你的时间

4

1 回答 1

1

.as除了时间线之外的文件编程并没有太大的不同。如果您使用的是文档类(可在 Actionscript 设置面板中找到),您可能会觉得类特定编程的突然变化有点太令人生畏了。为了更平滑的过渡,您可以简单地将当前时间线代码转储到一个新code.as文件中(按原样),然后只需在时间线中删除以下行:

include "code.as";

这实际上只是复制/粘贴代码并运行它,除了现在您可以使用适当的代码编辑器(例如Sublime Text)。此外,由于它不是一个新类,因此您在那里编写的代码与您的时间线具有相同的范围。

2)。函数只能访问它们在其中创建的命名空间(这可能是您的文档类抛出“访问未定义属性”错误的原因)。您始终可以通过函数参数传递对对象(以及扩展的名称空间)的引用。

1)。要回答您的第一个问题,您可以创建您的影片剪辑,并按照您想要的任何顺序将它们嵌套到任意深度。重要的是要知道如何导航到该对象。以下面的阶段层次为例:

root:MainTimeline ¬
    0: PSD_one:MovieClip ¬
        0: backgroundImage:Bitmap
        1: button:Sprite
        2: txt:TextField
    1: PSD_two:MovieClip
    2: PSD_three:MovieClip

时间线有 3 个对象,每个对象都有一个从零开始的索引。第一个 PSD 是一个包含 3 个子元素的 MovieClip DisplayObjectContainer,每个子元素都有名称属性,我们可以使用这些属性来寻址对象。在 Flash IDE 中,我们将这些“实例”标记为这些“实例”,并且由于 IDE 在“自动声明舞台实例”标签的 Actionscript 设置面板中启用了内部魔法,它们会自动成为父对象的属性。

魔法酱

这意味着,要更改 上的文本txt,我们可以编写PSD_one.txt.text = "foo"。如果没有此设置,您将需要使用容器方法,例如. 直接调用永远不会起作用,因为在当前范围内没有被调用的属性(即,隐含的)。root.getChildByName("PSD_one").getChildAt(2)txt.text = "foo"this.txt

3)。 gotoAndStop是一种控制时间轴帧的 MovieClip 方法。如果你真的要彻底摆脱旧的做事方式,你应该放弃使用框架。

有两种方法可以显示这些 PSD。

方法 1: 您使用 Flash IDE 在舞台上实例化您的 PSD,并为每个 PSD 指定一个唯一名称,然后您可以在代码中引用该名称。假设上面的布局,您可以简单地将每个 PSD 移出屏幕(例如使用PSD_two.x = this.loaderInfo.width),并在您想要“转到”下一个“帧”时将它们交换到屏幕中心。

方法 2: 您已按照习惯将 PSD 导入库中,但不要实例化它们。相反,您直接跳入您的代码,当有人单击按钮h转到时fl_ClickToGohome,您的函数会选择库对象并手动实例化它,并使用addChild()将其作为父对象。

function fl_ClickToGohome(e:MouseEvent):void {
    var psd:PSD_one = new PSD_one();
    addChild(psd);
}

如果您要开始动态加载资产,这种方法会更可取。当然PSD_one,您只需使用URLLoader()Loader() ,而不是在您的库中创建一个已经创建的类,并且您需要保存压缩图像,而不是完整的 PSD。

我希望这有帮助。我知道我没有直接回答您的问题,但有时问题源于实现方式,而不是特定代码。

-干杯


为了回答你的问题...

1:对象路径

如果您不确定对象的路径是什么,请尝试此功能。这是我在自己的工作中使用的精简版。

function listLayers(obj = null, indent:String = ""):void {
    // If no object was provided, start with the MainTimeline
    if (obj == null) { obj = root; }

    for (var i:int = 0; i < obj.numChildren; i++) {
        // Make a pointer to the object at this index
        var item = obj.getChildAt(i);

        // Get the item type
        var type:String = flash.utils.getQualifiedClassName(item);
        if (type.lastIndexOf("::") != -1) {type = type.split("::")[1];}

        var msg:String = indent + i + ": " + item.name + ":" + type;
        if (type != "TLFTextField" && item.hasOwnProperty("numChildren") && item.numChildren > 0) {
            trace(msg + " ¬");
            listLayers(item, indent + "  ");
        } else {
            trace(msg);
        }
    }   
}

这将以与您在上面看到的格式(使用 PSD)大致相同的格式打印出您的舞台结构。然后,您可以使用getChildByName从根目录到子目录(必须提供完整路径,就像在硬盘驱动器上导航文件夹一样)。

2:公共/私有命名空间

这些只能在专门的课程中使用。如果您使用include我提到的方法,则可以像在时间线代码中一样省略这些。它们表示是否可以从类的“外部”访问属性/方法。如果您刚刚开始,请将所有内容都公开。当您准备好处理它时,您可以稍后担心内存优化。

3:类如何访问按钮?

将 DisplayList 视为文件夹结构的最简单方法。

在此处输入图像描述

你可能会写

C:/Users/Me

DisplayList 中的哪个看起来更像

C.Users.Me

当然,我们没有一个叫做 的根位置C,你的对象很可能叫做PSD_oneand myButton,所以我们可以重写如下......

root.PSD_one.myButton

这是假设您实际上在对象上预定义了这些属性,而动态创建对象时不会发生这种情况。在这些情况下,您可以将命令串在一起,如下所示:

root.getChildByName("PSD_one").getChildByName("myButton")

当您编写一个类时,就像在您的网络上创建一台新计算机一样。该类与您的 MainTimeline 之间没有直接关系。你需要连接它们。

如果您实例化一个 DisplayListObject(例如 Sprite)并将其添加到舞台,则该对象会自动获得一些属性,例如stage, root,并且parent在它成为父对象之前实际上是null。这些是类可以从自身内部引用以连接MainTimeline和访问其上的对象的属性。

相反,如果您愿意,可以将阶段的引用从构造函数参数传递给类,如下所示:

var foo:MySprite = new MySprite(stage);

于 2013-10-28T14:38:56.787 回答