1

欢迎,

我创建了简单的 FLA 项目(AIR 3.6 for iOS -来源):

var k1:kloc1 = new kloc1();
var k2:kloc2 = new kloc2();

k1.x = 0;
k1.y = 0;
k2.x = 150;
k2.y = 150;

addChild(k1);
addChild(k2); 
trace("k2 name main timeline: " + k2.name);  
trace("k2 demo_tekst before: " +  MovieClip(root).k2.demo_tekst);  
k2.demo_tekst = 'podmieniony tekst';  
trace("k2 demo_tekst after: " +  MovieClip(root).k2.demo_tekst);  

kloc2 在库中,继承自 MovieClip,仅包含 demo_tekst 变量:

var demo_tekst:String = "oryginalny tekst";

并且 kloc1 也在库中,继承自 MovieClip 并且仅包含侦听器和跟踪指令:

addEventListener(MouseEvent.CLICK, onClick);
function onClick(e:MouseEvent):void {
    trace("k2 name from k1 obj: " + MovieClip(root).k2.name);
    trace(MovieClip(root).k2.demo_tekst);
}

当我测试上面的代码时,通过单击 k1,控制台上的结果是:

k2 name main timeline: instance3
k2 demo_tekst before: null
k2 demo_tekst after: podmieniony tekst
k2 name from k1 obj: instance3
oryginalny tekst

正如我所料,最终结果是“oryginalny tekst”,而不是“podmieniony tekst”。同样在创建 k2 对象之后,通过 new(),demo_tekst 为空(?!)。我在调试模式下检查它,k2 在创建时和跟踪结果期间具有相同的实例。两个地方的对象名称相同。有人可以解释一下发生了什么吗?

4

1 回答 1

1

k2 名称主时间线:instance3

这对于动态创建的对象是预期的。您需要在创建实例时为其命名,否则它会为您生成一个。由于这是舞台上的第三个对象,因此它成为“instance3”。

解决方案:

var k2:kloc2 = new kloc2();
k2.name = "myK2";
trace("My k2.name = " + k2.name);  // My k2.name = myK2

k2 demo_tekst 之前:空

编写MovieClip(root)简单的数据类型根作为 MovieClip 对象(它已经是)。您可以通过编写来简化这一点:

root.k2.demo_tekst

但是,虽然您的根对象(又名 MainTimeline)上可能有一个名为“k2”的属性,但您没有该名称的 DisplayList 对象。DisplayList和对象的属性是两个截然不同的东西。在您的情况下,root 上有一个名为“k2”的属性指向您的 MovieClip,但 name 属性留空,因此其自动名称为“instance3”。

这个看似方便的指针的原因是因为默认情况下 Flash IDE启用了“自动声明阶段实例”。看到您已创建库对象,指向您的 MovieClip 的属性已自动在根目录中创建。

如果您在运行时手动创建了对象,这不是一个选项。通常,您需要手动声明这些以使用 dot.notation 语法。

k2.name = "k2";
root.addChild(k2);
root[k2.name] = k2;

相反,您可以使用root.getChildByName("k2")并放弃在根对象中创建指针。在许多情况下,这将是正确的做法,虽然有点麻烦。


k2 demo_tekst 之后:podmieniony tekst

如果您来自 Flash IDE 和 AS2,您可能习惯于直接在每个从属对象的时间轴上创建 ActionScript。不要在 AS3 中这样做。

我相信demo_tekst变量没有被初始化是因为 MovieClip 没有被播放,所以k2.demo_tekst直到你通过写入在你的 MovieClip 对象之外动态创建它之前没有初始化因为k2.demo_tekst = 'podmieniony tekst'; MovieClip 是动态的,你可以在没有冲突的情况下生成这些变量(不是这样与 Sprite 或 Shape 等非动态对象)。

考虑完全动态地创建您的 MovieClip,如下所示:

var k1:MovieClip = new MovieClip();
k1.name = "kloc1";
k1.demo_text = "replacement text";
addChild(k1);
trace(k1.name + ".demo_text = " + k1.demo_text);
// outputs:  kloc1.demo_text = replacement text

来自 k1 obj 的 k2 名称:instance3

原始测试

第一行是预期的(因为您从未命名 k2 对象),但这是时间线代码中操作顺序变得有趣的地方(强烈建议不要这样做)。在将影片剪辑作为 MainTimeline 的父级后,最终运行您的子影片剪辑的时间线内的代码,然后覆盖内部属性demo_tekst

我希望这可以澄清事情。同样,如果您想保持简单,我强烈建议您将所有代码编写在一个文档中。您可以在第一帧上执行此操作,或者将其写入外部并include在您的时间轴中。

如果您准备好超越基础知识,请考虑创建自己的类对象导入它们。这使您能够在自定义对象上创建复杂的属性和函数(这似乎是您的初衷)。

于 2013-03-26T15:16:29.247 回答