2011-12-18 5 views
0

私は動的にmp3、xml、png、fnt、ttfファイルを(ディレクトリをスキャンして)ロードしようとしています - 基本的には実行時にEmbedタグをシミュレートしようとしています。あるいは、それを別の方法で置くこともできます - 同期ファイルシステムオブジェクトを持つこと。AIR3ディレクトリをメモリにロード

これらの異なるファイルタイプをすべて実行する良い方法はありますか?

ここには動作しない例があります。

public class FileSystemAssets 
{ 
    public var assets : Object = new Object(); 

    public static function sanitize(filename : String): String 
    { 
     return filename.replace(/[.\/\\\:]/g, '_'); 
    } 

    private function loadDirectory(dir : File): void 
    { 
     for each (var f : File in dir.getDirectoryListing()) 
     { 
      if (f.isDirectory) 
       loadDirectory(f) 
      else if (!f.isSymbolicLink && !f.isPackage) 
       loadFile(f); 
     } 
    } 

    private function loadFile(file : File): void 
    { 
     if (".mp3.xml.png.swf.fnt.ttf".indexOf(file.extension) == 0) 
      return; 
     // 
     // how to do this part properly??? 
     // 
     var ldr : Loader = new Loader(); 
     var fs : FileStream = new FileStream(); 
     fs.open(file, FileMode.READ); 
     var bytes : ByteArray = new ByteArray(); 
     fs.readBytes(bytes); 
     ldr.loadBytes(bytes); 

     // assets[ sanitize(file.nativePath) ] = ldr.content; 
     // content should be probably converted 
    } 

    public function getAsset(filename : String): Object 
    { 
     if(assets[ sanitize(filename) ] == undefined) 
      return null; 
     return assets[ sanitize(filename) ]; 
    } 

    public function reload(rootDir : String): void 
    { 
     assets = new Object(); // clear old stuff 
     var root : File = new File(rootDir); 
     loadDirectory(root); 
    } 
} 

その他の注意:この場合セキュリティ/メモリ/スピードは問題になりません。ロードされたすべてのデータは、信頼できるものとみなされ、メモリに収まるほど小さいとみなすことができます。

答えて

0

これは十分に機能します。私は頻繁にそれを変更しないように手動で他のファイルを含める。

public class FileSystemAssets 
{ 
    private var assets : Object = new Object(); 

    public function FileSystemAssets() { 
    } 

    public static function sanitize(filename : String): String { 
     return filename.replace(/[.\/\\\:]/g, '_'); 
    }   

    private function loadDirectory(dir : File): void { 
     for each (var f : File in dir.getDirectoryListing()) 
     { 
      if (f.isDirectory) 
       loadDirectory(f) 
      else if (!f.isSymbolicLink && !f.isPackage) 
       loadFile(f); 
     } 
    } 

    private function loadFile(file : File): void { 
     if (".mp3.png.xml.".indexOf(file.extension) < 0) 
      return; 
     var relativePath : String = file.nativePath.replace(Constants.DataDir, ""); 
     var name : String = sanitize(relativePath); 

     function onLoaded(e : Event) : void { 
      if (file.extension == "xml") { 
       assets[ name ] = XML(e.target.data); 
      } else { 
       assets[ name ] = e.target.data; 
      } 
     } 

     function onMP3Loaded(e : Event): void { 
      assets[ name ] = e.target; 
     } 

     function onPNGLoaded(e : Event): void { 
      var bitmap : Bitmap = e.target.content; 
      assets[ name ] = Texture.fromBitmapData(bitmap.bitmapData); 
     } 

     var req : URLRequest = new URLRequest(file.url); 

     if (file.extension == "png") { 
      var pngldr : Loader = new Loader(); 
      pngldr.contentLoaderInfo.addEventListener(Event.COMPLETE, onPNGLoaded); 
      pngldr.load(req); 
     } else if (file.extension == "mp3") { 
      var mp3ldr : Sound = new Sound(); 
      mp3ldr.addEventListener(Event.COMPLETE, onMP3Loaded); 
      mp3ldr.load(req); 
     } else { 
      var ldr : URLLoader = new URLLoader(); 
      ldr.addEventListener(Event.COMPLETE, onLoaded); 
      ldr.dataFormat = URLLoaderDataFormat.BINARY; 
      ldr.load(req); 
     } 
    } 

    public function reload(): void { 
     var root : File = new File(Constants.DataDir); 
     loadDirectory(root); 
    } 

    public function getAsset(name : String): Object { 
     if (assets[ name ] == undefined) 
      return null; 
     return assets[ name ]; 
    } 
} 
関連する問題