ActionScript 3.0 學習(十四) 從加載的.swf文件中讀取flash庫中的as鏈接的類

        /**  直接將flash庫中的元件放到.swf中加載,會使.swf文件的體積變大。一般對於項目中用的較多的加載,
*   比如對所有角色的運動動畫的加載,可以將動作位圖放在falsh庫中,並做好as鏈接,然後生成.swf文件。
*   此時, 即可從加載的.swf文件中讀取flash庫中的as鏈接的類 ,並實例化出對象,加載到舞臺上。具體代碼如下(本代碼段中還包含Vector的排序用法):

* */

package
{
	import flash.display.Bitmap;
	import flash.display.BitmapData;
	import flash.display.DisplayObject;
	import flash.display.Loader;
	import flash.display.LoaderInfo;
	import flash.display.Sprite;
	import flash.events.Event;
	import flash.events.EventDispatcher;
	import flash.net.URLRequest;
	import flash.utils.ByteArray;
	import flash.utils.Endian;


	public class ParseSwfLibraryUtil
	{
		public static var LOAD_COMPLETE:String = "load_complete";
		
		public static var _asLinkNameArr:Vector.<String> = new Vector.<String>;
		
		public static var bitmapArray:Vector.<Bitmap> = new Vector.<Bitmap>;
		
		private static var _dispatcher:EventDispatcher = new EventDispatcher();
		
		public function ParseSwfLibraryUtil()
		{
		}
		
		public static function parseSwf(swfName:String):void
		{
			var swfLoader:Loader = new Loader();
			var url:URLRequest = new URLRequest(swfName);
			
			swfLoader.load(url);
			swfLoader.contentLoaderInfo.addEventListener(Event.COMPLETE, onLoadComplete);
		}
		
		public static function onLoadComplete(event:Event):void
		{
			(event.target as LoaderInfo).removeEventListener(Event.COMPLETE, onLoadComplete);
			
			var bytes:ByteArray = LoaderInfo(event.target).bytes;
			
			bytes.endian=Endian.LITTLE_ENDIAN;
			
			bytes.position=Math.ceil(((bytes[8]>>>3)*4+5)/8)+12;
			
			while(bytes.bytesAvailable > 2){
				
				var head:int=bytes.readUnsignedShort();
				
				var size:int=head&63;
				
				if (size==63)size=bytes.readInt();
				
				if (head>>6!=76)bytes.position+=size;
					
				else {
					
					head=bytes.readShort();
					
					for(var i:int=0;i<head;i++){
						
						bytes.readShort();
						
						size=bytes.position;
						
						while(bytes.readByte()!=0)
						{}
						
						size=bytes.position-(bytes.position=size);
						
						var nameString:String = bytes.readUTFBytes(size);
						trace(nameString);
						if(nameString.indexOf("_") != -1)
							_asLinkNameArr.push(nameString);
					}
				}
			}
			
			_asLinkNameArr.sort(sortArray);
			
			var index:int = 0;
			var Bitmap1:Class;
			var data:BitmapData;
			while(index  < (_asLinkNameArr.length - 1))
			{
				Bitmap1 = (event.target as LoaderInfo).applicationDomain.getDefinition(_asLinkNameArr[index]) as Class;
				data = (new Bitmap1()) as BitmapData;
				bitmapArray.push(new Bitmap(data));
				index ++;
			}
			
			dispatcher.dispatchEvent(new Event(LOAD_COMPLETE));
		}
		
		public static function addListener(cmd:String, func:Function):void
		{
			dispatcher.addEventListener(cmd, func);
		}
		
		public static function removeListener(cmd:String, func:Function):void
		{
			dispatcher.removeEventListener(cmd, func);
		}
		
		public static function get dispatcher():EventDispatcher
		{
			return _dispatcher;
		}
		
		public static function sortArray(str1:String, str2:String):Number
		{
			var num1:int = (str1.split("_"))[1];
			var num2:int = (str2.split("_"))[1];
			return sortAccordingToNum(num1, num2);
		}
		
		public static function sortAccordingToNum(x:int, y:int):Number
		{
			if (x < y)
			{
				return -1;
			}
			else if (x > y)
			{
				return 1;
			}
			else
			{
				return 0;
			}
		}
	}
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章