UNPKG

starling-framework

Version:

A fast, productive library for 2D cross-platform development.

392 lines (337 loc) 18.6 kB
// ================================================================================================= // // Starling Framework // Copyright Gamua GmbH. All Rights Reserved. // // This program is free software. You can redistribute and/or modify it // in accordance with the terms of the accompanying license agreement. // // ================================================================================================= import Sound from "openfl/media/Sound"; import SoundChannel from "openfl/media/SoundChannel"; import SoundTransform from "openfl/media/SoundTransform"; import ByteArray from "openfl/utils/ByteArray"; import Vector from "openfl/Vector"; import EventDispatcher from "./../events/EventDispatcher"; import BitmapFont from "./../text/BitmapFont"; import Texture from "./../textures/Texture"; import TextureAtlas from "./../textures/TextureAtlas"; import TextureOptions from "./../textures/TextureOptions"; import AssetFactory from "./AssetFactory"; import DataLoader from "./DataLoader"; declare namespace starling.assets { /** Dispatched when all textures have been restored after a context loss. */ // @:meta(Event(name="texturesRestored", type="starling.events.Event")) /** The AssetManager handles loading and accessing a variety of asset types. You can * add assets directly (via the 'add...' methods) or asynchronously via a queue. This allows * you to deal with assets in a unified way, no matter if they are loaded from a file, * directory, URL, or from an embedded object. * * <p>The class can deal with the following media types: * <ul> * <li>Texture, either from Bitmaps or ATF data</li> * <li>Texture atlases</li> * <li>Bitmap Fonts</li> * <li>Sounds</li> * <li>XML data</li> * <li>JSON data</li> * <li>ByteArrays</li> * <li>other AssetManagers</li> * </ul> * </p> * * <p>For more information on how to add assets from different sources, read the documentation * of the "enqueue()" method.</p> * * <strong>Context Loss</strong> * * <p>When the stage3D context is lost, the AssetManager will automatically restore all * loaded textures. To save memory, it will get them from their original sources. Since * this is done asynchronously, your images might not reappear all at once, but during * a time frame of several seconds. If you want, you can pause your game during that time; * the AssetManager dispatches an "Event.TEXTURES_RESTORED" event when all textures have * been restored.</p> * * <strong>Error Handling</strong> * * <p>Loading of some assets may fail while the queue is being processed. In that case, the * AssetManager will call the 'onError' callback that you can optional provide to the * 'loadQueue' method. Queue processing will continue after an error, so it's always * guaranteed that the 'onComplete' callback is executed, too.</p> * * <strong>Texture Properties</strong> * * <p>When you enqueue a texture, its properties for "format", "scale", "mipMapping", and * "repeat" will reflect the settings of the AssetManager at the time they were enqueued. * This means that you can enqueue a bunch of textures, then change the settings and enqueue * some more. Like this:</p> * * <listing> * appDir:File = File.applicationDirectory; * assets:AssetManager = new AssetManager(); * * assets.textureOptions.format = Context3DTextureFormat.BGRA; * assets.enqueue(appDir.resolvePath("textures/32bit")); * * assets.textureOptions.format = Context3DTextureFormat.BGRA_PACKED; * assets.enqueue(appDir.resolvePath("textures/16bit")); * * assets.loadQueue(...);</listing> * * <strong>Nesting</strong> * * <p>When you enqueue one or more AssetManagers to another one, the "loadQueue" method will * oad the Assets of the "child" AssetManager, as well. Later, when accessing assets, * the "parent" AssetManager will return the "child" assets as well - just like it returns, * say, the SubTextures from a contained TextureAtlas.</p> * * <p>The main advantage of grouping your assets like this is something else, though: it * allows to remove (and dispose) a complete group of assets in one step. The example * below loads the assets from two directories. When the contents of one of them are no * longer needed, all its assets are removed together.</p> * * <listing> * manager:AssetManager = new AssetManager(); * appDir:File = File.applicationDirectory; * * redAssets:AssetManager = new AssetManager(); * manager.enqueueSingle(appDir.resolvePath("textures/red/", "redAssets"); * * greenAssets:AssetManager = new AssetManager(); * manager.enqueueSingle(appDir.resolvePath("textures/green/", "greenAssets"); * * manager.loadQueue(...); // loads both "red" and "green" assets * * // ... later, remove all "red" assets together * manager.removeAssetManager("redAssets");</listing> * * <strong>Customization</strong> * * <p>You can customize how assets are created by extending the 'AssetFactory' class and * registering an instance of your new class at the AssetManager via 'registerFactory'. * Factories are probed by priority; any factory with a priority > 0 will be executed * before the built-in factories.</p> * * <p>An asset type is identified by a unique String. You can add your own asset types * by creating a custom 'AssetFactory' and having it add the asset with custom string * identifier.</p> * * <p>By overriding the methods 'getNameFromUrl', 'getExtensionFromUrl', 'disposeAsset', * and 'log', you can customize how assets are named and disposed, and you can forward * any logging to an external logger. To customize the way data is loaded from URLs or * files, you can assign a custom 'DataLoader' instance to the AssetManager.</p> * * @see starling.assets.AssetFactory * @see starling.assets.AssetType * @see starling.assets.DataLoader */ export class AssetManager extends EventDispatcher { /** Create a new instance with the given scale factor. */ public constructor(scaleFactor?:number); /** Disposes all assets and purges the queue. * * <p>Beware that all references to the assets will remain intact, even though the assets * are no longer valid. Call 'purge' if you want to remove all resources and reuse * the AssetManager later.</p> */ public dispose():void; /** Removes assets of all types (disposing them along the way), empties the queue and * aborts any pending load operations. */ public purge():void; // queue processing /** Enqueues one or more raw assets; they will only be available after successfully * executing the "loadQueue" method. This method accepts a variety of different objects: * * <ul> * <li>Strings or URLRequests containing an URL to a local or remote resource. Supported * types: <code>png, jpg, gif, atf, mp3, xml, fnt, json, binary</code>.</li> * <li>Instances of the File class (AIR only) pointing to a directory or a file. * Directories will be scanned recursively for all supported types.</li> * <li>Classes that contain <code>static</code> embedded assets.</li> * <li>If the file extension is not recognized, the data is analyzed to see if * contains XML or JSON data. If it's neither, it is stored as ByteArray.</li> * </ul> * * <p>Suitable object names are extracted automatically: A file named "image.png" will be * accessible under the name "image". When enqueuing embedded assets via a class, * the variable name of the embedded object will be used as its name. An exception * are texture atlases: they will have the same name as the actual texture they are * referencing.</p> * * <p>XMLs are made available via "getXml()"; this includes XMLs containing texture * atlases or bitmap fonts, which are processed along the way. Bitmap fonts are also * registered at the TextField class.</p> * * <p>If you pass in JSON data, it will be parsed into an object and will be available via * "getObject()".</p> */ public enqueue(assets:Array<any>):void; /** Enqueues a single asset with a custom name that can be used to access it later. * If the asset is a texture, you can also add custom texture options. * * @param asset The asset that will be enqueued; accepts the same objects as the * 'enqueue' method. * @param name The name under which the asset will be found later. If you pass null or * omit the parameter, it's attempted to generate a name automatically. * @param options Custom options that will be used if 'asset' points to texture data. * @return the name with which the asset was registered. */ public enqueueSingle(asset:any, name?:string, options?:TextureOptions):string; /** Empties the queue and aborts any pending load operations. */ public purgeQueue():void; /** Loads all enqueued assets asynchronously. The 'onComplete' callback will be executed * once all assets have been loaded - even when there have been errors, which are * forwarded to the optional 'onError' callback. The 'onProgress' will be called * with a 'ratio' between '0.0' and '1.0' and is also optional. * * <p>When you call this method, the manager will save a reference to "Starling.current"; * all textures that are loaded will be accessible only from within this instance. Thus, * if you are working with more than one Starling instance, be sure to call * "makeCurrent()" on the appropriate instance before processing the queue.</p> * * @param onComplete <code>function(manager:AssetManager):void;</code> - parameter is optional! * @param onError <code>function(error:string):void;</code> * @param onProgress <code>function(ratio:Number):void;</code> */ public loadQueue(onComplete:()=>void, onError?:(string)=>void, onProgress?:(number)=>void):void; // basic accessing methods /** Add an asset with a certain name and type. * * <p>Beware: if the slot (name + type) was already taken, the existing object will be * disposed and replaced by the new one.</p> * * @param name The name with which the asset can be retrieved later. Must be * unique within this asset type. * @param asset The actual asset to add (e.g. a texture, a sound, etc). * @param type The type of the asset. If omitted, the type will be determined * automatically (which works for all standard types defined within * the 'AssetType' class). */ public addAsset(name:string, asset:any, type?:string):void; /** Retrieves an asset of the given type, with the given name. If 'recursive' is true, * the method will traverse included texture atlases and asset managers. * * <p>Typically, you will use one of the type-safe convenience methods instead, like * 'getTexture', 'getSound', etc.</p> */ public getAsset(type:string, name:string, recursive?:boolean):any; /** Retrieves an alphabetically sorted list of all assets that have the given type and * start with the given prefix. If 'recursive' is true, the method will traverse included * texture atlases and asset managers. */ public getAssetNames(assetType:string, prefix?:string, recursive?:boolean, out?:Vector<string>):Vector<string>; /** Removes the asset with the given name and type, and will optionally dispose it. */ public removeAsset(assetType:string, name:string, dispose?:boolean):void; // convenience access methods /** Returns a texture with a certain name. Includes textures stored inside atlases. */ public getTexture(name:string):Texture; /** Returns all textures that start with a certain string, sorted alphabetically * (especially useful for "MovieClip"). Includes textures stored inside atlases. */ public getTextures(prefix?:string, out?:Vector<Texture>):Vector<Texture>; /** Returns all texture names that start with a certain string, sorted alphabetically. * Includes textures stored inside atlases. */ public getTextureNames(prefix?:string, out?:Vector<string>):Vector<string>; /** Returns a texture atlas with a certain name, or null if it's not found. */ public getTextureAtlas(name:string):TextureAtlas; /** Returns all texture atlas names that start with a certain string, sorted alphabetically. * If you pass an <code>out</code>-vector, the names will be added to that vector. */ public getTextureAtlasNames(prefix?:string, out?:Vector<string>):Vector<string>; /** Returns a sound with a certain name, or null if it's not found. */ public getSound(name:string):Sound; /** Returns all sound names that start with a certain string, sorted alphabetically. * If you pass an <code>out</code>-vector, the names will be added to that vector. */ public getSoundNames(prefix?:string, out?:Vector<string>):Vector<string>; /** Generates a new SoundChannel object to play back the sound. This method returns a * SoundChannel object, which you can access to stop the sound and to control volume. */ public playSound(name:string, startTime?:number, loops?:number, transform?:SoundTransform):SoundChannel; /** Returns an XML with a certain name, or null if it's not found. */ public getXml(name:string):any/*Xml*/; /** Returns all XML names that start with a certain string, sorted alphabetically. * If you pass an <code>out</code>-vector, the names will be added to that vector. */ public getXmlNames(prefix?:string, out?:Vector<string>):Vector<string>; /** Returns an object with a certain name, or null if it's not found. Enqueued JSON * data is parsed and can be accessed with this method. */ public getObject(name:string):any; /** Returns all object names that start with a certain string, sorted alphabetically. * If you pass an <code>out</code>-vector, the names will be added to that vector. */ public getObjectNames(prefix?:string, out?:Vector<string>):Vector<string>; /** Returns a byte array with a certain name, or null if it's not found. */ public getByteArray(name:string):ByteArray; /** Returns all byte array names that start with a certain string, sorted alphabetically. * If you pass an <code>out</code>-vector, the names will be added to that vector. */ public getByteArrayNames(prefix?:string, out?:Vector<string>):Vector<string>; /** Returns a bitmap font with a certain name, or null if it's not found. */ public getBitmapFont(name:string):BitmapFont; /** Returns all bitmap font names that start with a certain string, sorted alphabetically. * If you pass an <code>out</code>-vector, the names will be added to that vector. */ public getBitmapFontNames(prefix?:string, out?:Vector<string>):Vector<string>; /** Returns an asset manager with a certain name, or null if it's not found. */ public getAssetManager(name:string):AssetManager; /** Returns all asset manager names that start with a certain string, sorted alphabetically. * If you pass an <code>out</code>-vector, the names will be added to that vector. */ public getAssetManagerNames(prefix?:string, out?:Vector<string>):Vector<string>; /** Removes a certain texture, optionally disposing it. */ public removeTexture(name:string, dispose?:boolean):void; /** Removes a certain texture atlas, optionally disposing it. */ public removeTextureAtlas(name:string, dispose?:boolean):void; /** Removes a certain sound. */ public removeSound(name:string):void; /** Removes a certain Xml object, optionally disposing it. */ public removeXml(name:string, dispose?:boolean):void; /** Removes a certain object. */ public removeObject(name:string):void; /** Removes a certain byte array, optionally disposing its memory right away. */ public removeByteArray(name:string, dispose?:boolean):void; /** Removes a certain bitmap font, optionally disposing it. */ public removeBitmapFont(name:string, dispose?:boolean):void; /** Removes a certain asset manager and optionally disposes it right away. */ public removeAssetManager(name:string, dispose?:boolean):void; // registration of factories /** Registers a custom AssetFactory. If you use any priority > 0, the factory will * be called before the default factories. The final factory to be invoked is the * 'ByteArrayFactory', which is using a priority of '-100'. */ public registerFactory(factory:AssetFactory, priority?:number):void; // properties /** When activated, the class will trace information about added/enqueued assets. * @default true */ public verbose:boolean; protected get_verbose():boolean; protected set_verbose(value:boolean):boolean; /** Returns the number of raw assets that have been enqueued, but not yet loaded. */ public readonly numQueuedAssets:number; protected get_numQueuedAssets():number; /** The maximum number of parallel connections that are spawned when loading the queue. * More connections can reduce loading times, but require more memory. @default 3. */ public numConnections:number; protected get_numConnections():number; protected set_numConnections(value:number):number; /** Textures will be created with the options set up in this object at the time of * enqueuing. */ public textureOptions:TextureOptions; protected get_textureOptions():TextureOptions; protected set_textureOptions(value:TextureOptions):TextureOptions; /** The DataLoader is used to load any data from files or URLs. If you need to customize * its behavior (e.g. to add a caching mechanism), assign your custom instance here. */ public dataLoader:DataLoader; protected get_dataLoader():DataLoader; protected set_dataLoader(value:DataLoader):DataLoader; /** Indicates if bitmap fonts should be registered with their "face" attribute from the * font XML file. Per default, they are registered with the name of the texture file. * @default false */ public registerBitmapFontsWithFontFace:boolean; protected get_registerBitmapFontsWithFontFace():boolean; protected set_registerBitmapFontsWithFontFace(value:boolean):boolean; } export class AssetPostProcessor { public constructor(callback:(AssetManager)=>void, priority:number); public readonly priority:number; protected get_priority():number; } } export default starling.assets.AssetManager;