将组件添加到父SWF后,子SWF中的AS3错误#2007

时间:2015-04-18 17:47:06

标签: actionscript-3 flash

我尝试了很多不同的方法来完成这项工作,但我不知道发生了什么。希望Flash提供更具体的错误信息。

我有一个加载程序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之前,为什么它可以正常工作?

感谢您的帮助。

2 个答案:

答案 0 :(得分:0)

您尝试删除this(包含您的加载程序的classinstance)。 加载后你想删除什么? 请注意,在与AS2和js相反的AS3中,this表示她自己的类 - 而不是事件目标。

答案 1 :(得分:0)

行。您永远不需要添加加载程序本身。只有它的内容。但是你必须将其转换并将其写入本地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();   
}

我在SO-Editor中只编写了它。也许有一些错字错误...... 我希望,这有帮助! 问候安德烈