编程于.as
除了时间线之外的文件并没有太大不同。如果您正在使用文档类(在 Actionscript 设置面板中找到),您可能会觉得类特定编程的突然变化有点令人畏惧。为了更平滑的过渡,您可以简单地将当前的时间线代码转储到新的时间线中code.as
文件(按原样),然后只需将以下行放入时间线中即可:
include "code.as";
这实际上只是复制/粘贴代码并运行它,除了现在您可以使用适当的代码编辑器(例如崇高的文字 http://www.sublimetext.com/)。此外,由于它不是一个新类,因此您在那里编写的代码与您的时间线具有相同的范围。
2).函数只能访问其创建的名称空间(这可能就是您的文档类抛出“访问未定义属性”错误的原因)。您始终可以通过以下方式传递对对象(以及扩展其名称空间)的引用函数参数 http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/statements.html#function.
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 是 MovieClip显示对象容器 http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/flash/display/DisplayObjectContainer.html有 3 个子元素,每个子元素都有 name 属性,我们可以使用它们来寻址对象。在 Flash IDE 中,我们标记这些“实例”,并且由于 IDE 在标有“自动声明阶段实例”的 Actionscript 设置面板中启用的内部魔法,它们会自动成为父对象的属性。
这意味着,要更改文本txt
,我们可以写PSD_one.txt.text = "foo"
。如果没有此设置,您将需要使用容器方法,例如root http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/flash/display/DisplayObject.html#root.
getChildByName("PSD_one") http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/flash/display/DisplayObjectContainer.html#getChildByName%28%29.
getChildAt(2) http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/flash/display/DisplayObjectContainer.html#getChildAt%28%29。直接跟注txt.text = "foo"
永远不会工作,因为当前范围内没有称为该属性的属性(即,this.txt
是隐含的)。
3). gotoAndStop http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/flash/display/MovieClip.html#gotoAndStop%28%29是一个控制时间线帧的 MovieClip 方法。如果你真的想彻底摆脱旧的做事方式,你应该放弃使用框架。
有两种方法可以显示这些 PSD。
方法一:您可以使用 Flash IDE 在舞台上实例化 PSD,并为每个 PSD 指定一个唯一的名称,然后您可以在代码中引用该名称。假设上面的布局,您可以简单地将每个 PSD 移出屏幕(例如使用PSD_two.x = this.loaderInfo.width
),当您想“转到”下一个“帧”时,请将它们交换到屏幕中央。
方法二:您已按照习惯将 PSD 导入到库中,但不实例化它们。相反,您直接跳到代码中,当有人单击按钮时h
要去fl_ClickToGohome
,您的函数选择库对象并手动实例化它,并将其父级设置为舞台添加子对象() http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/flash/display/DisplayObjectContainer.html#addChild%28%29.
function fl_ClickToGohome(e:MouseEvent):void {
var psd:PSD_one = new PSD_one();
addChild(psd);
}
如果您要开始动态加载资源,这种方法会更可取。当然,而不是已经创建了PSD_one
类在你的库中,你只需使用网址加载器() http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/flash/net/URLLoader.html or Loader() http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/flash/display/Loader.html,并且您需要保存压缩图像,而不是完整的 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
我提到的方法,您可以像在时间线代码中一样省略这些。它们表示属性/方法是否可以从类的“外部”访问。如果您刚刚开始,请将所有内容保留为公开。当您准备好解决它时,您可以稍后再担心内存优化。
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
, and parent
事实上,直到它被养育为止null
。这些是类可以从自身内部引用以连接到MainTimeline
并访问其上的对象。
相反,如果您愿意,可以从构造函数参数将对阶段的引用传递给类,如下所示:
var foo:MySprite = new MySprite(stage);