从库中动态创建的对象之间访问变量

时间:2013-03-26 11:16:10

标签: actionscript-3 flash air

欢迎,

我创建了简单的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在创建时具有相同的实例,并且在跟踪结果期间。两个地方的对象名称相同。 有人可以解释一下发生了什么吗?

1 个答案:

答案 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';

来自k1 obj的

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 objectsimporting them。这使您能够在自定义对象上创建复杂的属性和功能(这似乎是您的原始意图)。