2014-03-23 16:18:31 +00:00
/* jshint wsh:true */
2013-08-28 06:02:55 +00:00
/ * *
2013-10-01 12:54:29 +00:00
* @ author Richard Davey < rich @ photonstorm . com >
2014-02-05 05:54:25 +00:00
* @ copyright 2014 Photon Storm Ltd .
2013-10-01 12:54:29 +00:00
* @ license { @ link https : //github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
* /
/ * *
2013-08-28 06:02:55 +00:00
* The Loader handles loading all external content such as Images , Sounds , Texture Atlases and data files .
2015-02-09 02:23:45 +00:00
*
* The loader uses a combination of tag loading ( eg . Image elements ) and XHR and provides progress and completion callbacks .
2014-09-23 15:21:29 +00:00
*
2014-11-23 04:58:08 +00:00
* Parallel loading is supported but must be enabled explicitly with { @ link Phaser . Loader # enableParallel enableParallel } .
2014-11-23 04:57:42 +00:00
* Load - before behavior of parallel resources is controlled by synchronization points as discussed in { @ link Phaser . Loader # withSyncPoint withSyncPoint } .
*
2015-01-10 00:30:13 +00:00
* Texture Atlases can be created with tools such as [ Texture Packer ] ( https : //www.codeandweb.com/texturepacker/phaser) and
* [ Shoebox ] ( http : //renderhjs.net/shoebox/)
2014-09-23 15:21:29 +00:00
*
2013-10-01 12:54:29 +00:00
* @ class Phaser . Loader
* @ param { Phaser . Game } game - A reference to the currently running game .
2013-08-28 06:02:55 +00:00
* /
Phaser . Loader = function ( game ) {
2013-11-25 04:40:04 +00:00
/ * *
2014-11-23 04:57:42 +00:00
* Local reference to game .
* @ property { Phaser . Game } game
* @ protected
2013-11-25 04:40:04 +00:00
* /
this . game = game ;
/ * *
2014-11-23 04:57:42 +00:00
* True if the Loader is in the process of loading the queue .
* @ property { boolean } isLoading
2013-11-25 04:40:04 +00:00
* @ default
* /
this . isLoading = false ;
/ * *
2014-11-23 04:57:42 +00:00
* True if all assets in the queue have finished loading .
* @ property { boolean } hasLoaded
2013-11-25 04:40:04 +00:00
* @ default
* /
this . hasLoaded = false ;
2013-08-28 06:02:55 +00:00
2014-11-22 21:51:16 +00:00
/ * *
2014-11-23 04:57:42 +00:00
* You can optionally link a progress sprite with { @ link Phaser . Loader # setPreloadSprite setPreloadSprite } .
2014-11-21 18:58:00 +00:00
*
2014-09-09 11:48:38 +00:00
* This property is an object containing : sprite , rect , direction , width and height
2014-09-23 15:21:29 +00:00
*
2014-11-22 21:51:16 +00:00
* @ property { ? object } preloadSprite
2014-11-23 04:57:42 +00:00
* @ protected
2013-10-01 12:54:29 +00:00
* /
2013-11-25 04:40:04 +00:00
this . preloadSprite = null ;
/ * *
2014-11-23 04:57:42 +00:00
* The crossOrigin value applied to loaded images . Very often this needs to be set to 'anonymous' .
* @ property { boolean | string } crossOrigin
2014-02-11 13:23:54 +00:00
* @ default
2013-11-25 04:40:04 +00:00
* /
2014-02-11 13:23:54 +00:00
this . crossOrigin = false ;
2013-11-25 04:40:04 +00:00
/ * *
* If you want to append a URL before the path of any asset you can set this here .
2014-11-22 21:51:16 +00:00
* Useful if allowing the asset base url to be configured outside of the game code .
* The string _must _ end an "/" .
2014-11-23 04:58:08 +00:00
*
2013-11-25 04:40:04 +00:00
* @ property { string } baseURL
* /
this . baseURL = '' ;
2014-04-14 10:51:50 +00:00
/ * *
2014-11-22 21:51:16 +00:00
* This event is dispatched when the loading process starts : before the first file has been requested ,
2014-11-21 18:58:00 +00:00
* but after all the initial packs have been loaded .
*
* @ property { Phaser . Signal } onLoadStart
2014-04-14 10:51:50 +00:00
* /
this . onLoadStart = new Phaser . Signal ( ) ;
2014-04-11 18:17:26 +00:00
/ * *
2014-11-21 18:58:00 +00:00
* This event is dispatched when the final file in the load queue has either loaded or failed .
*
* @ property { Phaser . Signal } onLoadComplete
2014-04-11 18:17:26 +00:00
* /
2014-11-21 01:51:30 +00:00
this . onLoadComplete = new Phaser . Signal ( ) ;
2014-04-11 18:17:26 +00:00
2013-11-25 04:40:04 +00:00
/ * *
2014-11-21 18:58:00 +00:00
* This event is dispatched when an asset pack has either loaded or failed to load .
*
2015-02-09 02:23:45 +00:00
* This is called when the asset pack manifest file has loaded and successfully added its contents to the loader queue .
*
2014-11-21 18:58:00 +00:00
* Params : ` (pack key, success?, total packs loaded, total packs) `
*
* @ property { Phaser . Signal } onPackComplete
2013-11-25 04:40:04 +00:00
* /
2014-11-21 01:51:30 +00:00
this . onPackComplete = new Phaser . Signal ( ) ;
2014-03-23 07:59:28 +00:00
2013-11-25 04:40:04 +00:00
/ * *
2014-11-22 21:51:16 +00:00
* This event is dispatched immediately before a file starts loading .
* It ' s possible the file may fail ( eg . download error , invalid format ) after this event is sent .
2014-11-21 18:58:00 +00:00
*
* Params : ` (progress, file key, file url) `
*
* @ property { Phaser . Signal } onFileStart
2013-11-25 04:40:04 +00:00
* /
2014-11-21 01:51:30 +00:00
this . onFileStart = new Phaser . Signal ( ) ;
2014-03-23 07:59:28 +00:00
2013-11-25 04:40:04 +00:00
/ * *
2014-11-21 18:58:00 +00:00
* This event is dispatched when a file has either loaded or failed to load .
*
* Params : ` (progress, file key, success?, total loaded files, total files) `
*
* @ property { Phaser . Signal } onFileComplete
2013-11-25 04:40:04 +00:00
* /
2014-11-21 01:51:30 +00:00
this . onFileComplete = new Phaser . Signal ( ) ;
2014-11-21 18:58:00 +00:00
2014-07-13 19:38:13 +00:00
/ * *
2014-11-21 18:58:00 +00:00
* This event is dispatched when a file ( or pack ) errors as a result of the load request .
*
* For files it will be triggered before ` onFileComplete ` . For packs it will be triggered before ` onPackComplete ` .
*
* Params : ` (file key, file) `
*
* @ property { Phaser . Signal } onFileError
2014-07-13 19:38:13 +00:00
* /
2014-11-21 01:51:30 +00:00
this . onFileError = new Phaser . Signal ( ) ;
2014-09-23 15:21:29 +00:00
2014-08-28 00:23:45 +00:00
/ * *
2014-11-28 12:02:58 +00:00
* If true and if the browser supports XDomainRequest , it will be used in preference for XHR .
*
* This is only relevant for IE 9 and should _only _ be enabled for IE 9 clients when required by the server / CDN .
2014-11-23 04:58:08 +00:00
*
2014-11-23 04:57:42 +00:00
* @ property { boolean } useXDomainRequest
2014-11-28 12:02:58 +00:00
* @ deprecated This is only relevant for IE 9.
2014-08-28 00:23:45 +00:00
* /
2014-10-27 12:31:55 +00:00
this . useXDomainRequest = false ;
2014-08-28 00:23:45 +00:00
2014-11-28 12:02:58 +00:00
/ * *
2015-02-09 02:23:45 +00:00
* @ private
2014-11-28 12:02:58 +00:00
* @ property { boolean } _warnedAboutXDomainRequest - Control number of warnings for using XDR outside of IE 9.
* /
this . _warnedAboutXDomainRequest = false ;
2014-05-29 14:57:01 +00:00
/ * *
2014-11-22 21:49:18 +00:00
* If true then parallel downloading will be enabled .
2014-11-23 04:58:08 +00:00
* @ property { integer } enableParallel
2014-11-22 21:49:18 +00:00
* /
2014-11-23 04:58:08 +00:00
this . enableParallel = false ;
2014-11-22 21:49:18 +00:00
/ * *
* The number of concurrent assets to try and fetch at once .
2014-11-23 04:57:42 +00:00
* Most browsers limit 6 requests per domain .
2014-11-21 01:51:30 +00:00
*
2014-11-22 21:49:18 +00:00
* @ property { integer } maxParallelDownloads
2014-11-21 18:58:00 +00:00
* @ protected
2014-05-29 14:57:01 +00:00
* /
2014-11-23 04:58:08 +00:00
this . maxParallelDownloads = 6 ;
2014-05-29 14:57:01 +00:00
2014-11-22 22:42:27 +00:00
/ * *
2014-11-23 04:57:42 +00:00
* A counter : if more than zero , files will be automatically added as a synchronization point .
2014-11-22 22:42:27 +00:00
* @ property { integer } _withSyncPointDepth ;
* /
this . _withSyncPointDepth = 0 ;
2014-05-29 14:57:01 +00:00
/ * *
2014-11-21 18:58:00 +00:00
* Contains all the information for asset files ( including packs ) to load .
2014-11-22 21:49:18 +00:00
*
2014-11-23 04:57:42 +00:00
* File / assets are only removed from the list after all loading completes .
*
2014-11-23 04:58:08 +00:00
* @ property { file [ ] } _fileList
2014-05-29 14:57:01 +00:00
* @ private
* /
this . _fileList = [ ] ;
/ * *
2014-11-21 18:58:00 +00:00
* Inflight files ( or packs ) that are being fetched / processed .
*
* This means that if there are any files in the flight queue there should still be processing
* going on ; it should only be empty before or after loading .
*
* The files in the queue may have additional properties added to them ,
* including ` requestObject ` which is normally the associated XHR .
2014-11-21 01:51:30 +00:00
*
2014-11-23 04:58:08 +00:00
* @ property { file [ ] } _flightQueue
2014-05-29 14:57:01 +00:00
* @ private
* /
2014-11-21 18:58:00 +00:00
this . _flightQueue = [ ] ;
2014-11-21 01:51:30 +00:00
2014-11-21 18:58:00 +00:00
/ * *
* The offset into the fileList past all the complete ( loaded or error ) entries .
*
* @ property { integer } _processingHead
* @ private
* /
this . _processingHead = 0 ;
2014-05-29 14:57:01 +00:00
/ * *
2014-11-21 18:58:00 +00:00
* True when the first file ( not pack ) has loading started .
2014-11-22 21:51:16 +00:00
* This used to to control dispatching ` onLoadStart ` which happens after any initial packs are loaded .
2014-11-21 18:58:00 +00:00
*
* @ property { boolean } _initialPacksLoaded
* @ private
* /
this . _fileLoadStarted = false ;
/ * *
* Total packs seen - adjusted when a pack is added .
* @ property { integer } _totalPackCount
2014-05-29 14:57:01 +00:00
* @ private
* /
2014-11-21 18:58:00 +00:00
this . _totalPackCount = 0 ;
/ * *
* Total files seen - adjusted when a file is added .
* @ property { integer } _totalFileCount
* @ private
* /
this . _totalFileCount = 0 ;
/ * *
* Total packs loaded - adjusted just prior to ` onPackComplete ` .
* @ property { integer } _loadedPackCount
* @ private
* /
this . _loadedPackCount = 0 ;
/ * *
* Total files loaded - adjusted just prior to ` onFileComplete ` .
* @ property { integer } _loadedFileCount
* @ private
* /
this . _loadedFileCount = 0 ;
2014-05-29 14:57:01 +00:00
2013-09-10 19:40:34 +00:00
} ;
/ * *
2013-10-02 14:05:55 +00:00
* @ constant
* @ type { number }
* /
2013-09-10 19:40:34 +00:00
Phaser . Loader . TEXTURE _ATLAS _JSON _ARRAY = 0 ;
2013-10-02 14:05:55 +00:00
/ * *
* @ constant
* @ type { number }
* /
2013-09-10 19:40:34 +00:00
Phaser . Loader . TEXTURE _ATLAS _JSON _HASH = 1 ;
2013-10-02 14:05:55 +00:00
/ * *
* @ constant
* @ type { number }
* /
2013-09-10 19:40:34 +00:00
Phaser . Loader . TEXTURE _ATLAS _XML _STARLING = 2 ;
2014-02-14 23:51:49 +00:00
/ * *
* @ constant
* @ type { number }
* /
2014-03-31 07:46:17 +00:00
Phaser . Loader . PHYSICS _LIME _CORONA _JSON = 3 ;
/ * *
* @ constant
* @ type { number }
* /
Phaser . Loader . PHYSICS _PHASER _JSON = 4 ;
2014-02-14 23:51:49 +00:00
2013-09-10 19:40:34 +00:00
Phaser . Loader . prototype = {
2013-10-02 14:05:55 +00:00
2013-11-25 04:40:04 +00:00
/ * *
2014-11-22 21:51:16 +00:00
* Set a Sprite to be a "preload" sprite by passing it to this method .
*
2013-11-25 04:40:04 +00:00
* A "preload" sprite will have its width or height crop adjusted based on the percentage of the loader in real - time .
2014-11-22 21:51:16 +00:00
* This allows you to easily make loading bars for games .
*
* The sprite will automatically be made visible when calling this .
2013-11-25 04:40:04 +00:00
*
* @ method Phaser . Loader # setPreloadSprite
2014-03-18 16:23:44 +00:00
* @ param { Phaser . Sprite | Phaser . Image } sprite - The sprite or image that will be cropped during the load .
* @ param { number } [ direction = 0 ] - A value of zero means the sprite will be cropped horizontally , a value of 1 means its will be cropped vertically .
2013-10-01 12:54:29 +00:00
* /
2013-11-25 04:40:04 +00:00
setPreloadSprite : function ( sprite , direction ) {
direction = direction || 0 ;
2014-03-18 16:23:44 +00:00
this . preloadSprite = { sprite : sprite , direction : direction , width : sprite . width , height : sprite . height , rect : null } ;
2013-11-25 04:40:04 +00:00
if ( direction === 0 )
{
2014-03-18 16:23:44 +00:00
// Horizontal rect
this . preloadSprite . rect = new Phaser . Rectangle ( 0 , 0 , 1 , sprite . height ) ;
2013-11-25 04:40:04 +00:00
}
else
{
2014-03-18 16:23:44 +00:00
// Vertical rect
this . preloadSprite . rect = new Phaser . Rectangle ( 0 , 0 , sprite . width , 1 ) ;
2013-11-25 04:40:04 +00:00
}
2014-03-18 16:23:44 +00:00
sprite . crop ( this . preloadSprite . rect ) ;
2013-11-25 04:40:04 +00:00
2014-02-21 17:29:51 +00:00
sprite . visible = true ;
2013-11-25 04:40:04 +00:00
} ,
2014-11-11 14:00:07 +00:00
/ * *
* Called automatically by ScaleManager when the game resizes in RESIZE scalemode .
2014-11-22 21:51:16 +00:00
*
2015-02-09 02:23:45 +00:00
* This can be used to adjust the preloading sprite size , eg .
2014-11-11 14:00:07 +00:00
*
* @ method Phaser . Loader # resize
2014-11-22 21:51:16 +00:00
* @ protected
2014-11-11 14:00:07 +00:00
* /
resize : function ( ) {
if ( this . preloadSprite && this . preloadSprite . height !== this . preloadSprite . sprite . height )
{
this . preloadSprite . rect . height = this . preloadSprite . sprite . height ;
}
} ,
2013-11-25 04:40:04 +00:00
/ * *
2014-11-22 21:51:16 +00:00
* Check whether a file / asset with a specific key is queued to be loaded .
*
* To access a loaded asset use Phaser . Cache , eg . { @ link Phaser . Cache # checkImageKey }
2014-09-23 15:21:29 +00:00
*
2013-11-25 04:40:04 +00:00
* @ method Phaser . Loader # checkKeyExists
2013-11-26 15:29:03 +00:00
* @ param { string } type - The type asset you want to check .
2013-11-25 04:40:04 +00:00
* @ param { string } key - Key of the asset you want to check .
* @ return { boolean } Return true if exists , otherwise return false .
* /
2013-11-26 15:29:03 +00:00
checkKeyExists : function ( type , key ) {
2013-11-25 04:40:04 +00:00
2014-11-21 01:51:30 +00:00
return this . getAssetIndex ( type , key ) > - 1 ;
2014-03-23 07:59:28 +00:00
2013-11-26 15:29:03 +00:00
} ,
2014-02-27 21:41:54 +00:00
/ * *
2014-11-22 21:51:16 +00:00
* Get the queue - index of the file / asset with a specific key .
*
* Only assets in the download file queue will be found .
2014-02-27 21:41:54 +00:00
*
* @ method Phaser . Loader # getAssetIndex
* @ param { string } type - The type asset you want to check .
* @ param { string } key - Key of the asset you want to check .
* @ return { number } The index of this key in the filelist , or - 1 if not found .
2014-11-22 21:51:16 +00:00
* The index may change and should only be used immediately following this call
2014-02-27 21:41:54 +00:00
* /
getAssetIndex : function ( type , key ) {
2014-11-23 01:42:12 +00:00
var bestFound = - 1 ;
2014-11-21 01:51:30 +00:00
for ( var i = 0 ; i < this . _fileList . length ; i ++ )
2014-02-27 21:41:54 +00:00
{
2014-11-23 01:42:12 +00:00
var file = this . _fileList [ i ] ;
if ( file . type === type && file . key === key )
2014-02-27 21:41:54 +00:00
{
2014-11-23 01:42:12 +00:00
bestFound = i ;
// An already loaded/loading file may be superceded.
if ( ! file . loaded && ! file . loading )
{
break ;
}
2014-02-27 21:41:54 +00:00
}
}
2014-11-23 01:42:12 +00:00
return bestFound ;
2014-03-23 07:59:28 +00:00
2014-02-27 21:41:54 +00:00
} ,
2013-11-26 15:29:03 +00:00
/ * *
2014-11-22 21:51:16 +00:00
* Find a file / asset with a specific key .
*
* Only assets in the download file queue will be found .
2013-11-26 15:29:03 +00:00
*
* @ method Phaser . Loader # getAsset
* @ param { string } type - The type asset you want to check .
* @ param { string } key - Key of the asset you want to check .
2014-11-22 21:51:16 +00:00
* @ return { any } Returns an object if found that has 2 properties : ` index ` and ` file ` ; otherwise a non - true value is returned .
2014-11-21 18:58:00 +00:00
* The index may change and should only be used immediately following this call .
2013-11-26 15:29:03 +00:00
* /
getAsset : function ( type , key ) {
2014-11-21 01:51:30 +00:00
var fileIndex = this . getAssetIndex ( type , key ) ;
if ( fileIndex > - 1 )
2013-11-25 04:40:04 +00:00
{
2014-11-21 01:51:30 +00:00
return { index : fileIndex , file : this . _fileList [ fileIndex ] } ;
2013-11-25 04:40:04 +00:00
}
2013-11-26 15:29:03 +00:00
return false ;
2014-03-23 07:59:28 +00:00
2013-11-25 04:40:04 +00:00
} ,
/ * *
2014-11-21 21:01:04 +00:00
* Reset the loader and clear any queued assets .
2014-11-21 18:58:00 +00:00
*
2014-11-21 20:06:44 +00:00
* This will abort any loading and clear any queued assets .
2013-11-25 04:40:04 +00:00
*
* @ method Phaser . Loader # reset
2014-11-21 20:06:44 +00:00
* @ protected
2014-11-21 21:01:04 +00:00
* @ param { boolean } [ hard = false ] - If true then the preload sprite and other artifacts may also be cleared .
2013-11-25 04:40:04 +00:00
* /
2014-11-21 20:06:44 +00:00
reset : function ( hard ) {
if ( hard )
{
this . preloadSprite = null ;
}
2013-11-25 04:40:04 +00:00
this . isLoading = false ;
2014-05-29 14:57:01 +00:00
2014-11-21 18:58:00 +00:00
this . _processingHead = 0 ;
2013-11-26 15:29:03 +00:00
this . _fileList . length = 0 ;
2014-11-21 18:58:00 +00:00
this . _flightQueue . length = 0 ;
2014-11-21 20:06:44 +00:00
this . _fileLoadStarted = false ;
2014-11-21 18:58:00 +00:00
this . _totalFileCount = 0 ;
this . _totalPackCount = 0 ;
this . _loadedPackCount = 0 ;
this . _loadedFileCount = 0 ;
2013-11-25 04:40:04 +00:00
} ,
/ * *
* Internal function that adds a new entry to the file list . Do not call directly .
*
* @ method Phaser . Loader # addToFileList
2014-05-29 14:57:01 +00:00
* @ protected
2013-11-26 15:29:03 +00:00
* @ param { string } type - The type of resource to add to the list ( image , audio , xml , etc ) .
* @ param { string } key - The unique Cache ID key of this resource .
* @ param { string } url - The URL the asset will be loaded from .
2014-11-21 18:58:00 +00:00
* @ param { object } [ properties = ( none ) ] - Any additional properties needed to load the file . These are added directly to the added file object and overwrite any defaults .
* @ param { boolean } [ overwrite = false ] - If true then this will overwrite a file asset of the same type / key . Otherwise it will will only add a new asset . If overwrite is true , and the asset is already being loaded ( or has been loaded ) , then it is appended instead .
2013-11-25 04:40:04 +00:00
* /
2014-11-21 01:51:30 +00:00
addToFileList : function ( type , key , url , properties , overwrite ) {
2013-11-25 04:40:04 +00:00
2014-11-21 18:58:00 +00:00
var file = {
2013-11-25 04:40:04 +00:00
type : type ,
key : key ,
url : url ,
2014-11-22 22:42:27 +00:00
syncPoint : this . _withSyncPointDepth > 0 ,
2013-11-25 04:40:04 +00:00
data : null ,
2014-11-21 18:58:00 +00:00
loading : false ,
loaded : false ,
error : false
2013-11-25 04:40:04 +00:00
} ;
2014-11-21 01:51:30 +00:00
if ( properties )
2013-11-25 04:40:04 +00:00
{
for ( var prop in properties )
{
2014-11-21 18:58:00 +00:00
file [ prop ] = properties [ prop ] ;
2013-11-25 04:40:04 +00:00
}
}
2014-11-21 01:51:30 +00:00
var fileIndex = this . getAssetIndex ( type , key ) ;
if ( overwrite && fileIndex > - 1 )
{
2014-11-21 18:58:00 +00:00
var currentFile = this . _fileList [ fileIndex ] ;
if ( ! currentFile . loading && ! currentFile . loaded )
{
this . _fileList [ fileIndex ] = file ;
}
else
{
this . _fileList . push ( file ) ;
this . _totalFileCount ++ ;
}
2014-11-21 01:51:30 +00:00
}
2014-11-21 18:58:00 +00:00
else if ( fileIndex === - 1 )
2013-11-26 15:29:03 +00:00
{
2014-11-21 18:58:00 +00:00
this . _fileList . push ( file ) ;
this . _totalFileCount ++ ;
2013-11-26 15:29:03 +00:00
}
2013-11-25 04:40:04 +00:00
2013-11-26 15:29:03 +00:00
} ,
/ * *
* Internal function that replaces an existing entry in the file list with a new one . Do not call directly .
*
* @ method Phaser . Loader # replaceInFileList
2014-11-21 18:58:00 +00:00
* @ protected
2013-11-26 15:29:03 +00:00
* @ param { string } type - The type of resource to add to the list ( image , audio , xml , etc ) .
* @ param { string } key - The unique Cache ID key of this resource .
* @ param { string } url - The URL the asset will be loaded from .
* @ param { object } properties - Any additional properties needed to load the file .
* /
replaceInFileList : function ( type , key , url , properties ) {
2014-11-21 18:58:00 +00:00
return this . addToFileList ( type , key , url , properties , true ) ;
2013-11-25 04:40:04 +00:00
} ,
2014-05-29 14:57:01 +00:00
/ * *
2014-11-21 21:01:04 +00:00
* Add a JSON resource pack ( 'packfile' ) to the Loader .
2014-05-29 14:57:01 +00:00
*
2014-11-21 18:58:00 +00:00
* Packs are always put before the first non - pack file that is not loaded / loading .
* This means that all packs added before any loading has started are added to the front
* of the file / asset list , in order added .
*
* @ method Phaser . Loader # pack
2014-11-21 01:51:30 +00:00
* @ param { string } key - Unique asset key of this resource pack .
2014-05-29 14:57:01 +00:00
* @ param { string } [ url ] - URL of the Asset Pack JSON file . If you wish to pass a json object instead set this to null and pass the object as the data parameter .
* @ param { object } [ data ] - The Asset Pack JSON data . Use this to pass in a json data object rather than loading it from a URL . TODO
2014-11-22 21:51:16 +00:00
* @ param { object } [ callbackContext = ( loader ) ] - Some Loader operations , like Binary and Script require a context for their callbacks . Pass the context here .
2014-05-29 14:57:01 +00:00
* @ return { Phaser . Loader } This Loader instance .
* /
pack : function ( key , url , data , callbackContext ) {
2014-11-21 18:58:00 +00:00
if ( typeof url === 'undefined' ) { url = null ; }
if ( typeof data === 'undefined' ) { data = null ; }
2014-11-22 21:55:32 +00:00
if ( typeof callbackContext === 'undefined' ) { callbackContext = null ; }
2014-05-29 14:57:01 +00:00
2014-11-21 01:51:30 +00:00
if ( ! url && ! data )
2014-05-29 14:57:01 +00:00
{
console . warn ( 'Phaser.Loader.pack - Both url and data are null. One must be set.' ) ;
2014-11-21 18:58:00 +00:00
2014-05-29 14:57:01 +00:00
return this ;
}
2014-11-21 18:58:00 +00:00
var pack = {
type : 'packfile' ,
key : key ,
url : url ,
2014-11-22 22:42:27 +00:00
syncPoint : true ,
2014-11-21 18:58:00 +00:00
data : null ,
loading : false ,
loaded : false ,
error : false ,
callbackContext : callbackContext
} ;
2014-05-29 14:57:01 +00:00
// A data object has been given
if ( data )
{
if ( typeof data === 'string' )
{
data = JSON . parse ( data ) ;
}
2014-11-21 18:58:00 +00:00
2014-11-23 04:58:08 +00:00
pack . data = data || { } ;
2014-11-21 18:58:00 +00:00
}
// Add before first non-pack/no-loaded ~ last pack from start prior to loading
// (Read one past for splice-to-end)
for ( var i = 0 ; i < this . _fileList . length + 1 ; i ++ )
{
var file = this . _fileList [ i ] ;
if ( ! file || ( ! file . loaded && ! file . loading && file . type !== 'packfile' ) )
{
this . _fileList . splice ( i , 1 , pack ) ;
2014-11-23 04:58:08 +00:00
this . _totalPackCount ++ ;
2014-11-21 18:58:00 +00:00
break ;
}
2014-05-29 14:57:01 +00:00
}
return this ;
} ,
2013-11-25 04:40:04 +00:00
/ * *
2014-11-21 21:01:04 +00:00
* Add an 'image' to the Loader .
2013-11-25 04:40:04 +00:00
*
* @ method Phaser . Loader # image
* @ param { string } key - Unique asset key of this image file .
* @ param { string } url - URL of image file .
2013-11-26 15:29:03 +00:00
* @ param { boolean } [ overwrite = false ] - If an unloaded file with a matching key already exists in the queue , this entry will overwrite it .
2013-11-28 14:22:47 +00:00
* @ return { Phaser . Loader } This Loader instance .
2013-11-25 04:40:04 +00:00
* /
image : function ( key , url , overwrite ) {
2014-11-21 18:58:00 +00:00
if ( typeof overwrite === 'undefined' ) { overwrite = false ; }
2013-11-25 04:40:04 +00:00
2014-11-21 01:51:30 +00:00
this . addToFileList ( 'image' , key , url , undefined , overwrite ) ;
2013-11-25 04:40:04 +00:00
return this ;
} ,
/ * *
2014-11-21 21:01:04 +00:00
* Add a 'text' file to the Loader .
2013-11-25 04:40:04 +00:00
*
* @ method Phaser . Loader # text
* @ param { string } key - Unique asset key of the text file .
* @ param { string } url - URL of the text file .
2013-11-26 15:29:03 +00:00
* @ param { boolean } [ overwrite = false ] - If an unloaded file with a matching key already exists in the queue , this entry will overwrite it .
2013-11-28 14:22:47 +00:00
* @ return { Phaser . Loader } This Loader instance .
2013-11-25 04:40:04 +00:00
* /
text : function ( key , url , overwrite ) {
2014-11-21 18:58:00 +00:00
if ( typeof overwrite === 'undefined' ) { overwrite = false ; }
2013-11-25 04:40:04 +00:00
2014-11-21 01:51:30 +00:00
this . addToFileList ( 'text' , key , url , undefined , overwrite ) ;
2013-11-25 04:40:04 +00:00
return this ;
} ,
2014-02-21 18:48:06 +00:00
/ * *
2014-11-21 21:01:04 +00:00
* Add a 'json' file to the Loader .
2014-02-21 18:48:06 +00:00
*
* @ method Phaser . Loader # json
* @ param { string } key - Unique asset key of the json file .
* @ param { string } url - URL of the json file .
* @ param { boolean } [ overwrite = false ] - If an unloaded file with a matching key already exists in the queue , this entry will overwrite it .
* @ return { Phaser . Loader } This Loader instance .
* /
json : function ( key , url , overwrite ) {
2014-11-21 18:58:00 +00:00
if ( typeof overwrite === 'undefined' ) { overwrite = false ; }
2014-02-21 18:48:06 +00:00
2014-11-21 01:51:30 +00:00
this . addToFileList ( 'json' , key , url , undefined , overwrite ) ;
2014-02-21 18:48:06 +00:00
return this ;
} ,
2014-09-18 23:22:00 +00:00
/ * *
2014-11-21 21:01:04 +00:00
* Add an XML ( 'xml' ) file to the Loader .
2014-09-18 23:22:00 +00:00
*
* @ method Phaser . Loader # xml
* @ param { string } key - Unique asset key of the xml file .
* @ param { string } url - URL of the xml file .
* @ param { boolean } [ overwrite = false ] - If an unloaded file with a matching key already exists in the queue , this entry will overwrite it .
* @ return { Phaser . Loader } This Loader instance .
* /
xml : function ( key , url , overwrite ) {
2014-11-21 18:58:00 +00:00
if ( typeof overwrite === 'undefined' ) { overwrite = false ; }
2014-09-18 23:22:00 +00:00
2014-11-21 01:51:30 +00:00
this . addToFileList ( 'xml' , key , url , undefined , overwrite ) ;
2014-09-18 23:22:00 +00:00
return this ;
} ,
2013-11-28 05:43:35 +00:00
/ * *
2014-11-21 21:01:04 +00:00
* Add a JavaScript ( 'script' ) file to the Loader .
2014-11-21 01:51:30 +00:00
*
* The loaded JavaScript is automatically turned into a script tag and executed , so be careful what you load !
*
* A callback , which will be invoked as the script tag has been created , can also be specified .
* The callback must return relevant ` data ` .
2013-11-28 05:43:35 +00:00
*
* @ method Phaser . Loader # script
* @ param { string } key - Unique asset key of the script file .
* @ param { string } url - URL of the JavaScript file .
2014-11-21 01:51:30 +00:00
* @ param { function } [ callback = ( none ) ] - Optional callback that will be called after the script tag has loaded , so you can perform additional processing .
2014-11-22 21:51:16 +00:00
* @ param { object } [ callbackContext = ( loader ) ] - The context under which the callback will be applied . If not specified it will use the callback itself as the context .
2013-11-28 14:22:47 +00:00
* @ return { Phaser . Loader } This Loader instance .
2013-11-28 05:43:35 +00:00
* /
2014-02-26 02:45:06 +00:00
script : function ( key , url , callback , callbackContext ) {
if ( typeof callback === 'undefined' ) { callback = false ; }
2014-11-21 18:58:00 +00:00
// Why is the default callback context the ..callback?
2014-02-26 02:45:06 +00:00
if ( callback !== false && typeof callbackContext === 'undefined' ) { callbackContext = callback ; }
2013-11-28 05:43:35 +00:00
2014-11-22 22:42:27 +00:00
this . addToFileList ( 'script' , key , url , { syncPoint : true , callback : callback , callbackContext : callbackContext } ) ;
2013-11-28 05:43:35 +00:00
return this ;
} ,
2013-12-20 18:27:36 +00:00
/ * *
2014-11-21 21:01:04 +00:00
* Add a 'binary' file to the Loader .
2014-11-21 01:51:30 +00:00
*
* It will be loaded via xhr with a responseType of "arraybuffer" . You can specify an optional callback to process the file after load .
2013-12-20 18:27:36 +00:00
* When the callback is called it will be passed 2 parameters : the key of the file and the file data .
2014-11-21 01:51:30 +00:00
*
* WARNING : If a callback is specified the data will be set to whatever it returns . Always return the data object , even if you didn ' t modify it .
2013-12-20 18:27:36 +00:00
*
* @ method Phaser . Loader # binary
* @ param { string } key - Unique asset key of the binary file .
* @ param { string } url - URL of the binary file .
2014-11-21 01:51:30 +00:00
* @ param { function } [ callback = ( none ) ] - Optional callback that will be passed the file after loading , so you can perform additional processing on it .
* @ param { object } [ callbackContext ] - The context under which the callback will be applied . If not specified it will use the callback itself as the context .
2013-12-20 18:27:36 +00:00
* @ return { Phaser . Loader } This Loader instance .
* /
binary : function ( key , url , callback , callbackContext ) {
if ( typeof callback === 'undefined' ) { callback = false ; }
2014-11-21 18:58:00 +00:00
// Why is the default callback context the ..callback?
2013-12-20 18:27:36 +00:00
if ( callback !== false && typeof callbackContext === 'undefined' ) { callbackContext = callback ; }
this . addToFileList ( 'binary' , key , url , { callback : callback , callbackContext : callbackContext } ) ;
return this ;
} ,
2013-11-25 04:40:04 +00:00
/ * *
2014-11-21 21:01:04 +00:00
* Add a new sprite sheet ( 'spritesheet' ) to the loader .
2013-11-25 04:40:04 +00:00
*
* @ method Phaser . Loader # spritesheet
* @ param { string } key - Unique asset key of the sheet file .
* @ param { string } url - URL of the sheet file .
* @ param { number } frameWidth - Width of each single frame .
* @ param { number } frameHeight - Height of each single frame .
* @ param { number } [ frameMax = - 1 ] - How many frames in this sprite sheet . If not specified it will divide the whole image into frames .
2013-12-13 14:04:14 +00:00
* @ param { number } [ margin = 0 ] - If the frames have been drawn with a margin , specify the amount here .
* @ param { number } [ spacing = 0 ] - If the frames have been drawn with spacing between them , specify the amount here .
2013-11-28 14:22:47 +00:00
* @ return { Phaser . Loader } This Loader instance .
2013-11-25 04:40:04 +00:00
* /
2013-12-13 14:04:14 +00:00
spritesheet : function ( key , url , frameWidth , frameHeight , frameMax , margin , spacing ) {
2013-11-25 04:40:04 +00:00
2014-11-21 18:58:00 +00:00
if ( typeof frameMax === 'undefined' ) { frameMax = - 1 ; }
if ( typeof margin === 'undefined' ) { margin = 0 ; }
if ( typeof spacing === 'undefined' ) { spacing = 0 ; }
2013-11-25 04:40:04 +00:00
2013-12-13 14:04:14 +00:00
this . addToFileList ( 'spritesheet' , key , url , { frameWidth : frameWidth , frameHeight : frameHeight , frameMax : frameMax , margin : margin , spacing : spacing } ) ;
2013-11-25 04:40:04 +00:00
return this ;
} ,
/ * *
2014-11-21 21:01:04 +00:00
* Add a new 'audio' file to the loader .
2013-11-25 04:40:04 +00:00
*
* @ method Phaser . Loader # audio
* @ param { string } key - Unique asset key of the audio file .
2014-11-21 01:51:30 +00:00
* @ param { string [ ] | string } urls - An array containing the URLs of the audio files , i . e . : [ 'jump.mp3' , 'jump.ogg' , 'jump.m4a' ] or a single string containing just one URL .
2015-02-09 02:23:45 +00:00
* BLOB urls are supported , but Phaser will not validate the audio file ' s type in this case ; the program must first ensure the BLOB url is playable .
2013-11-25 04:40:04 +00:00
* @ param { boolean } autoDecode - When using Web Audio the audio files can either be decoded at load time or run - time . They can 't be played until they are decoded, but this let' s you control when that happens . Decoding is a non - blocking async process .
2013-11-28 14:22:47 +00:00
* @ return { Phaser . Loader } This Loader instance .
2013-11-25 04:40:04 +00:00
* /
audio : function ( key , urls , autoDecode ) {
2014-11-21 18:58:00 +00:00
if ( typeof autoDecode === 'undefined' ) { autoDecode = true ; }
2013-11-25 04:40:04 +00:00
2013-11-26 15:29:03 +00:00
this . addToFileList ( 'audio' , key , urls , { buffer : null , autoDecode : autoDecode } ) ;
2013-11-25 04:40:04 +00:00
return this ;
} ,
2014-09-23 15:21:29 +00:00
/ * *
2014-11-22 21:51:16 +00:00
* Add a new audiosprite file to the loader .
*
* Audio Sprites are a combination of audio files and a JSON configuration .
* The JSON follows the format of that created by https : //github.com/tonistiigi/audiosprite
*
* @ method Phaser . Loader # audiosprite
* @ param { string } key - Unique asset key of the audio file .
* @ param { Array | string } urls - An array containing the URLs of the audio files , i . e . : [ 'audiosprite.mp3' , 'audiosprite.ogg' , 'audiosprite.m4a' ] or a single string containing just one URL .
* @ param { string } atlasURL - The URL of the audiosprite configuration json .
* @ return { Phaser . Loader } This Loader instance .
* /
2014-09-23 21:15:09 +00:00
audiosprite : function ( key , urls , atlasURL ) {
2014-09-23 15:25:49 +00:00
this . audio ( key , urls ) ;
2014-09-23 21:15:09 +00:00
this . json ( key + '-audioatlas' , atlasURL ) ;
2014-09-23 15:21:29 +00:00
return this ;
2014-09-23 21:15:09 +00:00
2014-09-23 15:21:29 +00:00
} ,
2013-11-25 04:40:04 +00:00
/ * *
2014-11-21 21:01:04 +00:00
* Add a new 'tilemap' loading request . If data is supplied the object is loaded immediately .
2013-11-25 04:40:04 +00:00
*
* @ method Phaser . Loader # tilemap
* @ param { string } key - Unique asset key of the tilemap data .
2014-05-29 03:44:23 +00:00
* @ param { string } [ url ] - The url of the map data file ( csv / json )
* @ param { object } [ data ] - An optional JSON data object . If given then the url is ignored and this JSON object is used for map data instead .
2014-03-06 16:53:52 +00:00
* @ param { number } [ format = Phaser . Tilemap . CSV ] - The format of the map data . Either Phaser . Tilemap . CSV or Phaser . Tilemap . TILED _JSON .
2013-11-28 14:22:47 +00:00
* @ return { Phaser . Loader } This Loader instance .
2013-11-25 04:40:04 +00:00
* /
2014-05-29 03:44:23 +00:00
tilemap : function ( key , url , data , format ) {
2013-11-25 04:40:04 +00:00
2014-11-21 18:58:00 +00:00
if ( typeof url === 'undefined' ) { url = null ; }
if ( typeof data === 'undefined' ) { data = null ; }
if ( typeof format === 'undefined' ) { format = Phaser . Tilemap . CSV ; }
2013-11-25 04:40:04 +00:00
2014-11-21 01:51:30 +00:00
if ( ! url && ! data )
2013-11-25 04:40:04 +00:00
{
2014-05-29 03:44:23 +00:00
console . warn ( 'Phaser.Loader.tilemap - Both url and data are null. One must be set.' ) ;
2013-11-25 04:40:04 +00:00
return this ;
}
2013-11-28 14:22:47 +00:00
// A map data object has been given
2014-05-29 03:44:23 +00:00
if ( data )
2013-11-26 15:29:03 +00:00
{
switch ( format )
2013-11-25 04:40:04 +00:00
{
2013-11-26 15:29:03 +00:00
// A csv string or object has been given
case Phaser . Tilemap . CSV :
break ;
2013-11-25 04:40:04 +00:00
2013-11-26 15:29:03 +00:00
// An xml string or object has been given
case Phaser . Tilemap . TILED _JSON :
2013-11-25 04:40:04 +00:00
2014-05-29 03:44:23 +00:00
if ( typeof data === 'string' )
2013-11-26 15:29:03 +00:00
{
2014-05-29 03:44:23 +00:00
data = JSON . parse ( data ) ;
2013-11-26 15:29:03 +00:00
}
break ;
2013-11-25 04:40:04 +00:00
}
2013-11-26 15:29:03 +00:00
2014-05-29 03:44:23 +00:00
this . game . cache . addTilemap ( key , null , data , format ) ;
2013-11-25 04:40:04 +00:00
}
2013-11-28 14:22:47 +00:00
else
{
2014-05-29 03:44:23 +00:00
this . addToFileList ( 'tilemap' , key , url , { format : format } ) ;
2013-11-28 14:22:47 +00:00
}
2013-11-25 04:40:04 +00:00
return this ;
} ,
2014-02-14 23:51:49 +00:00
/ * *
2014-11-21 21:01:04 +00:00
* Add a new 'physics' data object loading request . If data is supplied the object is loaded immediately .
2014-11-21 01:51:30 +00:00
*
2014-02-14 23:51:49 +00:00
* The data must be in Lime + Corona JSON format . Physics Editor by code 'n' web exports in this format natively .
*
* @ method Phaser . Loader # physics
* @ param { string } key - Unique asset key of the physics json data .
2014-05-29 03:44:23 +00:00
* @ param { string } [ url ] - The url of the map data file ( csv / json )
* @ param { object } [ data ] - An optional JSON data object . If given then the url is ignored and this JSON object is used for physics data instead .
2014-02-14 23:51:49 +00:00
* @ param { string } [ format = Phaser . Physics . LIME _CORONA _JSON ] - The format of the physics data .
* @ return { Phaser . Loader } This Loader instance .
* /
2014-05-29 03:44:23 +00:00
physics : function ( key , url , data , format ) {
2014-02-14 23:51:49 +00:00
2014-11-21 18:58:00 +00:00
if ( typeof url === 'undefined' ) { url = null ; }
if ( typeof data === 'undefined' ) { data = null ; }
if ( typeof format === 'undefined' ) { format = Phaser . Physics . LIME _CORONA _JSON ; }
2014-02-14 23:51:49 +00:00
2014-11-21 01:51:30 +00:00
if ( ! url && ! data )
2014-02-14 23:51:49 +00:00
{
2014-05-29 03:44:23 +00:00
console . warn ( 'Phaser.Loader.physics - Both url and data are null. One must be set.' ) ;
2014-02-14 23:51:49 +00:00
return this ;
}
// A map data object has been given
2014-05-29 03:44:23 +00:00
if ( data )
2014-02-14 23:51:49 +00:00
{
2014-05-29 03:44:23 +00:00
if ( typeof data === 'string' )
2014-02-14 23:51:49 +00:00
{
2014-05-29 03:44:23 +00:00
data = JSON . parse ( data ) ;
2014-02-14 23:51:49 +00:00
}
2014-05-29 03:44:23 +00:00
this . game . cache . addPhysicsData ( key , null , data , format ) ;
2014-02-14 23:51:49 +00:00
}
else
{
2014-05-29 03:44:23 +00:00
this . addToFileList ( 'physics' , key , url , { format : format } ) ;
2014-02-14 23:51:49 +00:00
}
return this ;
} ,
2013-11-25 04:40:04 +00:00
/ * *
2014-11-21 21:01:04 +00:00
* Add a new bitmap font ( 'bitmapfont' ) loading request .
2013-11-25 04:40:04 +00:00
*
* @ method Phaser . Loader # bitmapFont
* @ param { string } key - Unique asset key of the bitmap font .
* @ param { string } textureURL - The url of the font image file .
* @ param { string } [ xmlURL ] - The url of the font data file ( xml / fnt )
* @ param { object } [ xmlData ] - An optional XML data object .
2014-02-14 04:34:57 +00:00
* @ param { number } [ xSpacing = 0 ] - If you ' d like to add additional horizontal spacing between the characters then set the pixel value here .
* @ param { number } [ ySpacing = 0 ] - If you ' d like to add additional vertical spacing between the lines then set the pixel value here .
2013-11-28 14:22:47 +00:00
* @ return { Phaser . Loader } This Loader instance .
2013-11-25 04:40:04 +00:00
* /
2014-02-14 04:34:57 +00:00
bitmapFont : function ( key , textureURL , xmlURL , xmlData , xSpacing , ySpacing ) {
2013-11-25 04:40:04 +00:00
2014-11-21 18:58:00 +00:00
if ( typeof xmlURL === 'undefined' ) { xmlURL = null ; }
if ( typeof xmlData === 'undefined' ) { xmlData = null ; }
if ( typeof xSpacing === 'undefined' ) { xSpacing = 0 ; }
if ( typeof ySpacing === 'undefined' ) { ySpacing = 0 ; }
2013-11-25 04:40:04 +00:00
2013-11-26 15:29:03 +00:00
// A URL to a json/xml file has been given
if ( xmlURL )
2013-11-25 04:40:04 +00:00
{
2014-02-14 04:34:57 +00:00
this . addToFileList ( 'bitmapfont' , key , textureURL , { xmlURL : xmlURL , xSpacing : xSpacing , ySpacing : ySpacing } ) ;
2013-11-26 15:29:03 +00:00
}
else
{
// An xml string or object has been given
if ( typeof xmlData === 'string' )
2013-11-25 04:40:04 +00:00
{
2014-11-21 01:51:30 +00:00
var xml = this . parseXml ( xmlData ) ;
2013-11-26 15:29:03 +00:00
2014-11-21 01:51:30 +00:00
if ( ! xml )
2013-11-26 15:29:03 +00:00
{
throw new Error ( "Phaser.Loader. Invalid Bitmap Font XML given" ) ;
}
2014-11-21 01:51:30 +00:00
this . addToFileList ( 'bitmapfont' , key , textureURL , { xmlURL : null , xmlData : xml , xSpacing : xSpacing , ySpacing : ySpacing } ) ;
2013-11-25 04:40:04 +00:00
}
}
return this ;
} ,
/ * *
2014-11-21 21:01:04 +00:00
* Add a new texture atlas ( 'textureatlas' ) to the loader . This atlas uses the JSON Array data format .
2013-11-25 04:40:04 +00:00
*
2015-01-10 00:30:13 +00:00
* Texture Atlases can be created with tools such as [ Texture Packer ] ( https : //www.codeandweb.com/texturepacker/phaser) and
* [ Shoebox ] ( http : //renderhjs.net/shoebox/)
2013-11-25 04:40:04 +00:00
*
* @ method Phaser . Loader # atlasJSONArray
2013-11-26 15:29:03 +00:00
* @ param { string } key - Unique asset key of the texture atlas file .
* @ param { string } textureURL - The url of the texture atlas image file .
* @ param { string } [ atlasURL ] - The url of the texture atlas data file ( json / xml ) . You don ' t need this if you are passing an atlasData object instead .
* @ param { object } [ atlasData ] - A JSON or XML data object . You don ' t need this if the data is being loaded from a URL .
2013-11-28 14:22:47 +00:00
* @ return { Phaser . Loader } This Loader instance .
2013-11-25 04:40:04 +00:00
* /
atlasJSONArray : function ( key , textureURL , atlasURL , atlasData ) {
return this . atlas ( key , textureURL , atlasURL , atlasData , Phaser . Loader . TEXTURE _ATLAS _JSON _ARRAY ) ;
} ,
/ * *
2014-11-21 21:01:04 +00:00
* Add a new texture atlas ( 'textureatlas' ) to the loader . This atlas uses the JSON Hash data format .
2013-11-25 04:40:04 +00:00
*
2015-01-10 00:30:13 +00:00
* Texture Atlases can be created with tools such as [ Texture Packer ] ( https : //www.codeandweb.com/texturepacker/phaser) and
* [ Shoebox ] ( http : //renderhjs.net/shoebox/)
2013-11-25 04:40:04 +00:00
*
* @ method Phaser . Loader # atlasJSONHash
2013-11-26 15:29:03 +00:00
* @ param { string } key - Unique asset key of the texture atlas file .
* @ param { string } textureURL - The url of the texture atlas image file .
* @ param { string } [ atlasURL ] - The url of the texture atlas data file ( json / xml ) . You don ' t need this if you are passing an atlasData object instead .
* @ param { object } [ atlasData ] - A JSON or XML data object . You don ' t need this if the data is being loaded from a URL .
2013-11-28 14:22:47 +00:00
* @ return { Phaser . Loader } This Loader instance .
2013-11-25 04:40:04 +00:00
* /
atlasJSONHash : function ( key , textureURL , atlasURL , atlasData ) {
return this . atlas ( key , textureURL , atlasURL , atlasData , Phaser . Loader . TEXTURE _ATLAS _JSON _HASH ) ;
} ,
/ * *
2014-11-21 21:01:04 +00:00
* Add a new texture atlas ( 'textureatlas' ) to the loader . This atlas uses the Starling XML data format .
2013-11-25 04:40:04 +00:00
*
* @ method Phaser . Loader # atlasXML
2013-11-26 15:29:03 +00:00
* @ param { string } key - Unique asset key of the texture atlas file .
* @ param { string } textureURL - The url of the texture atlas image file .
* @ param { string } [ atlasURL ] - The url of the texture atlas data file ( json / xml ) . You don ' t need this if you are passing an atlasData object instead .
* @ param { object } [ atlasData ] - A JSON or XML data object . You don ' t need this if the data is being loaded from a URL .
2013-11-28 14:22:47 +00:00
* @ return { Phaser . Loader } This Loader instance .
2013-11-25 04:40:04 +00:00
* /
atlasXML : function ( key , textureURL , atlasURL , atlasData ) {
return this . atlas ( key , textureURL , atlasURL , atlasData , Phaser . Loader . TEXTURE _ATLAS _XML _STARLING ) ;
} ,
/ * *
2014-11-21 21:01:04 +00:00
* Add a new texture atlas ( 'textureatlas' ) to the loader .
2013-11-25 04:40:04 +00:00
*
2015-01-10 00:30:13 +00:00
* Texture Atlases can be created with tools such as [ Texture Packer ] ( https : //www.codeandweb.com/texturepacker/phaser) and
* [ Shoebox ] ( http : //renderhjs.net/shoebox/)
2013-11-25 04:40:04 +00:00
*
* @ method Phaser . Loader # atlas
* @ param { string } key - Unique asset key of the texture atlas file .
* @ param { string } textureURL - The url of the texture atlas image file .
* @ param { string } [ atlasURL ] - The url of the texture atlas data file ( json / xml ) . You don ' t need this if you are passing an atlasData object instead .
* @ param { object } [ atlasData ] - A JSON or XML data object . You don ' t need this if the data is being loaded from a URL .
* @ param { number } [ format ] - A value describing the format of the data , the default is Phaser . Loader . TEXTURE _ATLAS _JSON _ARRAY .
2013-11-28 14:22:47 +00:00
* @ return { Phaser . Loader } This Loader instance .
2013-11-25 04:40:04 +00:00
* /
atlas : function ( key , textureURL , atlasURL , atlasData , format ) {
2014-11-21 18:58:00 +00:00
if ( typeof atlasURL === 'undefined' ) { atlasURL = null ; }
if ( typeof atlasData === 'undefined' ) { atlasData = null ; }
if ( typeof format === 'undefined' ) { format = Phaser . Loader . TEXTURE _ATLAS _JSON _ARRAY ; }
2013-11-25 04:40:04 +00:00
2013-11-26 15:29:03 +00:00
// A URL to a json/xml file has been given
if ( atlasURL )
2013-11-25 04:40:04 +00:00
{
2013-11-26 15:29:03 +00:00
this . addToFileList ( 'textureatlas' , key , textureURL , { atlasURL : atlasURL , format : format } ) ;
}
else
{
switch ( format )
2013-11-25 04:40:04 +00:00
{
2013-11-26 15:29:03 +00:00
// A json string or object has been given
case Phaser . Loader . TEXTURE _ATLAS _JSON _ARRAY :
2013-11-25 04:40:04 +00:00
2013-11-26 15:29:03 +00:00
if ( typeof atlasData === 'string' )
{
atlasData = JSON . parse ( atlasData ) ;
}
break ;
2013-11-25 04:40:04 +00:00
2013-11-26 15:29:03 +00:00
// An xml string or object has been given
case Phaser . Loader . TEXTURE _ATLAS _XML _STARLING :
2013-11-25 04:40:04 +00:00
2013-11-26 15:29:03 +00:00
if ( typeof atlasData === 'string' )
{
2014-11-21 01:51:30 +00:00
var xml = this . parseXml ( atlasData ) ;
2013-11-25 04:40:04 +00:00
2014-11-21 01:51:30 +00:00
if ( ! xml )
2013-11-26 15:29:03 +00:00
{
throw new Error ( "Phaser.Loader. Invalid Texture Atlas XML given" ) ;
}
2014-11-21 01:51:30 +00:00
atlasData = xml ;
2013-11-26 15:29:03 +00:00
}
break ;
2013-11-25 04:40:04 +00:00
}
2013-11-26 15:29:03 +00:00
this . addToFileList ( 'textureatlas' , key , textureURL , { atlasURL : null , atlasData : atlasData , format : format } ) ;
2013-11-25 04:40:04 +00:00
}
return this ;
} ,
2014-11-22 22:42:27 +00:00
/ * *
* Add a synchronization point to the assets / files added within the supplied callback .
*
* A synchronization point denotes that an asset _must _ be completely loaded before
* subsequent assets can be loaded . An asset marked as a sync - point does not need to wait
* for previous assets to load ( unless they are sync - points ) . Resources , such as packs , may still
* be downloaded around sync - points , as long as they do not finalize loading .
*
* @ method Phader . Loader # withSyncPoints
* @ param { function } callback - The callback is invoked and is supplied with a single argument : the loader .
* @ param { object } [ callbackContext = ( loader ) ] - Context for the callback .
* @ return { Phaser . Loader } This Loader instance .
* /
withSyncPoint : function ( callback , callbackContext ) {
this . _withSyncPointDepth ++ ;
try {
callback . call ( callbackContext || this , this ) ;
} finally {
this . _withSyncPointDepth -- ;
}
return this ;
} ,
/ * *
* Add a synchronization point to a specific file / asset in the load queue .
*
* This has no effect on already loaded assets .
*
* @ method Phader . Loader # withSyncPoints
* @ param { function } callback - The callback is invoked and is supplied with a single argument : the loader .
* @ param { object } [ callbackContext = ( loader ) ] - Context for the callback .
* @ return { Phaser . Loader } This Loader instance .
* @ see { @ link Phaser . Loader # withSyncPoint withSyncPoint }
* /
addSyncPoint : function ( type , key ) {
var asset = this . getAsset ( type , key ) ;
if ( asset )
{
asset . file . syncPoint = true ;
}
return this ;
} ,
2013-11-25 04:40:04 +00:00
/ * *
2014-11-22 21:51:16 +00:00
* Remove a file / asset from the loading queue .
*
2014-11-23 04:57:42 +00:00
* A file that is loaded or has started loading cannot be removed .
2013-11-25 04:40:04 +00:00
*
* @ method Phaser . Loader # removeFile
2014-11-21 01:51:30 +00:00
* @ protected
2013-11-26 15:29:03 +00:00
* @ param { string } type - The type of resource to add to the list ( image , audio , xml , etc ) .
* @ param { string } key - Key of the file you want to remove .
2013-11-25 04:40:04 +00:00
* /
2013-11-26 15:29:03 +00:00
removeFile : function ( type , key ) {
2014-11-21 18:58:00 +00:00
var asset = this . getAsset ( type , key ) ;
2013-11-25 04:40:04 +00:00
2014-11-21 18:58:00 +00:00
if ( asset )
2013-11-26 15:29:03 +00:00
{
2014-11-21 18:58:00 +00:00
if ( ! asset . loaded && ! asset . loading ) {
this . _fileList . splice ( asset . index , 1 ) ;
}
2013-11-26 15:29:03 +00:00
}
2013-11-25 04:40:04 +00:00
} ,
/ * *
2014-11-22 21:51:16 +00:00
* Remove all file loading requests - this is _insufficient _ to stop current loading . Use ` reset ` instead .
2013-11-25 04:40:04 +00:00
*
* @ method Phaser . Loader # removeAll
2014-11-21 18:58:00 +00:00
* @ protected
2013-11-25 04:40:04 +00:00
* /
removeAll : function ( ) {
2013-11-26 15:29:03 +00:00
this . _fileList . length = 0 ;
2014-11-21 18:58:00 +00:00
this . _flightQueue . length = 0 ;
2013-11-25 04:40:04 +00:00
} ,
/ * *
* Start loading the assets . Normally you don ' t need to call this yourself as the StateManager will do so .
*
* @ method Phaser . Loader # start
* /
start : function ( ) {
if ( this . isLoading )
{
return ;
}
2014-11-21 20:06:44 +00:00
this . hasLoaded = false ;
2014-11-21 18:58:00 +00:00
this . isLoading = true ;
this . updateProgress ( ) ;
this . processLoadQueue ( ) ;
} ,
/ * *
* Process the next item ( s ) in the file / asset queue .
*
* Process the queue and start loading enough items to fill up the inflight queue .
*
* If a sync - file is encountered then subsequent asset processing is delayed until it completes .
* The exception to this rule is that packfiles can be downloaded ( but not processed ) even if
2014-11-23 04:57:42 +00:00
* there appear other sync files ( ie . packs ) - this enables multiple packfiles to be fetched in parallel .
2014-11-21 18:58:00 +00:00
* such as during the start phaser .
*
* @ method Phaser . Loader # processLoadQueue
* @ private
* /
processLoadQueue : function ( ) {
if ( ! this . isLoading )
{
console . warn ( 'Phaser.Loader - active loading cancelled/reset' ) ;
2014-11-23 04:58:08 +00:00
this . finishedLoading ( true ) ;
2014-11-21 18:58:00 +00:00
return ;
}
// Empty the flight queue as applicable
for ( var i = 0 ; i < this . _flightQueue . length ; i ++ )
2014-05-29 14:57:01 +00:00
{
2014-11-21 18:58:00 +00:00
var file = this . _flightQueue [ i ] ;
if ( file . loaded || file . error )
{
this . _flightQueue . splice ( i , 1 ) ;
i -- ;
file . loading = false ;
2014-11-22 21:55:32 +00:00
file . requestUrl = null ;
file . requestObject = null ;
2014-11-21 18:58:00 +00:00
if ( file . error )
{
this . onFileError . dispatch ( file . key , file ) ;
}
if ( file . type !== 'packfile' )
{
this . _loadedFileCount ++ ;
this . onFileComplete . dispatch ( this . progress , file . key , ! file . error , this . _loadedFileCount , this . _totalFileCount ) ;
}
2014-11-21 20:06:44 +00:00
else if ( file . type === 'packfile' && file . error )
{
2014-11-21 21:01:04 +00:00
// Non-error pack files are handled when processing the file queue
2014-11-21 20:06:44 +00:00
this . _loadedPackCount ++ ;
this . onPackComplete . dispatch ( file . key , ! file . error , this . _loadedPackCount , this . _totalPackCount ) ;
}
2014-11-21 18:58:00 +00:00
}
2014-05-29 14:57:01 +00:00
}
2014-11-21 18:58:00 +00:00
// When true further non-pack file downloads are suppressed
var syncblock = false ;
2014-11-22 21:49:18 +00:00
var inflightLimit = Phaser . Math . clamp (
2014-11-23 04:58:08 +00:00
this . maxParallelDownloads , 1 , this . enableParallel ? 12 : 1 ) ;
2014-11-21 18:58:00 +00:00
for ( var i = this . _processingHead ; i < this . _fileList . length ; i ++ )
2014-05-29 14:57:01 +00:00
{
2014-11-21 18:58:00 +00:00
var file = this . _fileList [ i ] ;
// Pack is fetched (ie. has data) and is currently at the start of the process queue.
if ( file . type === 'packfile' && ! file . error && file . data && i === this . _processingHead )
{
// Pack may have been supplied with initial data
this . loaded = true ;
// Processing the pack / adds more files
this . processPack ( file ) ;
this . _loadedPackCount ++ ;
this . onPackComplete . dispatch ( file . key , ! file . error , this . _loadedPackCount , this . _totalPackCount ) ;
}
if ( file . loaded || file . error )
{
2014-11-23 04:58:08 +00:00
// Item at the start of file list finished, can skip it in future
2014-11-21 18:58:00 +00:00
if ( i === this . _processingHead )
{
this . _processingHead = i + 1 ;
}
}
else if ( ! file . loading && this . _flightQueue . length < inflightLimit )
{
2014-11-23 04:58:08 +00:00
// -> not loaded/failed, not loading
2014-11-21 18:58:00 +00:00
if ( file . type === 'packfile' && ! file . data )
{
// Fetches the pack data: the pack is processed above as it reaches queue-start.
2014-11-21 21:01:04 +00:00
// (Packs do not trigger onLoadStart or onFileStart.)
2014-11-21 18:58:00 +00:00
this . _flightQueue . push ( file ) ;
file . loading = true ;
2014-11-21 21:01:04 +00:00
this . loadFile ( file ) ;
2014-11-21 18:58:00 +00:00
}
else if ( ! syncblock )
{
if ( ! this . _fileLoadStarted )
{
this . _fileLoadStarted = true ;
this . onLoadStart . dispatch ( ) ;
}
this . _flightQueue . push ( file ) ;
file . loading = true ;
this . onFileStart . dispatch ( this . progress , file . key , file . url ) ;
this . loadFile ( file ) ;
}
}
2014-11-22 22:42:27 +00:00
if ( ! file . loaded && file . syncPoint )
2014-11-21 18:58:00 +00:00
{
syncblock = true ;
}
// Stop looking if queue full - or if syncblocked and there are no more packs.
// (As only packs can be loaded around a syncblock)
2014-11-22 21:49:18 +00:00
if ( this . _flightQueue . length >= inflightLimit ||
2014-11-21 18:58:00 +00:00
( syncblock && this . _loadedPackCount === this . _totalPackCount ) )
{
break ;
}
}
this . updateProgress ( ) ;
// True when all items in the queue have been advanced over
// (There should be no inflight items as they are complete - loaded/error.)
if ( this . _processingHead >= this . _fileList . length )
{
2014-11-23 04:58:08 +00:00
this . finishedLoading ( ) ;
2014-11-21 18:58:00 +00:00
}
else if ( ! this . _flightQueue . length )
{
2014-11-23 04:58:08 +00:00
// Flight queue is empty but file list is not done being processed.
// This indicates a critical internal error with no known recovery.
console . warn ( "Phaser.Loader - aborting: processing queue empty, loading may have stalled" ) ;
2014-11-21 18:58:00 +00:00
var _this = this ;
setTimeout ( function ( ) {
2014-11-23 04:58:08 +00:00
_this . finishedLoading ( true ) ;
} , 2000 ) ;
2014-05-29 14:57:01 +00:00
}
} ,
2014-11-21 01:51:30 +00:00
/ * *
2014-11-21 18:58:00 +00:00
* The loading is all finished .
*
2014-11-23 04:58:08 +00:00
* @ method Phaser . Loader # finishedLoading
2014-11-21 18:58:00 +00:00
* @ private
2014-11-23 04:58:08 +00:00
* @ param { boolean } [ abnormal = true ] - True if the loading finished abnormally .
2014-11-21 01:51:30 +00:00
* /
2014-11-23 04:58:08 +00:00
finishedLoading : function ( abnormal ) {
if ( this . hasLoaded )
{
return ;
}
2014-11-21 18:58:00 +00:00
this . hasLoaded = true ;
this . isLoading = false ;
2014-11-23 04:58:08 +00:00
// If there were no files make sure to trigger the event anyway, for consistency
if ( ! abnormal && ! this . _fileLoadStarted )
{
this . _fileLoadStarted = true ;
this . onLoadStart . dispatch ( ) ;
}
2014-11-21 18:58:00 +00:00
this . onLoadComplete . dispatch ( ) ;
2014-11-21 01:51:30 +00:00
2014-11-21 20:06:44 +00:00
this . reset ( ) ;
2014-11-21 01:51:30 +00:00
} ,
2014-05-29 14:57:01 +00:00
/ * *
2014-11-21 18:58:00 +00:00
* Informs the loader that the given file resource has been fetched and processed ;
* or such a request has failed .
2014-05-29 14:57:01 +00:00
*
2014-11-21 21:01:04 +00:00
* @ method Phaser . Loader # asyncComplete
2014-05-29 14:57:01 +00:00
* @ private
2014-11-21 18:58:00 +00:00
* @ param { object } file
* @ param { string } [ error = '' ] - The error message , if any . No message implies no error .
2014-05-29 14:57:01 +00:00
* /
2014-11-21 21:01:04 +00:00
asyncComplete : function ( file , errorMessage ) {
2014-05-29 14:57:01 +00:00
2014-11-21 21:01:04 +00:00
if ( typeof errorMessage === 'undefined' ) { errorMessage = '' ; }
2013-11-25 04:40:04 +00:00
2014-11-21 18:58:00 +00:00
file . loaded = true ;
file . error = ! ! errorMessage ;
if ( errorMessage )
2013-11-25 04:40:04 +00:00
{
2014-11-21 18:58:00 +00:00
file . errorMessage = errorMessage ;
2014-11-21 21:01:04 +00:00
console . warn ( 'Phaser.Loader - ' + file . type + '[' + file . key + ']' + ': ' + errorMessage ) ;
2013-11-25 04:40:04 +00:00
}
2014-11-21 18:58:00 +00:00
this . processLoadQueue ( ) ;
2013-11-25 04:40:04 +00:00
} ,
2014-11-21 18:58:00 +00:00
/ * *
* Process pack data . This will usually modify the file list .
*
* @ method Phaser . Loader # processPack
* @ private
* @ param { object } pack
* /
processPack : function ( pack ) {
var packData = pack . data [ pack . key ] ;
if ( ! packData )
{
console . warn ( 'Phaser.Loader - ' + pack . key + ': pack has data, but not for pack key' ) ;
return ;
}
2014-05-29 14:57:01 +00:00
2014-11-21 01:51:30 +00:00
for ( var i = 0 ; i < packData . length ; i ++ )
2014-05-29 14:57:01 +00:00
{
2014-11-21 18:58:00 +00:00
var file = packData [ i ] ;
2014-05-29 14:57:01 +00:00
2014-11-21 01:51:30 +00:00
switch ( file . type )
2014-05-29 14:57:01 +00:00
{
2014-11-21 01:51:30 +00:00
case "image" :
this . image ( file . key , file . url , file . overwrite ) ;
break ;
2014-05-29 14:57:01 +00:00
2014-11-21 01:51:30 +00:00
case "text" :
this . text ( file . key , file . url , file . overwrite ) ;
break ;
2014-05-29 14:57:01 +00:00
2014-11-21 01:51:30 +00:00
case "json" :
this . json ( file . key , file . url , file . overwrite ) ;
break ;
2014-05-29 14:57:01 +00:00
2014-11-21 01:51:30 +00:00
case "xml" :
this . xml ( file . key , file . url , file . overwrite ) ;
break ;
2014-09-18 23:22:00 +00:00
2014-11-21 01:51:30 +00:00
case "script" :
2014-11-22 21:55:32 +00:00
this . script ( file . key , file . url , file . callback , pack . callbackContext || this ) ;
2014-11-21 01:51:30 +00:00
break ;
2014-05-29 14:57:01 +00:00
2014-11-21 01:51:30 +00:00
case "binary" :
2014-11-22 21:55:32 +00:00
this . binary ( file . key , file . url , file . callback , pack . callbackContext || this ) ;
2014-11-21 01:51:30 +00:00
break ;
2014-05-29 14:57:01 +00:00
2014-11-21 01:51:30 +00:00
case "spritesheet" :
this . spritesheet ( file . key , file . url , file . frameWidth , file . frameHeight , file . frameMax , file . margin , file . spacing ) ;
break ;
2014-05-29 14:57:01 +00:00
2014-11-21 01:51:30 +00:00
case "audio" :
this . audio ( file . key , file . urls , file . autoDecode ) ;
break ;
2014-05-29 14:57:01 +00:00
2014-11-21 01:51:30 +00:00
case "tilemap" :
this . tilemap ( file . key , file . url , file . data , Phaser . Tilemap [ file . format ] ) ;
break ;
2014-05-29 14:57:01 +00:00
2014-11-21 01:51:30 +00:00
case "physics" :
this . physics ( file . key , file . url , file . data , Phaser . Loader [ file . format ] ) ;
break ;
2014-05-29 14:57:01 +00:00
2014-11-21 01:51:30 +00:00
case "bitmapFont" :
this . bitmapFont ( file . key , file . textureURL , file . xmlURL , file . xmlData , file . xSpacing , file . ySpacing ) ;
break ;
2014-05-29 14:57:01 +00:00
2014-11-21 01:51:30 +00:00
case "atlasJSONArray" :
this . atlasJSONArray ( file . key , file . textureURL , file . atlasURL , file . atlasData ) ;
break ;
2014-05-29 14:57:01 +00:00
2014-11-21 01:51:30 +00:00
case "atlasJSONHash" :
this . atlasJSONHash ( file . key , file . textureURL , file . atlasURL , file . atlasData ) ;
break ;
2014-05-29 14:57:01 +00:00
2014-11-21 01:51:30 +00:00
case "atlasXML" :
this . atlasXML ( file . key , file . textureURL , file . atlasURL , file . atlasData ) ;
break ;
2014-05-29 14:57:01 +00:00
2014-11-21 01:51:30 +00:00
case "atlas" :
this . atlas ( file . key , file . textureURL , file . atlasURL , file . atlasData , Phaser . Loader [ file . format ] ) ;
break ;
2014-05-29 14:57:01 +00:00
}
}
} ,
2014-11-22 21:46:14 +00:00
/ * *
* Transforms the asset URL . The default implementation prepends the baseURL .
*
* @ method Phaser . Loader # transformUrl
* @ protected
* /
2014-11-22 22:42:27 +00:00
transformUrl : function ( url /*, file */ ) {
2014-11-22 21:46:14 +00:00
return this . baseURL + url ;
} ,
2014-05-29 14:57:01 +00:00
/ * *
2014-11-21 18:58:00 +00:00
* Start fetching a resource .
2014-05-29 14:57:01 +00:00
*
2014-11-21 21:01:04 +00:00
* All code paths , async or otherwise , from this function must return to ` asyncComplete ` .
2013-11-25 04:40:04 +00:00
*
* @ method Phaser . Loader # loadFile
* @ private
2014-11-21 18:58:00 +00:00
* @ param { object } file
2013-11-25 04:40:04 +00:00
* /
2014-11-21 18:58:00 +00:00
loadFile : function ( file ) {
2014-09-23 15:21:29 +00:00
2013-11-25 04:40:04 +00:00
// Image or Data?
switch ( file . type )
{
2014-11-21 21:01:04 +00:00
case 'packfile' :
2014-11-22 21:46:14 +00:00
this . xhrLoad ( file , this . transformUrl ( file . url , file ) , 'text' , this . fileComplete ) ;
2014-11-21 21:01:04 +00:00
break ;
2013-11-25 04:40:04 +00:00
case 'image' :
case 'spritesheet' :
case 'textureatlas' :
case 'bitmapfont' :
2014-11-21 21:01:04 +00:00
this . loadImageTag ( file ) ;
2013-11-25 04:40:04 +00:00
break ;
case 'audio' :
file . url = this . getAudioURL ( file . url ) ;
2014-11-21 01:51:30 +00:00
if ( file . url )
2013-11-25 04:40:04 +00:00
{
// WebAudio or Audio Tag?
if ( this . game . sound . usingWebAudio )
{
2014-11-22 21:46:14 +00:00
this . xhrLoad ( file , this . transformUrl ( file . url , file ) , 'arraybuffer' , this . fileComplete ) ;
2013-11-25 04:40:04 +00:00
}
else if ( this . game . sound . usingAudioTag )
{
2014-11-21 21:01:04 +00:00
this . loadAudioTag ( file ) ;
2013-11-25 04:40:04 +00:00
}
}
else
{
2014-11-21 18:58:00 +00:00
this . fileError ( file , null , 'no supported audio URL specified' ) ;
2013-11-25 04:40:04 +00:00
}
break ;
2014-02-21 18:48:06 +00:00
case 'json' :
2014-04-29 13:41:26 +00:00
2014-11-28 12:02:58 +00:00
this . xhrLoad ( file , this . transformUrl ( file . url , file ) , 'text' , this . jsonLoadComplete ) ;
2014-02-21 18:48:06 +00:00
break ;
2014-09-18 23:22:00 +00:00
case 'xml' :
2014-11-22 21:46:14 +00:00
this . xhrLoad ( file , this . transformUrl ( file . url , file ) , 'text' , this . xmlLoadComplete ) ;
2014-09-18 23:22:00 +00:00
break ;
2013-11-25 04:40:04 +00:00
case 'tilemap' :
2013-11-28 14:22:47 +00:00
if ( file . format === Phaser . Tilemap . TILED _JSON )
2013-11-25 04:40:04 +00:00
{
2014-11-22 21:46:14 +00:00
this . xhrLoad ( file , this . transformUrl ( file . url , file ) , 'text' , this . jsonLoadComplete ) ;
2013-11-25 04:40:04 +00:00
}
2013-11-28 14:22:47 +00:00
else if ( file . format === Phaser . Tilemap . CSV )
2013-11-25 04:40:04 +00:00
{
2014-11-22 21:46:14 +00:00
this . xhrLoad ( file , this . transformUrl ( file . url , file ) , 'text' , this . csvLoadComplete ) ;
2013-11-25 04:40:04 +00:00
}
else
{
2014-11-21 21:01:04 +00:00
this . asyncComplete ( file , "invalid Tilemap format: " + file . format ) ;
2013-11-25 04:40:04 +00:00
}
break ;
case 'text' :
2013-12-20 18:27:36 +00:00
case 'script' :
2014-02-14 23:51:49 +00:00
case 'physics' :
2014-11-22 21:46:14 +00:00
this . xhrLoad ( file , this . transformUrl ( file . url , file ) , 'text' , this . fileComplete ) ;
2013-11-25 04:40:04 +00:00
break ;
2013-11-28 05:43:35 +00:00
2013-12-20 18:27:36 +00:00
case 'binary' :
2014-11-22 21:46:14 +00:00
this . xhrLoad ( file , this . transformUrl ( file . url , file ) , 'arraybuffer' , this . fileComplete ) ;
2013-11-28 05:43:35 +00:00
break ;
2013-11-25 04:40:04 +00:00
}
} ,
2014-11-21 21:01:04 +00:00
/ * *
* Continue async loading through an Image tag .
* @ private
* /
loadImageTag : function ( file ) {
2014-11-22 21:46:14 +00:00
var _this = this ;
2014-11-21 21:01:04 +00:00
file . data = new Image ( ) ;
file . data . name = file . key ;
if ( this . crossOrigin )
{
file . data . crossOrigin = this . crossOrigin ;
}
file . data . onload = function ( ) {
if ( file . data . onload )
{
file . data . onload = null ;
file . data . onerror = null ;
_this . fileComplete ( file ) ;
}
} ;
2014-11-22 23:09:07 +00:00
file . data . onerror = function ( ) {
2014-11-21 21:01:04 +00:00
if ( file . data . onload )
{
file . data . onload = null ;
file . data . onerror = null ;
2014-11-22 23:09:07 +00:00
_this . fileError ( file ) ;
2014-11-21 21:01:04 +00:00
}
} ;
2014-11-22 21:46:14 +00:00
file . data . src = this . transformUrl ( file . url , file ) ;
2014-11-21 21:01:04 +00:00
// Image is immediately-available/cached
if ( file . data . complete && file . data . width && file . data . height )
{
file . data . onload = null ;
file . data . onerror = null ;
this . fileComplete ( file ) ;
}
} ,
/ * *
* Continue async loading through an Audio tag .
* @ private
* /
loadAudioTag : function ( file ) {
2014-11-22 21:46:14 +00:00
var _this = this ;
2014-11-21 21:01:04 +00:00
if ( this . game . sound . touchLocked )
{
// If audio is locked we can't do this yet, so need to queue this load request. Bum.
file . data = new Audio ( ) ;
file . data . name = file . key ;
file . data . preload = 'auto' ;
2014-11-22 21:46:14 +00:00
file . data . src = this . transformUrl ( file . url , file ) ;
2014-11-21 21:01:04 +00:00
this . fileComplete ( file ) ;
}
else
{
file . data = new Audio ( ) ;
file . data . name = file . key ;
var playThroughEvent = function ( ) {
file . data . removeEventListener ( 'canplaythrough' , playThroughEvent , false ) ;
file . data . onerror = null ;
// Why does this cycle through games?
Phaser . GAMES [ _this . game . id ] . load . fileComplete ( file ) ;
} ;
2014-11-22 23:09:07 +00:00
file . data . onerror = function ( ) {
2014-11-21 21:01:04 +00:00
file . data . removeEventListener ( 'canplaythrough' , playThroughEvent , false ) ;
file . data . onerror = null ;
2014-11-22 23:09:07 +00:00
_this . fileError ( file ) ;
2014-11-21 21:01:04 +00:00
} ;
file . data . preload = 'auto' ;
2014-11-22 21:46:14 +00:00
file . data . src = this . transformUrl ( file . url , file ) ;
2014-11-21 21:01:04 +00:00
file . data . addEventListener ( 'canplaythrough' , playThroughEvent , false ) ;
file . data . load ( ) ;
}
} ,
2014-05-29 16:05:13 +00:00
/ * *
* Starts the xhr loader .
2014-11-28 12:02:58 +00:00
*
* This is designed specifically to use with asset file processing .
2014-09-23 15:21:29 +00:00
*
2014-05-29 16:05:13 +00:00
* @ method Phaser . Loader # xhrLoad
* @ private
2014-11-21 18:58:00 +00:00
* @ param { object } file - The file / pack to load .
2014-05-29 16:05:13 +00:00
* @ param { string } url - The URL of the file .
* @ param { string } type - The xhr responseType .
2014-11-21 21:01:04 +00:00
* @ param { function } onload - The function to call on success . Invoked in ` this ` context and supplied with ` (file, xhr) ` arguments .
* @ param { function } [ onerror = fileError ] The function to call on error . Invoked in ` this ` context and supplied with ` (file, xhr) ` arguments .
2014-05-29 16:05:13 +00:00
* /
2014-11-21 18:58:00 +00:00
xhrLoad : function ( file , url , type , onload , onerror ) {
2014-05-29 14:57:01 +00:00
2014-11-28 12:02:58 +00:00
if ( this . useXDomainRequest && window . XDomainRequest )
{
this . xhrLoadWithXDR ( file , url , type , onload , onerror ) ;
return ;
}
2014-11-21 01:51:30 +00:00
var xhr = new XMLHttpRequest ( ) ;
xhr . open ( "GET" , url , true ) ;
xhr . responseType = type ;
2014-05-29 14:57:01 +00:00
2014-11-21 21:01:04 +00:00
onerror = onerror || this . fileError ;
2014-05-29 14:57:01 +00:00
var _this = this ;
2014-11-21 01:51:30 +00:00
xhr . onload = function ( ) {
2014-11-21 18:58:00 +00:00
try {
2014-11-21 21:01:04 +00:00
return onload . call ( _this , file , xhr ) ;
2014-11-21 18:58:00 +00:00
} catch ( e ) {
2014-11-21 21:01:04 +00:00
_this . asyncComplete ( file , e . message || 'Exception' ) ;
2014-11-21 18:58:00 +00:00
}
2014-05-29 14:57:01 +00:00
} ;
2014-11-21 01:51:30 +00:00
xhr . onerror = function ( ) {
2014-11-21 18:58:00 +00:00
try {
2014-11-21 21:01:04 +00:00
return onerror . call ( _this , file , xhr ) ;
2014-11-21 18:58:00 +00:00
} catch ( e ) {
2014-11-21 21:01:04 +00:00
_this . asyncComplete ( file , e . message || 'Exception' ) ;
2014-11-21 18:58:00 +00:00
}
2014-05-29 14:57:01 +00:00
} ;
2014-11-21 18:58:00 +00:00
file . requestObject = xhr ;
2014-11-21 21:01:04 +00:00
file . requestUrl = url ;
2014-11-21 18:58:00 +00:00
2014-11-21 01:51:30 +00:00
xhr . send ( ) ;
2014-05-29 14:57:01 +00:00
} ,
2014-11-21 21:01:04 +00:00
/ * *
* Starts the xhr loader - using XDomainRequest .
2014-11-28 12:02:58 +00:00
* This should _only _ be used with IE 9. Phaser does not support IE 8 and XDR is deprecated in IE 10.
*
* This is designed specifically to use with asset file processing .
2014-11-21 21:01:04 +00:00
*
* @ method Phaser . Loader # xhrLoad
* @ private
* @ param { object } file - The file / pack to load .
* @ param { string } url - The URL of the file .
* @ param { string } type - The xhr responseType .
* @ param { function } onload - The function to call on success . Invoked in ` this ` context and supplied with ` (file, xhr) ` arguments .
* @ param { function } [ onerror = fileError ] The function to call on error . Invoked in ` this ` context and supplied with ` (file, xhr) ` arguments .
2014-11-28 12:02:58 +00:00
* @ deprecated This is only relevant for IE 9.
2014-11-21 21:01:04 +00:00
* /
xhrLoadWithXDR : function ( file , url , type , onload , onerror ) {
2014-11-28 12:02:58 +00:00
// Special IE9 magic .. only
if ( ! this . _warnedAboutXDomainRequest &&
( ! this . game . device . ie || this . game . device . ieVersion >= 10 ) )
{
this . _warnedAboutXDomainRequest = true ;
console . warn ( "Phaser.Loader - using XDomainRequest outside of IE 9" ) ;
}
// Ref: http://blogs.msdn.com/b/ieinternals/archive/2010/05/13/xdomainrequest-restrictions-limitations-and-workarounds.aspx
2014-11-21 21:01:04 +00:00
var xhr = new window . XDomainRequest ( ) ;
xhr . open ( 'GET' , url , true ) ;
xhr . responseType = type ;
// XDomainRequest has a few quirks. Occasionally it will abort requests
// A way to avoid this is to make sure ALL callbacks are set even if not used
// More info here: http://stackoverflow.com/questions/15786966/xdomainrequest-aborts-post-on-ie-9
xhr . timeout = 3000 ;
onerror = onerror || this . fileError ;
var _this = this ;
xhr . onerror = function ( ) {
try {
return onerror . call ( _this , file , xhr ) ;
} catch ( e ) {
_this . asyncComplete ( file , e . message || 'Exception' ) ;
}
} ;
xhr . ontimeout = function ( ) {
try {
return onerror . call ( _this , file , xhr ) ;
} catch ( e ) {
_this . asyncComplete ( file , e . message || 'Exception' ) ;
}
} ;
xhr . onprogress = function ( ) { } ;
xhr . onload = function ( ) {
try {
return onload . call ( _this , file , xhr ) ;
} catch ( e ) {
_this . asyncComplete ( file , e . message || 'Exception' ) ;
}
} ;
2014-11-23 04:58:08 +00:00
file . requestObject = xhr ;
file . requestUrl = url ;
2014-11-21 21:01:04 +00:00
// Note: The xdr.send() call is wrapped in a timeout to prevent an issue with the interface where some requests are lost
// if multiple XDomainRequests are being sent at the same time.
setTimeout ( function ( ) {
xhr . send ( ) ;
} , 0 ) ;
} ,
2013-11-25 04:40:04 +00:00
/ * *
2014-11-21 01:51:30 +00:00
* Give a bunch of URLs , return the first URL that has an extension this device thinks it can play .
2014-09-23 15:21:29 +00:00
*
2015-02-09 02:23:45 +00:00
* It is assumed that the device can play "blob:" or "data:" URIs - There is no mime - type checking on data URIs .
2014-09-23 15:21:29 +00:00
*
2013-11-25 04:40:04 +00:00
* @ method Phaser . Loader # getAudioURL
* @ private
2014-11-21 01:51:30 +00:00
* @ param { string [ ] | string } urls - Either an array of audio file URLs or a string containing a single URL path .
* @ return { string } The URL to try and fetch ; or null .
2013-11-25 04:40:04 +00:00
* /
getAudioURL : function ( urls ) {
if ( typeof urls === 'string' ) { urls = [ urls ] ; }
for ( var i = 0 ; i < urls . length ; i ++ )
{
2015-02-09 02:23:45 +00:00
var url = urls [ i ] ;
2014-12-15 20:57:30 +00:00
2015-02-09 02:23:45 +00:00
// It is assumed that a direct-data URI can be played.
if ( url . indexOf ( "blob:" ) === 0 || url . indexOf ( "data:" ) === 0 )
2014-12-15 20:57:30 +00:00
{
2015-02-09 02:23:45 +00:00
return url ;
2014-12-15 20:57:30 +00:00
}
2015-02-09 02:23:45 +00:00
var extension = url . toLowerCase ( ) ;
2013-11-25 04:40:04 +00:00
extension = extension . substr ( ( Math . max ( 0 , extension . lastIndexOf ( "." ) ) || Infinity ) + 1 ) ;
2014-10-17 17:50:12 +00:00
if ( extension . indexOf ( "?" ) >= 0 )
{
extension = extension . substr ( 0 , extension . indexOf ( "?" ) ) ;
}
2013-11-25 04:40:04 +00:00
if ( this . game . device . canPlayAudio ( extension ) )
{
return urls [ i ] ;
}
}
return null ;
} ,
/ * *
2013-11-26 15:29:03 +00:00
* Error occured when loading a file .
2013-11-25 04:40:04 +00:00
*
* @ method Phaser . Loader # fileError
2014-11-21 01:51:30 +00:00
* @ private
* @ param { object } file
2014-11-21 18:58:00 +00:00
* @ param { ? XMLHttpRequest } xhr - XHR request , unspecified if loaded via other means ( eg . tags )
* @ param { string } reason
2013-11-25 04:40:04 +00:00
* /
2014-11-21 18:58:00 +00:00
fileError : function ( file , xhr , reason ) {
2013-11-25 04:40:04 +00:00
2014-11-22 23:09:07 +00:00
var url = file . requestUrl || this . transformUrl ( file . url , file ) ;
var message = 'error loading asset from URL ' + url ;
2013-11-25 04:40:04 +00:00
2014-11-21 18:58:00 +00:00
if ( ! reason && xhr )
{
reason = xhr . status ;
}
2013-11-25 04:40:04 +00:00
2014-11-21 18:58:00 +00:00
if ( reason )
{
message = message + ' (' + reason + ')' ;
}
2013-11-25 04:40:04 +00:00
2014-11-21 21:01:04 +00:00
this . asyncComplete ( file , message ) ;
2013-11-25 04:40:04 +00:00
} ,
/ * *
2014-11-21 18:58:00 +00:00
* Called when a file / resources had been downloaded and needs to be processed further .
2013-11-25 04:40:04 +00:00
*
* @ method Phaser . Loader # fileComplete
2014-11-21 18:58:00 +00:00
* @ private
2014-11-21 01:51:30 +00:00
* @ param { object } file - File loaded
2014-11-21 18:58:00 +00:00
* @ param { ? XMLHttpRequest } xhr - XHR request , unspecified if loaded via other means ( eg . tags )
2013-11-25 04:40:04 +00:00
* /
2014-11-21 01:51:30 +00:00
fileComplete : function ( file , xhr ) {
2013-11-25 04:40:04 +00:00
var loadNext = true ;
switch ( file . type )
{
2014-11-21 21:01:04 +00:00
case 'packfile' :
// Pack data must never be false-ish after it is fetched without error
var data = JSON . parse ( xhr . responseText ) ;
file . data = data || { } ;
break ;
2013-11-25 04:40:04 +00:00
case 'image' :
this . game . cache . addImage ( file . key , file . url , file . data ) ;
break ;
case 'spritesheet' :
2013-12-13 14:04:14 +00:00
this . game . cache . addSpriteSheet ( file . key , file . url , file . data , file . frameWidth , file . frameHeight , file . frameMax , file . margin , file . spacing ) ;
2013-11-25 04:40:04 +00:00
break ;
case 'textureatlas' :
if ( file . atlasURL == null )
{
this . game . cache . addTextureAtlas ( file . key , file . url , file . data , file . atlasData , file . format ) ;
}
else
{
// Load the JSON or XML before carrying on with the next file
loadNext = false ;
if ( file . format == Phaser . Loader . TEXTURE _ATLAS _JSON _ARRAY || file . format == Phaser . Loader . TEXTURE _ATLAS _JSON _HASH )
{
2014-11-22 21:46:14 +00:00
this . xhrLoad ( file , this . transformUrl ( file . atlasURL , file ) , 'text' , this . jsonLoadComplete ) ;
2013-11-25 04:40:04 +00:00
}
else if ( file . format == Phaser . Loader . TEXTURE _ATLAS _XML _STARLING )
{
2014-11-22 21:46:14 +00:00
this . xhrLoad ( file , this . transformUrl ( file . atlasURL , file ) , 'text' , this . xmlLoadComplete ) ;
2013-11-25 04:40:04 +00:00
}
else
{
throw new Error ( "Phaser.Loader. Invalid Texture Atlas format: " + file . format ) ;
}
}
break ;
case 'bitmapfont' :
2014-11-22 21:55:32 +00:00
if ( ! file . xmlURL )
2013-11-25 04:40:04 +00:00
{
2014-02-14 04:34:57 +00:00
this . game . cache . addBitmapFont ( file . key , file . url , file . data , file . xmlData , file . xSpacing , file . ySpacing ) ;
2013-11-25 04:40:04 +00:00
}
else
{
// Load the XML before carrying on with the next file
loadNext = false ;
2014-11-22 21:46:14 +00:00
this . xhrLoad ( file , this . transformUrl ( file . xmlURL , file ) , 'text' , this . xmlLoadComplete ) ;
2013-11-25 04:40:04 +00:00
}
break ;
case 'audio' :
if ( this . game . sound . usingWebAudio )
{
2014-11-21 01:51:30 +00:00
file . data = xhr . response ;
2013-11-25 04:40:04 +00:00
this . game . cache . addSound ( file . key , file . url , file . data , true , false ) ;
if ( file . autoDecode )
{
var that = this ;
var key = file . key ;
2014-03-23 08:33:53 +00:00
this . game . cache . updateSound ( key , 'isDecoding' , true ) ;
2013-11-25 04:40:04 +00:00
this . game . sound . context . decodeAudioData ( file . data , function ( buffer ) {
if ( buffer )
{
2013-11-27 16:33:49 +00:00
that . game . cache . decodedSound ( key , buffer ) ;
2013-12-13 14:04:14 +00:00
that . game . sound . onSoundDecode . dispatch ( key , that . game . cache . getSound ( key ) ) ;
2013-11-25 04:40:04 +00:00
}
} ) ;
}
}
else
{
this . game . cache . addSound ( file . key , file . url , file . data , false , true ) ;
}
break ;
case 'text' :
2014-11-21 01:51:30 +00:00
file . data = xhr . responseText ;
2013-11-25 04:40:04 +00:00
this . game . cache . addText ( file . key , file . url , file . data ) ;
break ;
2013-11-28 05:43:35 +00:00
2014-02-14 23:51:49 +00:00
case 'physics' :
2014-11-21 01:51:30 +00:00
var data = JSON . parse ( this . responseText ) ;
2014-02-14 23:51:49 +00:00
this . game . cache . addPhysicsData ( file . key , file . url , data , file . format ) ;
break ;
2013-11-28 05:43:35 +00:00
case 'script' :
file . data = document . createElement ( 'script' ) ;
file . data . language = 'javascript' ;
file . data . type = 'text/javascript' ;
2013-11-29 12:26:53 +00:00
file . data . defer = false ;
2014-11-21 18:58:00 +00:00
file . data . text = xhr . responseText ;
2013-11-28 05:43:35 +00:00
document . head . appendChild ( file . data ) ;
2014-02-26 02:45:06 +00:00
if ( file . callback )
{
2014-11-21 18:58:00 +00:00
file . data = file . callback . call ( file . callbackContext , file . key , xhr . responseText ) ;
2014-02-26 02:45:06 +00:00
}
2013-11-28 05:43:35 +00:00
break ;
2013-12-20 18:27:36 +00:00
case 'binary' :
if ( file . callback )
{
2014-11-21 01:51:30 +00:00
file . data = file . callback . call ( file . callbackContext , file . key , this . response ) ;
2013-12-20 18:27:36 +00:00
}
else
{
2014-11-21 01:51:30 +00:00
file . data = xhr . response ;
2013-12-20 18:27:36 +00:00
}
this . game . cache . addBinary ( file . key , file . data ) ;
break ;
2013-11-25 04:40:04 +00:00
}
if ( loadNext )
{
2014-11-21 21:01:04 +00:00
this . asyncComplete ( file ) ;
2013-11-25 04:40:04 +00:00
}
} ,
/ * *
2014-11-21 18:58:00 +00:00
* Successfully loaded a JSON file - only used for certain types .
2013-11-25 04:40:04 +00:00
*
* @ method Phaser . Loader # jsonLoadComplete
2014-11-21 01:51:30 +00:00
* @ private
* @ param { object } file - File associated with this request
* @ param { XMLHttpRequest } xhr
2013-11-25 04:40:04 +00:00
* /
2014-11-21 01:51:30 +00:00
jsonLoadComplete : function ( file , xhr ) {
2013-11-25 04:40:04 +00:00
2014-11-21 01:51:30 +00:00
var data = JSON . parse ( xhr . responseText ) ;
2013-11-28 14:22:47 +00:00
if ( file . type === 'tilemap' )
2013-11-25 04:40:04 +00:00
{
this . game . cache . addTilemap ( file . key , file . url , data , file . format ) ;
}
2014-02-21 18:48:06 +00:00
else if ( file . type === 'json' )
{
this . game . cache . addJSON ( file . key , file . url , data ) ;
}
2013-11-25 04:40:04 +00:00
else
{
this . game . cache . addTextureAtlas ( file . key , file . url , file . data , data , file . format ) ;
}
2014-11-21 21:01:04 +00:00
this . asyncComplete ( file ) ;
2013-11-25 04:40:04 +00:00
} ,
/ * *
2014-11-21 18:58:00 +00:00
* Successfully loaded a CSV file - only used for certain types .
2013-11-25 04:40:04 +00:00
*
* @ method Phaser . Loader # csvLoadComplete
2014-11-21 01:51:30 +00:00
* @ private
* @ param { object } file - File associated with this request
* @ param { XMLHttpRequest } xhr
2013-11-25 04:40:04 +00:00
* /
2014-11-21 01:51:30 +00:00
csvLoadComplete : function ( file , xhr ) {
2013-11-25 04:40:04 +00:00
2014-11-21 01:51:30 +00:00
var data = xhr . responseText ;
2013-11-28 14:22:47 +00:00
2013-11-25 04:40:04 +00:00
this . game . cache . addTilemap ( file . key , file . url , data , file . format ) ;
2014-11-21 21:01:04 +00:00
this . asyncComplete ( file ) ;
2013-11-25 04:40:04 +00:00
} ,
/ * *
2014-11-21 18:58:00 +00:00
* Successfully loaded an XML file - only used for certain types .
2013-11-25 04:40:04 +00:00
*
* @ method Phaser . Loader # xmlLoadComplete
2014-11-21 01:51:30 +00:00
* @ private
* @ param { object } file - File associated with this request
* @ param { XMLHttpRequest } xhr
2013-11-25 04:40:04 +00:00
* /
2014-11-21 01:51:30 +00:00
xmlLoadComplete : function ( file , xhr ) {
2013-11-25 04:40:04 +00:00
2015-02-09 02:23:45 +00:00
// Always try parsing the content as XML, regardless of actually response type
2014-11-21 01:51:30 +00:00
var data = xhr . responseText ;
var xml = this . parseXml ( data ) ;
if ( ! xml )
{
2015-02-09 02:23:45 +00:00
var responseType = xhr . responseType || xhr . contentType ; // contentType for MS-XDomainRequest
console . warn ( 'Phaser.Loader - ' + file . key + ': invalid XML (' + responseType + ')' ) ;
2014-11-21 21:01:04 +00:00
this . asyncComplete ( file , "invalid XML" ) ;
2014-11-21 18:58:00 +00:00
return ;
2014-11-21 01:51:30 +00:00
}
if ( file . type === 'bitmapfont' )
{
this . game . cache . addBitmapFont ( file . key , file . url , file . data , xml , file . xSpacing , file . ySpacing ) ;
}
else if ( file . type === 'textureatlas' )
{
this . game . cache . addTextureAtlas ( file . key , file . url , file . data , xml , file . format ) ;
}
else if ( file . type === 'xml' )
{
this . game . cache . addXML ( file . key , file . url , xml ) ;
}
2013-11-25 04:40:04 +00:00
2014-11-21 21:01:04 +00:00
this . asyncComplete ( file ) ;
2014-11-21 18:58:00 +00:00
} ,
2014-11-21 01:51:30 +00:00
/ * *
* Parses string data as XML .
*
* @ method parseXml
* @ private
* @ param { string } data - The XML text to parse
* @ return { ? XMLDocument } Returns the xml document , or null if such could not parsed to a valid document .
* /
parseXml : function ( data ) {
var xml ;
2013-11-25 04:40:04 +00:00
try
{
if ( window [ 'DOMParser' ] )
{
var domparser = new DOMParser ( ) ;
xml = domparser . parseFromString ( data , "text/xml" ) ;
}
else
{
xml = new ActiveXObject ( "Microsoft.XMLDOM" ) ;
2014-11-21 18:58:00 +00:00
// Why is this 'false'?
2013-11-25 04:40:04 +00:00
xml . async = 'false' ;
xml . loadXML ( data ) ;
}
}
catch ( e )
{
2014-11-21 01:51:30 +00:00
xml = null ;
2013-11-25 04:40:04 +00:00
}
if ( ! xml || ! xml . documentElement || xml . getElementsByTagName ( "parsererror" ) . length )
{
2014-11-21 01:51:30 +00:00
return null ;
2013-11-25 04:40:04 +00:00
}
2014-11-21 01:51:30 +00:00
else
2014-09-18 23:22:00 +00:00
{
2014-11-21 01:51:30 +00:00
return xml ;
2014-09-18 23:22:00 +00:00
}
2013-11-25 04:40:04 +00:00
} ,
/ * *
2014-11-21 18:58:00 +00:00
* Update the loading sprite progress .
2013-11-25 04:40:04 +00:00
*
2014-05-29 16:05:13 +00:00
* @ method Phaser . Loader # nextFile
* @ private
2014-11-21 01:51:30 +00:00
* @ param { object } previousFile
2013-11-26 15:29:03 +00:00
* @ param { boolean } success - Whether the previous asset loaded successfully or not .
2013-11-25 04:40:04 +00:00
* /
2014-11-21 18:58:00 +00:00
updateProgress : function ( ) {
2013-11-25 04:40:04 +00:00
2014-11-21 18:58:00 +00:00
if ( this . preloadSprite )
2013-11-25 04:40:04 +00:00
{
if ( this . preloadSprite . direction === 0 )
{
2014-03-18 16:23:44 +00:00
this . preloadSprite . rect . width = Math . floor ( ( this . preloadSprite . width / 100 ) * this . progress ) ;
2013-11-25 04:40:04 +00:00
}
else
{
2014-03-18 16:23:44 +00:00
this . preloadSprite . rect . height = Math . floor ( ( this . preloadSprite . height / 100 ) * this . progress ) ;
2013-11-25 04:40:04 +00:00
}
2014-09-09 11:48:38 +00:00
this . preloadSprite . sprite . updateCrop ( ) ;
2013-11-25 04:40:04 +00:00
}
2013-11-26 15:29:03 +00:00
} ,
/ * *
* Returns the number of files that have already been loaded , even if they errored .
*
2014-05-29 16:05:13 +00:00
* @ method Phaser . Loader # totalLoadedFiles
2014-11-23 04:57:42 +00:00
* @ protected
2013-11-26 15:29:03 +00:00
* @ return { number } The number of files that have already been loaded ( even if they errored )
* /
totalLoadedFiles : function ( ) {
2014-11-21 18:58:00 +00:00
return this . _loadedFileCount ;
2013-11-26 15:29:03 +00:00
} ,
/ * *
2014-05-29 14:57:01 +00:00
* Returns the number of files still waiting to be processed in the load queue . This value decreases as each file in the queue is loaded .
2013-11-26 15:29:03 +00:00
*
2014-05-29 16:05:13 +00:00
* @ method Phaser . Loader # totalQueuedFiles
2014-11-23 04:57:42 +00:00
* @ protected
2013-11-26 15:29:03 +00:00
* @ return { number } The number of files that still remain in the load queue .
* /
totalQueuedFiles : function ( ) {
2014-11-21 18:58:00 +00:00
return this . _totalFileCount - this . _loadedFileCount ;
2013-11-26 15:29:03 +00:00
2014-05-29 14:57:01 +00:00
} ,
/ * *
* Returns the number of asset packs that have already been loaded , even if they errored .
*
2014-05-29 16:05:13 +00:00
* @ method Phaser . Loader # totalLoadedPacks
2014-11-23 04:57:42 +00:00
* @ protected
2014-05-29 14:57:01 +00:00
* @ return { number } The number of asset packs that have already been loaded ( even if they errored )
* /
totalLoadedPacks : function ( ) {
2014-11-21 18:58:00 +00:00
return this . _totalPackCount ;
2014-05-29 14:57:01 +00:00
} ,
/ * *
* Returns the number of asset packs still waiting to be processed in the load queue . This value decreases as each pack in the queue is loaded .
*
2014-05-29 16:05:13 +00:00
* @ method Phaser . Loader # totalQueuedPacks
2014-11-23 04:57:42 +00:00
* @ protected
2014-05-29 14:57:01 +00:00
* @ return { number } The number of asset packs that still remain in the load queue .
* /
totalQueuedPacks : function ( ) {
2014-11-21 18:58:00 +00:00
return this . _totalPackCount - this . _loadedPackCount ;
2014-05-29 14:57:01 +00:00
2014-11-21 18:58:00 +00:00
}
2014-05-29 14:57:01 +00:00
2014-11-21 18:58:00 +00:00
} ;
2014-05-29 14:57:01 +00:00
2014-11-21 18:58:00 +00:00
/ * *
* The non - rounded load progress value ( from 0.0 to 100.0 ) .
*
* A general indicator of the progress .
* It is possible for the progress to decrease , after ` onLoadStart ` , if more files are dynamically added .
*
* @ memberof Phaser . Loader # progressFloat
* @ property { number }
* /
Object . defineProperty ( Phaser . Loader . prototype , "progressFloat" , {
get : function ( ) {
2014-11-21 20:06:44 +00:00
var progress = ( this . _loadedFileCount / this . _totalFileCount ) * 100 ;
2014-11-21 18:58:00 +00:00
return Phaser . Math . clamp ( progress || 0 , 0 , 100 ) ;
2013-11-25 04:40:04 +00:00
}
2013-08-28 06:02:55 +00:00
2014-11-21 18:58:00 +00:00
} ) ;
/ * *
* The rounded load progress percentage value ( from 0 to 100 ) . See { @ link Phaser . Loader # progressFloat } .
*
* @ name Phaser . Loader # progress
* @ property { integer }
* /
Object . defineProperty ( Phaser . Loader . prototype , "progress" , {
get : function ( ) {
return Math . round ( this . progressFloat ) ;
}
} ) ;
2013-12-30 16:54:00 +00:00
Phaser . Loader . prototype . constructor = Phaser . Loader ;