AS2 到 AS3 转换,使用相同的预加载器加载多个外部 swf



我是这里的新成员,但过去在这里发现了一些非常有用的信息,但无法找到解决我当前问题的方法。我一直试图将我的flash AS2网站重写为AS3,并且受到这些与动作脚本之间所有主要差异的阻碍。我重写了它的大部分(我认为是成功的),但似乎找不到重写这个AS2代码的正确方法:

//AS2 ATTACH PRELOADER
function onLoadStart(target){
    attachMovie("preloader anim", "preloader_mc", 500, {_x:447, _y:290});
}
function onLoadProgress(target, bytes_loaded, bytes_total){
        target.stop();
    target._visible = false;
    preloader_mc.value = bytes_loaded/bytes_total;
}
function onLoadComplete(target){
    trace("complete")
        target.play();
    target._visible = true;
    preloader_mc.removeMovieClip();
}
function onLoadError(target, error_code){
    preloader_mc.removeMovieClip();
    trace(error_code);
}
//AS2 LOAD SWFS WITH ABOVE PRELOADER
var loader_mcl = new MovieClipLoader();
loader_mcl.addListener(this);
skullo_b.onRelease = function(){
    startPreload("load/skullo.swf")
}
fruit_b.onRelease = function(){
    startPreload("load/fruitbat.swf")
}
//...many more swfs left out to save space
function startPreload(url){
loader_mcl.loadClip(url, container_mc);
}

我知道attachmovie不再适用于AS3,所以根据我的研究,我已经将其重写如下,但不断得到其他错误,我在修复上有损失。基本上,我有30多个按钮,当我单击每个按钮时,它将在舞台上的相同位置加载外部swf(容器mc)并隐藏先前加载的swf,每个swf将利用相同的预加载器(preloader_animm)。在最终清除了其他一些错误后,我包含了当前的错误。如果有人能帮我解决这个问题,或者给我指出一个我没能找到的网上例子,我会非常感激。我发现了一些使用as3加载外部swfs的例子,但没有使用相同的预加载器加载多个swfs。我对as3也很陌生,还没有搞混类,所以我所有的代码都在时间轴上,如果这有什么不同的话。

//AS3 ATTACH PRELOADER
//ERROR 1046: Type was not found or was not a compile-time constant: preloader_mc.
//ERROR 1180: Call to a possibly undefined method preloader_mc.
var preloader_anim:preloader_mc = new preloader_mc();
        preloader_anim.x = 458;
        preloader_anim.y = 290;
        addChild(preloader_anim);
function onLoadProgress(target, bytes_loaded, bytes_total){
    target.stop();
    target._visible = false;
    var preloader_mc = bytes_loaded/bytes_total;
}
function onLoadComplete(target){
    trace("complete")
    target.play();
    target._visible = true;
    preloader_mc.removeMovieClip();
}
function onLoadError(target, error_code){
    preloader_mc.removeMovieClip();
    trace(error_code);
}

//AS3 LOAD SWFS WITH ABOVE PRELOADER
var imgLoader:Loader = new Loader();
//ERROR 1061: Call to a possibly undefined method addListener through a reference with static type flash.display:Loader.
imgLoader.addListener(this);
skullo_b.addEventListener(MouseEvent.CLICK, skullo_bClick);
angel_b.addEventListener(MouseEvent.CLICK, angel_bClick);
function skullo_bClick(e:MouseEvent):void {
    startPreload("load/skullo.swf")
}
function metal_bClick(e:MouseEvent):void {
    startPreload("load/metal.swf");
}
function startPreload(url){
//ERROR 1061: Call to a possibly undefined method loadClip through a reference with static type flash.display:Loader.
    imgLoader.loadClip(url, container_mc);
}

让我们按照错误的顺序来检查一遍。

  1. ERROR 1046:类型未找到或不是编译时常量:preloader_mc

    错误:调用一个可能未定义的方法preloader_mc.

    这些错误是因为编译器找不到任何名为preloader_mc的类

    如果你的库中有一个名为preloader_mc的资产,这还不够,你需要去它的属性并选择export for actionscript,然后给它一个类名(类名可以与库资产名称相同,所以:preloader_mc)。

    只是要确保没有任何变量或函数名与类名冲突(这是当前preloader_mc的情况)。通常的做法是使所有类名以大写字母开头,所有函数名和变量名以小写字母开头。

