我遇到问题,从时间轴代码切换到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");
感谢您的时间
答案 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设置面板中标记为"自动声明阶段实例"而启用了内部魔术,它们会自动成为父对象的属性。
这意味着,要更改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视为文件夹结构。
你可以写
C:/Users/Me
在DisplayList中看起来更像是
C.Users.Me
当然,我们没有名为C
的根位置,您的对象可能称为PSD_one
和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);