使用类文件as3预加载外部.swf

时间:2011-03-19 07:57:42

标签: actionscript-3 class flash external preloader

所以我正在尝试使用此代码创建一个外部预加载器来加载我的主.swf(loading.swf)文件,该文件有一个名为mainLoading.as的类文件:

var l:Loader = new Loader();
l.contentLoaderInfo.addEventListener(ProgressEvent.PROGRESS, loop);
l.contentLoaderInfo.addEventListener(Event.COMPLETE, done);
l.load(new URLRequest("loading.swf"));
var loadingPage:loading = new loading;

function loop (e:ProgressEvent):void{
    addChild(loadingPage);
    loadingPage.x = stage.stageWidth/2;
    loadingPage.y = stage.stageHeight/2;

}

function done (e:Event):void{
    removeChild(loadingPage);
    addChild(l);
}

所以我收到一条错误消息:

TypeError:错误#1009:无法访问空对象引用的属性或方法。 在mainLoading()

我想我收到了错误消息,因为我正在访问mainLoading()类文件中的阶段。我尝试将其添加到我的类文件中的构造函数中,但它不起作用:

public function mainLoading () {
    addEventListener(Event.ADDED_TO_STAGE, init);   
}
private function init(e:Event): void {
    initStartUpScene ();

}

我的initStartUpScene函数只是将引导场景抛出到loading.swf

有什么建议吗?

感谢您的帮助。

4 个答案:

答案 0 :(得分:0)

(问题)是mainLoading延伸到Sprite还是Movieclip

修改

阅读完评论后,我建议您尝试这样做:

在完整进度处理程序的swf内容中添加函数调用:

function done (e:Event):void{
    removeChild(loadingPage);
    addChild(l);
    Object(l.content).initMethod();
}

content允许您访问已加载的.swf主类中的方法(例如mainLoading)

并通过以下方式替换mainLoading中的事件处理:

public function mainLoading () {
    //no event handling in constructor
}

public function initMethod():void {
    //here you go
    init();
}

public function init():void { ... //No more event here

顺便说一句,这不是解决问题的最简洁方法。

答案 1 :(得分:0)

如果这是你得到的确切消息,那么是的,添加ADDED_TO_STAGE监听器应该已修复它。 如果对其进行任何更改,请记得重新编译“loading.swf”(我似乎总是忘记这一步)

“loading.swf”在运行它时是否运行正常而没有任何错误(不将其加载到“容器”SWF中)?

答案 2 :(得分:0)

这可能与您提出的问题无关,但您可能会通过构建代码来获得更好的结果并避免一些错误:

var loadingPage:loading = new loading;
addChild(loadingPage);
loadingPage.x = stage.stageWidth/2;
loadingPage.y = stage.stageHeight/2;

var l:Loader = new Loader();
l.contentLoaderInfo.addEventListener(ProgressEvent.PROGRESS, onProgress);
l.contentLoaderInfo.addEventListener(Event.COMPLETE, onComplete);
l.load(new URLRequest("loading.swf"));

//I renamed this function since I believe "loop" is a reserved keyword.
function onProgress (e:ProgressEvent):void{
    //No code needed
}

function onComplete (e:Event):void{
    removeChild(loadingPage);
    addChild(l);
}

如果你不需要它,你可以删除“onProgress”功能。

答案 3 :(得分:0)

OOOOOOKKKKK,所以经过大约一个星期的承认失败后,再次尝试,重写几乎一半的代码,试图说服自己预装有人被高估了,我终于把它想出来了(请滚鼓):

在调用构造函数方法之前,我有一个引用正在调用的阶段的变量。像这样:

private var xScrollPosRight:Number = stage.stageWidth - xScrollPosLeft;

我刚刚将stage.stageWidth更改为750并且有效。

生活和学习。