Почему свойство .name дочернего объекта DisplayObject и результаты getChildByName() иногда отличаются?

Кто-нибудь может объяснить разницу между свойством "имя" экранного объекта и значением, найденным функцией 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.

Есть идеи, о чем думает Флэш?


person Matt W    schedule 22.09.2008    source источник


Ответы (5)


Кажется, вы исправили это сами!

С участием:

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.

Поскольку компилятор ищет свойство "amWeaponExchange" в фактическом методе getChildByName.

Когда вы измените его на:

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

Как и в вашем редактировании, он успешно находит дочерний элемент и компилируется.

person defmeta    schedule 23.09.2008

Я так и не понял, что ты делаешь. Но я обнаружил, что доступ к дочерним элементам MovieClip в самом первом кадре немного ненадежен. Например, вы не можете перейти к gotoAndStop(), а затем получить доступ ко всем дочерним элементам в этом кадре, вам нужно подождать кадр, прежде чем они станут доступны.

person grapefrukt    schedule 22.09.2008

В одном месте вы зацикливаетесь на gfx.amSword, а в другом, например, на e.gfx.amSword — вам не хватает e. ?

Кроме того, это не причина вашей проблемы, но имена классов должны начинаться с заглавной буквы и не включать символы подчеркивания. «a_Character» должен быть просто «Character».

person Iain    schedule 22.09.2008

Упс, ты прав насчет е, Иэн, но проблема не в этом, я удалил е из кода, чтобы сосредоточиться на проблеме, но не уловил ее.

Я думаю, что я должен опубликовать более четкий пример отказа. Забавное имя класса - это просто мое личное соглашение об именах для классов, автоматически сгенерированных Flash IDE с «экспортом для Actionscript», но это запутывает проблему.

person Matt W    schedule 22.09.2008

Я неправильно понял свой первый ответ.

Это может быть связано с настройкой публикации Flash IDE: «Автоматически объявлять экземпляры сцены» в диалоговом окне «Настройки ActionScript 3.0».??

person defmeta    schedule 22.09.2008