首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >AddChild与GetChildByName

AddChild与GetChildByName
EN

Stack Overflow用户
提问于 2015-03-17 13:10:19
回答 1查看 271关注 0票数 0

我已经尝试过在谷歌上搜索这个了,但我似乎找不到我要找的东西(我偶然发现了这个,http://ub4.underblob.com/as3-naming-elements-dynamically/,但它不适合我)。

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

就像这样:

代码语言:javascript
复制
var bullet:Bullet = new Bullet(x, y, "right");

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

stageBackground.addChild(bullet);

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

调试面板告诉我,这一行的问题是:

代码语言:javascript
复制
stageBackground.addChild(bullet);

但我似乎搞不清到底是怎么回事。我尝试过将stageBackground重命名为雪碧,但这并没有改变任何事情。我知道MovieClip返回是存在的--当我通过文档类中几乎相同的代码引用它时,它工作得非常完美。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-03-17 17:44:07

您在这里访问stage以找到您的容器,这很可能是问题所在。

您可能认为stage属性指的是Adobe创作环境中的“stage”。那是胡说。

如果您将一个MovieClip放在Flash中的“stage”上,它将结束在主时间线上,然而,这并不是stage属性所引用的内容。stage是显示列表中最顶端的DisplayObjectContainer。它只存在于运行时。它或多或少代表了FlashPlayer窗口,这是执行.swf文件的运行时环境。

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

也不使用根.

如您所见,您的代码将依赖于应用程序的显示列表结构。您已经很难找到您正在寻找的容器。如果更改结构,则代码会中断。即使更改容器的名称(例如,更改为“背景”)也会造成严重破坏。

相反,请使用.

你在另一个班,你想开一枪。所以你创造的子弹和现在的一样:

代码语言:javascript
复制
var bullet:Bullet = new Bullet(x, y, "right");

接下来,分派一个Event,通知您的代码的其余部分已经创建了一个项目,并且应该将它放在适当的容器中:

代码语言:javascript
复制
dispatchEvent(new BulletEvent(BulletEvent.CREATED, bullet));

(为BulletEvent对象创建扩展Event的自定义事件类Bullet和getter )

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

代码语言:javascript
复制
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);
}

此代码将放置在back MovieClip的父代码中。Flash在后台自动创建与实例名称相同的变量。这就是为什么变量back在这里可用的原因。

在这里使用事件可以让您在代码中按字面意思将子弹发射到代码中,由其他人来处理它,在那里很容易找到它所属的容器。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29099966

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档