关于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还是非常合适。
(并未得到证实,纯属猜测)

浙公网安备 33010602011771号