AddChild与GetChildByName

时间:2015-03-17 13:10:20

标签: actionscript-3

在这里完成AS3菜鸟 - 我已经尝试了谷歌搜索,但我似乎无法找到我正在寻找的东西(我偶然发现了这一点,http://ub4.underblob.com/as3-naming-elements-dynamically/,但它并不适用于我)。

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

这样的事情:

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

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

stageBackground.addChild(bullet);

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

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

stageBackground.addChild(bullet);

但我似乎无法弄清楚它有什么问题。我已经尝试将stageBackground重新制作为精灵,但这并没有改变任何东西。我知道MovieClip后面存在 - 当我通过文档类中几乎相同的代码引用它时,它运行得很好。

1 个答案:

答案 0 :(得分:1)

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

您可能认为stage属性指的是"舞台"在Adobe Flash创作环境中。 那不是真的。

如果您将电影剪辑放在"舞台上"在Flash IDE中,它最终在主时间线上,但这不是stage属性引用的东西。 stage是显示列表中最顶层的DisplayObjectContainer。它仅存在于运行时。它或多或少代表FlashPlayer窗口,即执行.swf文件的运行时环境。

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

也不要使用root。

如您所见,您的代码依赖于显示列表 你的申请结构。你已经在努力寻找 你正在寻找的容器。如果更改结构,则代码会中断。即使更改容器的名称(例如更改为" background")也会造成严重破坏。

请使用事件。

你在另一个班级,你想发射一颗子弹。 因此,您可以像现在一样创建该子弹:

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

接下来,发送Event以通知代码的其余部分已创建项目符号并将其放在适当的容器中:

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

(使用适当的BulletEvent对象的setter和getter创建扩展Event的自定义事件类Bullet

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

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在此可用的原因。

在这里使用事件可以让你在其他人处理代码时将子弹发射到你的代码中,在那里很容易找出它所属的容器。