AS2到AS3的转换,使用相同的预加载器

时间:2015-08-12 16:23:40

标签: actionscript-3 actionscript-2

我是这里的新成员,但过去在这里找到了一些非常有用的信息,但找不到我当前问题的修复方法。我一直在尝试将我的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加载外部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 个答案:

答案 0 :(得分:1)

让我们按照你的错误顺序解决这个问题。

  1.   

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

    &安培;

      

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

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

    的类

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

    尽管如此,请确保您没有任何与您的类名冲突的变量或函数名称(目前这是preloader_mc的情况)。通常的做法是使所有类名以大写字母开头,所有函数和变量都以小写字母开头。

  2. 2

      

    错误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);
    
    1.   

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

      Loader类中没有名为loadClip的方法。你想要的是以下(开始加载)

      imgLoader.load(new URLRequest("yoururlhere"));
      
    2. 有关如何正确使用Loader课程的详细信息,请阅读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();
      }