2015-04-18 1 views
0

Я пробовал много разных способов сделать эту работу, но я не знаю, что происходит. Wish Flash предоставил более подробную информацию об ошибках.Ошибка AS3 # 2007 в дочернем SWF после добавления компонентов в родительский SWF

У меня есть SWF загрузчика, который загружает и запускает другой (дочерний) SWF. Все работает идеально, пока я не попытаюсь добавить компоненты в SWF загрузчика (родителя). После добавления компонентов: Когда ребенок SWF загружается и выполняется, многие экранные объекты не загружаются, и я получаю следующее сообщение об ошибке несколько раз:

TypeError: Error #2007: Parameter child must be non-null. 
    at flash.display::DisplayObjectContainer/addChildAt() 
    at fl.controls::BaseButton/drawBackground() 
    at fl.controls::LabelButton/draw() 
    at fl.core::UIComponent/drawNow() 
    at fl.controls::List/drawList() 
    at fl.controls::List/draw() 
    at fl.core::UIComponent/callLaterDispatcher() 

Я думаю, что эта кнопка не становится полностью разрушен, и препятствует код кнопки в дочерней swf.

У меня есть следующий код:

btnStart.addEventListener(MouseEvent.CLICK, start); 

var loader:Loader = new Loader(); 
loader.contentLoaderInfo.addEventListener(Event.COMPLETE, onGameLoadCompletion); 


function onGameLoadCompletion (event:Event):void { 
    loader.contentLoaderInfo.removeEventListener(Event.INIT, onGameLoadCompletion); 
    stage.addChild(loader.content); 
    stage.removeChild(this); 
} 

function start (event:MouseEvent):void { 
    btnStart.removeEventListener(MouseEvent.CLICK, start); 
    loader.load(new URLRequest("childSWF.swf")); 
} 

Существует кнопка на сцене, что было сделано путем перетаскивания компонент кнопки в моей библиотеке, а затем на сцену.

Я также попытался сделать это только с AS код следующим образом:

import fl.controls.Button; 

var btnStart:Button = new Button(); 
stage.addChild(btnStart); 
btnStart.x=670.30; 
btnStart.y=486.35; 
btnStart.setSize(100,22); 
btnStart.label="Continue"; 
btnStart.visible = true; 

btnStart.addEventListener(MouseEvent.CLICK, start); 

var loader:Loader = new Loader(); 
loader.contentLoaderInfo.addEventListener(Event.COMPLETE, onGameLoadCompletion); 


function onGameLoadCompletion (event:Event):void { 
    loader.contentLoaderInfo.removeEventListener(Event.INIT, onGameLoadCompletion); 
    stage.removeChild(btnStart); 
    stage.addChild(loader.content); 
    stage.removeChild(this); 
} 

function start (event:MouseEvent):void { 
    btnStart.removeEventListener(MouseEvent.CLICK, start); 
    loader.load(new URLRequest("childSWF.swf")); 
} 

Где есть кнопка в моей библиотеке, но не на сцене.

Что может быть причиной этой ошибки? Я думаю, возможно, это потому, что у ребенка SWF есть кнопки в нем. Итак, как правильно удалить кнопку в родительском SWF до того, как будет загружен дочерний SWF, чтобы он не влиял на дочерний SWF?

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

Спасибо за помощь.

+0

Я полагаю, проблема не в коде, который вы показываете. Во-первых, ошибка говорит о проблеме в функции addChildAt() - но вы добавляете addChild. Посмотрите на точный номер строки, где возникает ошибка. Во-вторых, попробуйте trace() loader.content - это нормально или нет? –

+0