2。

ERROR 1061:通过静态类型flash.display:Loader的引用调用可能未定义的方法addListener .

在AS3中,您想要的是addEventListener。对于Loader类,您需要侦听每个事件,而不是给它一个具有预先设置方法的上下文。它接受一个字符串事件名称和一个回调函数。所以你可能想要这样:

imgLoader.contentLoaderInfo.addEventListener(Event.COMPLETE, imgLoaderComplete);
imgLoader.contentLoaderInfo.addEventListener(ProgressEvent.PROGRESS, progressHandler);
function progressHandler(e:ProgressEvent):void {
    //this function will run whenever progress in the load is made
    trace("progressHandler: bytesLoaded=" + e.bytesLoaded + " bytesTotal=" + e.bytesTotal);
}
function imgLoaderComplete(e:Event):void {
    //this function will be called after the loader finishes loading
}

监听IO_ERROR &加载器上的SECURITY_ERROR事件:

imgLoader.contentLoaderInfo.addEventListener(IOErrorEvent.IO_ERROR, ioErrorHandler);
imgLoader.contentLoaderInfo.addEventListener(SecurityErrorEvent.SECURITY_ERROR, securityErrorHandler);
  • ERROR 1061:通过静态类型flash.display:Loader.

    调用一个可能未定义的方法loadClip

    Loader类中没有名为loadClip的方法。你需要的是下面的内容(开始加载)

    imgLoader.load(new URLRequest("yoururlhere"));
    
  • 关于如何正确使用Loader类的更多细节,请阅读文档。


    所以,最后,它应该看起来像这样:

    //take your preloader movie clip, and export it for actionscript with the class name "Preloader_MC"
    //create vars for the pre loader and loader (don't create the objects yet though)
    var preLoader:Preloader_MC;
    var imgLoader:Loader;
    skullo_b.addEventListener(MouseEvent.CLICK, skullo_bClick);
    angel_b.addEventListener(MouseEvent.CLICK, angel_bClick);
    function skullo_bClick(e:MouseEvent):void {
        startPreload("load/skullo.swf")
    }
    function metal_bClick(e:MouseEvent):void {
        startPreload("load/metal.swf");
    }
    function startPreload(url) {
        //if the loader is currently populated, destroy it's content
        if (imgLoader) {
            imgLoader.unloadAndStop();
            removeChild(imgLoader);
        }else {
            //it doesn't exist yet, so create it and add the listeners
            imgLoader = new Loader();contentLoaderInfo
            imgLoader.contentLoaderInfo.addEventListener(Event.COMPLETE, imgLoaderComplete);
            imgLoader.contentLoaderInfo.addEventListener(ProgressEvent.PROGRESS, progressHandler);
            imgLoader.contentLoaderInfo.addEventListener(IOErrorEvent.IO_ERROR, ioErrorHandler);
            imgLoader.contentLoaderInfo.addEventListener(SecurityErrorEvent.SECURITY_ERROR, securityErrorHandler);
        }
        if (!preLoader) {
            preLoader = new PreloaderMC();
            addChild(preLoader);
        }
        imgLoader.load(new URLRequest(url));
        addChild(imgLoader);
    }
    function removePreLoader():void {
        removeChild(preLoader);
        preLoader = null;
    }
    function progressHandler(e:ProgressEvent):void {
        var percentLoaded:Number = e.bytesLoaded / e.bytesTotal; //number between 0 - 1
        preLoader.value = percentLoaded;
    }
    function imgLoaderComplete(e:Event):void {
        removePreLoader();
    }
    function ioErrorHander(e:IOErrorEvent):void {
        //file not found, do something
        removePreLoader();
    }
    function securityErrorHandler(e:SecurityErrorEvent):void {
        //do something, file wasn't allowed to be loaded
        removePreLoader();
    }
    

    最新更新