我尝试了很多不同的方法来完成这项工作,但我不知道发生了什么。希望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之前,为什么它可以正常工作?
感谢您的帮助。
答案 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中只编写了它。也许有一些错字错误...... 我希望,这有帮助! 问候安德烈