代码之家  ›  专栏  ›  技术社区  ›  H.D.S.

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

  •  1
  • H.D.S.  · 技术社区  · 9 年前

    我是这里的新成员,但过去在这里发现了一些非常有用的信息,无法找到解决当前问题的方法。我一直在尝试将我的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多个按钮,当我单击每个按钮时,它将在舞台上的相同位置(容器mc)加载一个外部swf,并隐藏之前加载的swf,每个swf将使用相同的预加载程序(preloader_anim)。我已经包含了在最终清除了一些其他错误之后我所遇到的当前错误。如果有人能帮助我,或者给我一个我还没能找到的在线例子,我将非常感激。我发现了一些用as3加载外部swf的例子,但不是用同一个预加载程序加载多个。我对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 回复  |  直到 9 年前
        1
  •  1
  •   BadFeelingAboutThis    9 年前

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

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

      &

      错误1180:调用可能未定义的方法preloader_mc。

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

      如果您的库中有一个名为 预加载程序 ,这还不够,你需要去它的属性并选择 export for actionscript ,然后给它一个类名(类名可以与库资产名称相同,因此: 预加载程序 ).

      不过要确保你没有;不要有任何与类名冲突的变量或函数名(当前的情况是 预加载程序 ). 通常的做法是使所有类名以大写字母开头,所有函数和变量以小写字母开头。

    2.

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

    在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);
    
    1. 错误1061:通过静态类型flash的引用调用可能未定义的方法loadClip。display:Loader。

      没有调用的方法 loadClip 在Loader类上。您需要以下内容(开始加载)

      imgLoader.load(new URLRequest("yoururlhere"));
      

    有关如何正确使用 装载机 类,请阅读 documentation .


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

    //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();
    }