AIR3 загрузка каталога в память - PullRequest
0 голосов
/ 18 декабря 2011

Я пытаюсь динамически загружать файлы mp3, xml, png, fnt, ttf (путем сканирования через каталог) - по сути, пытаюсь симулировать тег Embed во время выполнения.Или, другими словами, наличие синхронного объекта файловой системы.

Есть ли хороший способ сделать все эти разные типы файлов?

Вот нерабочий пример.*

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

Другие примечания: безопасность / память / скорость не имеет значения в этом случае.Все загруженные данные можно считать надежными и достаточно маленькими, чтобы помещаться в память.

1 Ответ

0 голосов
/ 27 декабря 2011

Это работает достаточно близко.Я включаю другие файлы вручную, поскольку они меняются не так часто.

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 ];
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...