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;
			}
		}
	}
}


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