AddChild 与 GetChildByName

AddChild with GetChildByName

完整的 AS3 菜鸟在这里 - 我试过用谷歌搜索这个,但我似乎找不到我要找的东西(我偶然发现了这个,http://ub4.underblob.com/as3-naming-elements-dynamically/,但它并不适合为我工作)。

我正在尝试通过外部 AS3 在另一个 Movieclip 中动态添加 Movieclip class

像这样:

var bullet:Bullet = new Bullet(x, y, "right");

var stageBackground:MovieClip = (stage.getChildByName("back") as MovieClip);

stageBackground.addChild(bullet);

然而,虽然编译正确,但在 运行 时,我收到错误 #1009 - 无法访问 属性 或空对象引用的方法。

调试面板告诉我问题出在这一行:

stageBackground.addChild(bullet);

但我似乎无法弄清楚它有什么问题。我试过将 stageBackground 重铸为 Sprite,但这并没有改变任何东西。我知道 MovieClip 背后存在 - 当我通过我的文档中几乎相同的代码引用它时 class,它工作得很好。

您正在访问 stage 此处以查找您的容器,这很可能是问题所在。

您可能认为 stage 属性 是指 Adob​​e Flash 创作环境中的 "the stage"。 这不是真的。

如果您在 Flash IDE 中将 MovieClip 放在 "the stage" 上,它最终会出现在主时间线上,但是,这不是 stage 属性 正在引用。 stage 是显示列表中最上面的 DisplayObjectContainer。它只存在于运行时。它或多或少代表 FlashPlayer window,执行 .swf 文件的运行时环境。

简而言之:您只是在错误的地方寻找您的背 MovieClip。 代表主时间线的容器属性是root.

也不要使用 root。

如您所见,您的代码变得依赖于显示列表 你的应用程序的结构。你已经在努力寻找 您正在寻找的容器。如果您更改结构,您的代码就会中断。即使更改容器的名称(例如 "background" 之类的名称)也会造成严重破坏。

改为使用事件。

你在另一个 class 中,你想发射子弹。 所以你像现在一样创建子弹:

var bullet:Bullet = new Bullet(x, y, "right");

接下来,调度一个 Event 以通知您的其余代码已创建项目符号并且应将其放置在适当的容器中:

dispatchEvent(new BulletEvent(BulletEvent.CREATED, bullet));

(创建一个扩展 Event 的自定义事件 class BulletEvent,为 Bullet 对象使用适当的 setter 和 getter )

在创建子弹的 class 对象上注册一个侦听器,您将捕获此事件并将子弹放入容器中:

var object:YourClass = new YourClass();
object.addEventListener(BulletEvent.CREATED, addBulletToContainer);

function addBulletToContainer(e:BulletEvent):void
{
    // adding the bullet to the container
    back.addChild(e.bullet);
}

此代码将放在您的父级后面MovieClip。 Flash IDE 在后台自动创建与实例名称同名的变量。这就是变量 back 在这里可用的原因。

在这里使用事件可以让您真正将子弹发射到您的代码中,而其他人则负责处理它,这样很容易找出它所属的容器。