.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_one
and 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);