欢迎,
我创建了简单的FLA项目(AIR 3.6 for iOS - sources):
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 varabile:
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”,正如我所料。同样在creatin k2对象之后,通过new(),demo_tekst为null(?!)。我在调试模式下检查它,并且k2在创建时具有相同的实例,并且在跟踪结果期间。两个地方的对象名称相同。 有人可以解释一下发生了什么吗?
答案 0 :(得分:1)
k2名称主要时间轴:instance3
这适用于动态创建的对象。您需要在创建实例时为其指定名称,否则它将为您生成一个名称。由于这是舞台上的第3个对象,因此它变为“instance3”。
解决方案:
var k2:kloc2 = new kloc2();
k2.name = "myK2";
trace("My k2.name = " + k2.name); // My k2.name = myK2
k2 demo_tekst before:null
写MovieClip(root)
只是将根数据类型化为MovieClip对象(它已经是)。您可以通过编写以下内容来简化:
root.k2.demo_tekst
但是,虽然您的根对象(a.k.a.MainTimeline)上可能有一个名为“k2”的属性,但您没有该名称的DisplayList对象。 DisplayList和对象上的属性是两个截然不同的东西。在你的情况下,root上有一个名为“k2”的属性,它指向你的MovieClip,但是name属性是空的,所以它的自动名称是“instance3”。
这个看似方便的指针的原因是因为默认情况下Flash IDE启用了“Automatically declare stage instances”。看到您已创建库对象,指向您的MovieClip的属性已自动在root中创建。
如果您在运行时手动创建了对象,则不能选择此选项。通常,您需要手动声明这些以使用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
1}}
因为MovieClip是动态的,所以你可以产生这些变量而不会产生冲突(不像Sprite或Shape这样的非动态对象)。
考虑完全动态创建MovieClip,如下所示:
k2.demo_tekst = 'podmieniony tekst';
k2名称:instance3
oryginalny tekst
第一行是预期的(因为你从未命名过k2对象),但这是时间轴代码中操作顺序变得有趣的地方(强烈建议不要这样做)。将movieclip作为MainTimeline的父级后,最终会运行子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
。
我希望这能澄清事情。同样,如果您想让事情变得简单,我强烈恳请您将所有代码写在一个文档中。您可以在第一帧上执行此操作,也可以将其写在外部并在时间轴中include
。
如果您已准备好超越基础知识,请考虑创建自己的class objects和importing them。这使您能够在自定义对象上创建复杂的属性和功能(这似乎是您的原始意图)。