我已经尝试过在谷歌上搜索这个了,但我似乎找不到我要找的东西(我偶然发现了这个,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返回是存在的--当我通过文档类中几乎相同的代码引用它时,它工作得非常完美。
发布于 2015-03-17 17:44:07
您在这里访问stage以找到您的容器,这很可能是问题所在。
您可能认为stage属性指的是Adobe创作环境中的“stage”。那是胡说。
如果您将一个MovieClip放在Flash中的“stage”上,它将结束在主时间线上,然而,这并不是stage属性所引用的内容。stage是显示列表中最顶端的DisplayObjectContainer。它只存在于运行时。它或多或少代表了FlashPlayer窗口,这是执行.swf文件的运行时环境。
简而言之:你只是在错误的地方寻找你的背部MovieClip。表示主时间线的容器的属性是root。
也不使用根.
如您所见,您的代码将依赖于应用程序的显示列表结构。您已经很难找到您正在寻找的容器。如果更改结构,则代码会中断。即使更改容器的名称(例如,更改为“背景”)也会造成严重破坏。
相反,请使用.。
你在另一个班,你想开一枪。所以你创造的子弹和现在的一样:
var bullet:Bullet = new Bullet(x, y, "right");接下来,分派一个Event,通知您的代码的其余部分已经创建了一个项目,并且应该将它放在适当的容器中:
dispatchEvent(new BulletEvent(BulletEvent.CREATED, bullet));(为BulletEvent对象创建扩展Event的自定义事件类Bullet和getter )
在创建符号的类的对象上注册一个侦听器,您将捕获此事件并将其放置在容器中:
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在这里可用的原因。
在这里使用事件可以让您在代码中按字面意思将子弹发射到代码中,由其他人来处理它,在那里很容易找到它所属的容器。
https://stackoverflow.com/questions/29099966
复制相似问题