* 比如對所有角色的運動動畫的加載,可以將動作位圖放在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;
}
}
}
}