为什么DisplayObject的child的.name属性和getChildByName()的结果有时会有所不同?

时间:2008-09-22 03:57:19

标签: flash actionscript-3

有人可以解释显示对象的“name”属性与 getChildByName(“XXX”)函数找到的值之间的区别吗?它们在90%的情况下是相同的,直到它们不存在,并且事情就会崩溃。

例如,在下面的代码中,我只通过直接检查子名称属性,通过实例名称找到一个对象; getChildByName()失败。

var gfx:MovieClip = new a_Character(); //(a library object exported for Actionscript)

var do1:DisplayObject = null;
var do2:DisplayObject = null;

for( var i:int = 0 ; i < gfx.amSword.numChildren ; i++ )
{
    var child:DisplayObject = gfx.amSword.getChildAt(i);
    if( child.name == "amWeaponExchange" )  //An instance name set in the IDE
    {
        do2 = child;
    }
}

trace("do2:", do2 );

var do1:DisplayObject = gfx.amSword.getChildByName("amWeaponExchange");

生成以下输出:

do2: [object MovieClip]
ReferenceError: Error #1069: Property amWeaponExchange not found on builtin.as$0.MethodClosure and there is no default value.

Flash正在思考什么想法?

5 个答案:

答案 0 :(得分:4)

好像你自己解决了!

使用:

var do1:DisplayObject = gfx.amSword.getChildByName["amWeaponExchange"];

您收到错误:

ReferenceError: Error #1069: Property amWeaponExchange not found on builtin.as$0.MethodClosure and there is no default value.

因为编译器正在实际的getChildByName 方法上寻找属性“amWeaponExchange”。

将其更改为:

var do1:DisplayObject = gfx.amSword.getChildByName("amWeaponExchange");

正如您在编辑中所做的那样,它成功找到了孩子并进行了编译。

答案 1 :(得分:0)

我还没有真正理解你在做什么。但我发现有一件事是在第一帧中访问MovieClip的孩子有点不可靠。例如,你不能gotoAndStop()然后访问那个框架上的孩子,你必须等待一个框架才能使用它们。

答案 2 :(得分:0)

在一个地方你循环通过gfx.amSword和另一个egfx.amSword - 你错过了e。 ?

此外,这不是问题的原因,但是类名应该以大写字母开头而不包括下划线。 “a_Character”应该只是“Character”。

答案 3 :(得分:0)

哎呀,你对e,Iain是正确的,但这不是问题,我从代码中删除了e以专注于问题,但没有抓住那个。

我想我应该发布一个更清楚的失败例子。有趣的类名称只是我对Flash IDE自动生成的类的个人命名约定,其中包含“export for Actionscript”,但它使问题混乱。

答案 4 :(得分:-1)

我误解了第一个答案。

这可能与“Flash IDE发布”设置有关:“ActionScript 3.0设置”对话框中的“自动声明阶段实例”。