我正在做一个 Flash 项目,其中我有一个带有一堆艺术资产的 swf。但是,它们不在舞台上,只是在库中,并链接到我编写的代码。
我有一个想要实例化的类,但是在构造它时我不断收到一个引用错误。
这是 swf/fla 库的设置方式
[MovieClip]ButtonPopup, Linkage:com.packagename.ButtonPopup
[MovieClip]popup_btn, Linkage: none
popup_btn 是 Popup 的子代,在 Flash CS5.5 IDE 中恰当地命名为 _popup_btn(带有由 Flash Builder 生成的名为 popup_btn 的 getter)。这是弹出类:
package com.packagename.ButtonPopup {
public class ButtonPopup extends Popup {
public Popup() {
addClickListeners(popup_btn);
}
protected function get popup_btn():MovieClip {
return this["_popup_btn"];
}
}
}
package com.packagename.Popup {
public class Popup extends MovieClip {
public Popup() {
}
protected function addClickListeners(mc:MovieClip) {
//add click listeners
}
}
}
我的主要 swf 看起来像这样:
public MainClass() {
var loader:Loader = new Loader();
loader.load(new URLRequest("assets.swf"));
loader.contentLoaderInfo.addEventListener(Event.COMPLETE, loadArtComplete);
}
function loadArtComplete (e:Event):void {
var popup_class:Class = e.target.applicationDomain.getDefinition("com.packagename::Popup");
var popup_mc:MovieClip = new popup_class() as MovieClip;
addChild(popup_mc);
}
可悲的是,我收到一条错误消息var popup_mc:MovieClip = new popup_class() as MovieClip
:
ReferenceError: Error #1056: Cannot create property _popup_btn on com.packagename.Popup
at flash.display::Sprite/constructChildren()
at flash.display::Sprite()
at flash.display::MovieClip()
at com.packageName.Popup() [file path]
at com.packageName.MainClass/loadArtComplete() [filepath]
如果我在 Flash IDE 中保留 popup_btn 未命名,我不会收到错误消息,但是我无法引用 MovieClip(用于添加点击侦听器等),所以这是一个不可行的解决方案。
有人对在这里做什么有任何想法吗?我可以不实例化一个“复杂”的影片剪辑,而是必须一个接一个地实例化每个子影片剪辑吗?
编辑:经过更多测试,看起来它与问题类不是直接从 MovieClip 继承,而是从另一个类(从 MovieClip 继承)这一事实有关。我更新了源代码以反映这一点。我仍然不知道是不是这样(如果不是从 MovieClip 继承会导致问题)。但我们会看到的。
谢谢,
-Esa