关于AS3资源用zip文件夹打包的用法

网上有一套解析zip压缩包的as3开源代码,不管你看不看得懂,我反正是看不懂,里面是用复杂的2进制加载、2进制解析,它的加载是要比我们自己写的加载器要好的,不管看不看得懂,会用就可以了,简单用法如下:

  author:Thinker

   zip= new ZipArchive();//定义zip加载器
   zip.addEventListener(ZipEvent.PROGRESS, onProgress);//进度事件
   zip.addEventListener(ZipEvent.LOADED, onLoaded);//完成事件       (还是错误事件和初始化事件)
   zip.load("asset.zip");//加载

 

  private function onLoaded(e:ZipEvent):void
  {
   zip.parseLoadedFile(); //解析
   var xmlFile:ZipFile = zip.getFileByName("config.xml");找到XML配置文件
   var xml:XML = new XML(xmlFile.data);   

   trace(xml);//  <example>
                    <pic>sister.jpg</pic>
                  </example>
   
   zip.getAsyncDisplayObject(xml.pic, function (image:DisplayObject):void
   {
    addChild(image);
   }
   );
  }
  
  private function onProgress(e:ZipEvent):void
  {
   trace("loading...");
  }

 

注:配置的资源打包文件是zip格式的压缩包,内含有一张图片(sister.jpg)和配置的xml文件。



直接用解析zip压缩包那套代码用起来不大方便,这里提供一个封装类。用于触发加载器:

package com.extend
{
 import com.riaidea.utils.zip.ZipArchive;
 import com.riaidea.utils.zip.ZipEvent;
 import com.riaidea.utils.zip.ZipFile;
 
 import flash.events.Event;
 import flash.events.EventDispatcher;
 
 
 public class ExtendsControl extends EventDispatcher
 {
  
  static public var _since:ExtendsControl;
  private var zip:ZipArchive;
  private var sourceSum:int;
  private var loadedSource:int;
  
  private var UI:Object=new Object();
  
  public function ExtendsControl()
  {
   _since=this;
   
  }

public function loadSource(Url:String="source/UIStandard.zip"):void{
   zip=new ZipArchive();
   handleEvents(zip, true);
   zip.load(Url);
  }
  
  private function handleEvents(zip:ZipArchive, add:Boolean):void
  {
   if (add)
   {
    zip.addEventListener(ZipEvent.PROGRESS, onProgress);
    zip.addEventListener(ZipEvent.LOADED, onLoaded);
    zip.addEventListener(ZipEvent.INIT, onInit);
    zip.addEventListener(ZipEvent.ERROR, onError);
   }else
   {
    zip.removeEventListener(ZipEvent.PROGRESS, onProgress);
    zip.removeEventListener(ZipEvent.LOADED, onLoaded);
    zip.removeEventListener(ZipEvent.INIT, onInit);
    zip.removeEventListener(ZipEvent.ERROR, onError);
   }
  }
  
  private function onInit(evt:ZipEvent):void
  {
   handleEvents(evt.target as ZipArchive, false); 
   
   var xmlFile:ZipFile = zip.getFileByName("uiConfig.xml");
   var xml:XML = new XML(xmlFile.data);
   ergodic(UI,xml.children())
   
  }

private function ergodic(itemUI:Object,xml:XMLList):void{
   for each(var itemXml:XML in xml){
    if(itemXml.children().length()){
     itemUI[itemXml.name()]=new Object();
     itemUI[itemXml.name()].name=itemXml.name();
     ergodic(itemUI[itemXml.name()],itemXml.children())
    }else{
     sourceSum++
      itemUI.bitmap=itemXml
     
     new GetUI(itemUI,zip,sourceComplete);
     
    }
    
   }
  }
  
  public function sourceComplete():void{
   loadedSource++
   if(loadedSource==sourceSum){
    
    this.dispatchEvent(new Event("complete"));
   }
   
  }
  
  public function parseLoadedFile():void{
   zip.parseLoadedFile();
  }
  
  public function getUI(style:String,type:String):Object{
   return UI[style][type];
  }
  
  private function onProgress(evt:ZipEvent):void
  {
   //trace(evt.message.bytesLoaded, evt.message.bytesTotal);
   trace("loading...");
  }
  
  private function onLoaded(evt:ZipEvent):void
  {
   this.dispatchEvent(new Event("loadComplete"));
  }
  
  private function onError(evt:ZipEvent):void
  {
   //trace(evt);
  }
  
  
 }
}

import flash.display.Bitmap;
 import flash.display.DisplayObject;


 class GetUI{
  
  public function GetUI(obj:Object,zip:Object,completetFunction:Function):void{
   
   zip.getAsyncDisplayObject(obj.bitmap,
    function(img:DisplayObject):void
    {
     obj.bitmap=img
     completetFunction();
    }
   );
  
  }
 
 }

用法:

 

  new ExtendsControl();
   ExtendsControl._since.addEventListener("loadComplete",uiHandly);
   ExtendsControl._since.addEventListener("complete",createButton);
   ExtendsControl._since.loadSource();
   
  }
  private function uiHandly(e:Event):void{
   ExtendsControl._since.parseLoadedFile();
  }
  
  public function createButton(e:Event):void{ 
      var bitmapObject:Object=ExtendsControl._since.getUI(style,"button");
    var upBitmap:Bitmap=new Bitmap((bitmapObject["up"].bitmap as Bitmap).bitmapData.clone());
    var overBitmap:Bitmap=new Bitmap((bitmapObject["over"].bitmap as Bitmap).bitmapData.clone());
    var downBitmap:Bitmap=new Bitmap((bitmapObject["down"].bitmap as Bitmap).bitmapData.clone());
    button=new SimpleButton(upBitmap,overBitmap, downBitmap, upBitmap);  

  }

注:上面的所需要的XML的格式是有规定的

example:

<config>
 <style1>
 <list>
   <rightButton>
    <up>listStyle1_button__right_up.jpg</up>
    <over>listStyle1_button_left_over.jpg</over>
    <down>listStyle1_button_left_over.jpg</down>
   </rightButton>
   
   <leftButton>
    <up>listStyle1_button_left_up.jpg</up>
    <over>listStyle1_button_left_over.jpg</over>
    <down>listStyle1_button_left_over.jpg</down>
   </leftButton>
 </list>

</config>

3层结构。

个人想法:zip加载器的加载方式是2进制,我也不大清楚,但是根据XML获取文件的那个方法,却对文件url进行了第二次加载,可见第一次加载并没有完全加载,而不是直接找到已经加载好的文件,可见对文件比较大的SWF里头有导出的链接类,写起来还不如直接用swf文件打包队列加载,这可能也就是SWF文件打包加载比较普及的原因吧。zip只针对于小文件,所有,小的swf、图片可以直接添加到舞台的,用zip还是非常合适。

(并未得到证实,纯属猜测)

 

posted @ 2011-12-24 18:29  rob_2010  阅读(836)  评论(0)    收藏  举报