в импортированном объекте потомок дочернего фрагмента ролика имеет значение null сразу после создания - PullRequest
1 голос
/ 16 декабря 2010

У меня есть мувиклип во Flash, который имеет подобъект типа кнопки, который имеет подобъект для ввода текста и видеоклипов.Сразу после создания ядра Moveclip все подобъекты устанавливаются в нуль, когда я ожидаю, что они будут действительными объектами.

// hierarchy:

// core:MC_Core_design
    // button_1:B_Mybutton
        // text_name   // dynamic text with instance name
        // mc_icon     // movie clip with instance name

var core:MC_Core_design = new MC_Core_design();
addChild(core);
core.button_1.text_name.text = "hello world"; // error: text_name is null
core.button_1.mc_icon.visible = false; // error: mc_icon is null

MC_Core_design был создан во Flash и экспортирован в Actionscript.Я сделал это для класса button_1.Код был написан с использованием Flex.

Когда я закомментирую обе строки, которые приводят к ошибке, я получаю правильное представление основного видеоклипа со всем подобъектом.

Как я могу установить свойства подобъекта сразу послесоздание объекта?

Ответы [ 2 ]

1 голос
/ 16 декабря 2010

Вам нужно прослушивать Event.INIT из класса, когда он создается. (Если вы не встраиваете символ с использованием метатега Embed, Flash инициализирует загруженный мувиклип за несколько миллисекунд). Это не является проблемой, если Flash IDE swf / swc не содержит ни одного сценария действий)

Проблема в том, что иногда это может быть очень быстрым, поэтому он запускает событие INIT, прежде чем вы получите возможность присоединить прослушиватель событий к объекту. поэтому вы не можете просто прикрепить его после создания экземпляра объекта.

Обходной путь - встроить swf в виде байтового массива, а затем использовать класс загрузчика для загрузки встроенных байтов (это позволяет установить прослушиватель событий перед вызовом load).

, например

[Embed(source="assets.swf", mimeType="application/octet-stream")]
private var assetBytes:Class;

private var clip:MovieClip;
private var loader:Loader;

public function LoadBytesExample()
{
    loader = new Loader();
    loader.contentLoaderInfo.addEventListener(Event.INIT, onAssetLoaded);
    loader.loadBytes(new assetBytes());
}

 private function onAssetLoaded(e:Event):void
 {
     var loader:Loader = (e.currentTarget as LoaderInfo).loader;
     (e.currentTarget as LoaderInfo).removeEventListener(Event.INIT, onAssetLoaded);

      clip = loader.content as MovieClip;
      this.addChild(clip);

      clip.someTextField.text = "HELLO WORLD";
   }

Извините за форматирование, только что написал это с моей головы

И синтаксис для встраивания символа (вам не нужно загружать его через загрузчик, так как скрипт действия во внешнем swf / swc удаляется).

[Embed(source="assets.swf", symbol="somesymbol")]
private var assetSymbol:Class;

private var clip:MovieClip;

public function LoadSymbolExample()
{
   clip = new assetSymbol();
   clip.sometext.text = "Hello World";
}
0 голосов
/ 16 декабря 2010

Если я правильно понял, button_1:B_Mybutton еще не инициализирован.

Я имею в виду что-то вроде: button_1:B_Mybutton = new B_Mybutton();

О двух других переменных text_name & mc_icon , как вы описываете, если они уже были инициализированы (как вы называете их как имена экземпляров), думаю, они не должны вызывать у вас никаких проблем .

Также я предполагаю, что вы устанавливаете модификаторы доступа для всех как общедоступные.

Если у вас все еще есть проблема ... Пожалуйста, поделитесь, как определены все необходимые переменные. Достаточно только соответствующей части.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...