проблема в том, что она не показывает номера строк, где произошла ошибка! :( То, что я поставил в вопросе, - это вся информация, которую у меня есть. Я бы предпочел не связываться с child.swf, так как это изменение содержания в родительском swf, которое вызывает это. Но я подумаю об изменении содержимого child.swf, если ничего не поделаешь. – CausingUnderflowsEverywhere

ответ

0

Вы пытаетесь удалить this (класс, который содержит ваш загрузчик). Что вы хотите удалить после загрузки. Обратите внимание, что в AS3 в противоположность AS2 и js, this означает, что класс ее сам - не цель события.

+0

removeChild (this) удаляет экземпляры экземпляра родительского объекта, чтобы они удалялись при переходе child.swf. с этим кодом нет никаких проблем. Я не понимаю, что осталось от родителя даже после removeChild (this); Я постараюсь удалить removeChild (this); перед добавлением loader.content – CausingUnderflowsEverywhere

+0

нет, как я и подозревал, это слишком рано. но я считаю, что нашел что-то, прочесывая паутину. – CausingUnderflowsEverywhere

+0

они взяли destroyObject из AS3. Позор ... http://board.flashkit.com/board/showthread.php?702902-F8-HOWTO-Removing-destroying-a-v2-component-that-was-created-in-actionscript I ' m пытаясь их обнулить, посмотрите, не изменилось ли это. http://stackoverflow.com/questions/2023058/destroy-flash-objects-completely – CausingUnderflowsEverywhere

0

OK. Вам никогда не нужно добавлять загрузчик. Только его содержание. Но вы должны бросить его и записать его в локальный var, чтобы обработать его позже. После этого вы можете использовать метод Loader.unloadAndStop() (AFAIK с Flashplayer 11 [?]). И все должно быть хорошо. Попробуйте это:

import fl.controls.Button; 
import flash.display.MovieClip; 

var swfContent:MovieClip; 
initButton(); 

function initButton():void 
{ 
    //you don't need to create your button as a class-var 
    var btnStart:Button = new Button(); 
    btnStart.x = 670.30; 
    btnStart.y = 486.35; 
    btnStart.setSize(100, 22); 
    btnStart.label = "Continue"; 
    btnStart.visible = true;  
    btnStart.addEventListener(MouseEvent.CLICK, start); 
    addChild(btnStart); 
} 

function start(event:MouseEvent):void 
{ 
    var btnStart:Button = event.target as Button; 
    btnStart.removeEventListener(MouseEvent.CLICK, start); 
    var loader:Loader = new Loader(); 
    loader.contentLoaderInfo.addEventListener(Event.COMPLETE, onGameLoadCompletion); 
    loader.load(new URLRequest("childSWF.swf")); 
} 

function onGameLoadCompletion(event:Event):void 
{ 
    var loader:Loader = event.target as Loader; 
    loader.contentLoaderInfo.removeEventListener(Event.INIT, onGameLoadCompletion); 
    swfContent = loader.content as MovieClip; 
    if (!swfContent) 
    { 
     trace("no valid SWF found"); 
     return; 
    }; 
    addChild(swfContent); 

    loader.unloadAndStop(); 
    //do things with your swf, e.g. 
    //swfContent.play(); 
} 

Я закодировал только Hier в SO-редакторе. Возможно, есть небольшие опечатки-ошибки ... Надеюсь, это помогает! Приветствия André

+0

Вы очень любезны, чтобы объяснить это всем мне и написать код! :) – CausingUnderflowsEverywhere

+0

О, человек, используя swfContent.play(), еще хуже. TypeError: Error # 1009: Не удается получить доступ к свойству или методу ссылки на нулевой объект. \t at childswffla :: MainTimeline/frame1() Теперь я ничего не могу сделать, когда загружается childswf. – CausingUnderflowsEverywhere

+0

это так странно. Опять же, как выполняется chld swf, влияет родительский вызов swf. Но на этот раз по-другому! Большое спасибо за помощь. Но мне это больше не нужно, я просто хочу, чтобы я понял, как работает загрузчик, и какие объекты поделились с ним из родительского swf. – CausingUnderflowsEverywhere

Смежные вопросы