如何将类文件中的功能链接到DocumentClass和AS3中的Movieclips?

时间:2013-10-28 07:26:54

标签: actionscript-3 flash actionscript

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

我被告知场景不好,我应该坚持把我的场景保存为Movieclips。

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

我的问题是:

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

2.。)如何从Class文件访问Movieclip,我尝试了var login:Login = New Login,然后是addChild(login)。这会添加movieclip,但没有任何功能可用,并且每个按钮的名称都会出现“未定义属性访问”的错误。

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

h.addEventListener(MouseEvent.CLICK, fl_ClickToGohome);

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

感谢您的时间

1 个答案:

答案 0 :(得分:1)

除时间轴之外的.as个文件中的编程并没有太大差异。如果您正在使用文档类(在“动作脚本设置”面板中找到),您可能会感觉到类特定编程的突然变化有点令人生畏。为了实现更平滑的过渡,您只需将当前时间轴代码转储到新的code.as文件中(原样),只需在时间轴中删除以下行:

include "code.as";

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

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

1)。要回答您的第一个问题,您可以创建动画片段,并按照您想要的任意顺序将它们嵌套。重要的是要了解如何导航到该对象。以下面的阶段heiarchy为例:

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是一个MovieClip DisplayObjectContainer,有3个子元素,每个子元素都有可用于处理对象的名称属性。在Flash IDE中,我们标记这些"实例",并且由于IDE已在Actionscript设置面板中标记为"自动声明阶段实例"而启用了内部魔术,它们会自动成为父对象的属性。

magic sauce

这意味着,要更改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时,您的函数会选择库对象并手动对其进行实例化,并将其父级带到{{3}的舞台上}。

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

如果您要开始动态加载资产,这种方法会更好。当然,您只需使用addChild()URLLoader(),而不是在图书馆中创建已经创建的PSD_one课程,并且您想要保存压缩图像,而不是成熟的PSD。

我希望这会有所帮助。我知道我还没有直接回答你的问题,但有时这个问题源于实施方式,而不是具体的代码。

-Cheers


回答你的问题......

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方法,则会在时间轴代码中省略这些方法。它们表示财产/方法是否可以从外部&#34;外部&#34;班上的。如果您刚刚开始,请将所有内容保留为公开状态。当您准备好解决内存优化时,您可以担心内存优化。

3:班级如何访问按钮?

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

enter image description here

你可以写

C:/Users/Me

在DisplayList中看起来更像是

C.Users.Me

当然,我们没有名为C的根位置,您的对象可能称为PSD_onemyButton,因此我们可以按如下方式重写它。

root.PSD_one.myButton

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

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

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

如果您实例化一个DisplayListObject(例如Sprite)并将其添加到舞台上,该对象会自动获得一些属性,如stagerootparent,直到它为止实际上是父亲null。这些属性是类可以从内部引用以连接到MainTimeline并访问其上的对象。

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

var foo:MySprite = new MySprite(stage);