2013-11-27 16:33:49 +00:00
/ * *
* @ author Richard Davey < rich @ photonstorm . com >
2016-04-04 21:15:01 +00:00
* @ copyright 2016 Photon Storm Ltd .
2013-11-27 16:33:49 +00:00
* @ license { @ link https : //github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
* /
/ * *
* Phaser . TilemapParser parses data objects from Phaser . Loader that need more preparation before they can be inserted into a Tilemap .
*
* @ class Phaser . TilemapParser
2015-08-24 11:36:23 +00:00
* @ static
2013-11-27 16:33:49 +00:00
* /
2013-10-11 03:42:11 +00:00
Phaser . TilemapParser = {
2015-08-24 11:36:23 +00:00
/ * *
2016-04-03 22:08:41 +00:00
* When scanning the Tiled map data the TilemapParser can either insert a null value ( true ) or
2015-08-24 11:36:23 +00:00
* a Phaser . Tile instance with an index of - 1 ( false , the default ) . Depending on your game type
* depends how this should be configured . If you ' ve a large sparsely populated map and the tile
* data doesn ' t need to change then setting this value to ` true ` will help with memory consumption .
* However if your map is small , or you need to update the tiles ( perhaps the map dynamically changes
* during the game ) then leave the default value set .
*
2015-08-24 14:43:45 +00:00
* @ constant
2015-08-24 11:36:23 +00:00
* @ type { boolean }
* /
INSERT _NULL : false ,
2013-11-27 16:33:49 +00:00
/ * *
2016-06-26 23:46:52 +00:00
* Parse tilemap data from the cache and creates data for a Tilemap object .
2014-03-03 13:43:33 +00:00
*
2013-11-27 16:33:49 +00:00
* @ method Phaser . TilemapParser . parse
* @ param { Phaser . Game } game - Game reference to the currently running game .
2013-12-18 16:56:14 +00:00
* @ param { string } key - The key of the tilemap in the Cache .
2014-03-03 13:43:33 +00:00
* @ param { number } [ tileWidth = 32 ] - The pixel width of a single map tile . If using CSV data you must specify this . Not required if using Tiled map data .
* @ param { number } [ tileHeight = 32 ] - The pixel height of a single map tile . If using CSV data you must specify this . Not required if using Tiled map data .
* @ param { number } [ width = 10 ] - The width of the map in tiles . If this map is created from Tiled or CSV data you don ' t need to specify this .
* @ param { number } [ height = 10 ] - The height of the map in tiles . If this map is created from Tiled or CSV data you don ' t need to specify this .
2013-12-18 16:56:14 +00:00
* @ return { object } The parsed map object .
2013-11-27 16:33:49 +00:00
* /
2016-06-27 02:41:46 +00:00
parse : function ( game , key , tileWidth , tileHeight , width , height ) {
2014-03-03 13:43:33 +00:00
2015-07-22 09:37:15 +00:00
if ( tileWidth === undefined ) { tileWidth = 32 ; }
if ( tileHeight === undefined ) { tileHeight = 32 ; }
if ( width === undefined ) { width = 10 ; }
if ( height === undefined ) { height = 10 ; }
2013-12-18 16:56:14 +00:00
2015-07-22 09:37:15 +00:00
if ( key === undefined )
2014-03-03 05:19:46 +00:00
{
return this . getEmptyData ( ) ;
}
2014-03-03 13:43:33 +00:00
if ( key === null )
{
return this . getEmptyData ( tileWidth , tileHeight , width , height ) ;
}
2013-12-18 16:56:14 +00:00
var map = game . cache . getTilemapData ( key ) ;
2013-10-11 05:30:28 +00:00
2013-12-18 16:56:14 +00:00
if ( map )
2013-11-25 04:40:04 +00:00
{
2013-12-18 16:56:14 +00:00
if ( map . format === Phaser . Tilemap . CSV )
{
2014-03-03 13:43:33 +00:00
return this . parseCSV ( key , map . data , tileWidth , tileHeight ) ;
2013-12-18 16:56:14 +00:00
}
2014-03-10 00:50:06 +00:00
else if ( ! map . format || map . format === Phaser . Tilemap . TILED _JSON )
2013-12-18 16:56:14 +00:00
{
2016-06-27 02:41:46 +00:00
return this . parseTiledJSON ( map . data ) ;
2013-12-18 16:56:14 +00:00
}
2013-11-25 04:40:04 +00:00
}
2013-12-18 16:56:14 +00:00
else
2013-11-25 04:40:04 +00:00
{
2014-03-03 05:19:46 +00:00
console . warn ( 'Phaser.TilemapParser.parse - No map data found for key ' + key ) ;
2013-11-25 04:40:04 +00:00
}
2013-10-11 05:30:28 +00:00
2013-11-25 04:40:04 +00:00
} ,
2013-10-11 05:30:28 +00:00
2013-11-25 04:40:04 +00:00
/ * *
2013-11-27 16:33:49 +00:00
* Parses a CSV file into valid map data .
2014-03-03 13:43:33 +00:00
*
2013-11-27 16:33:49 +00:00
* @ method Phaser . TilemapParser . parseCSV
2015-11-17 14:07:48 +00:00
* @ param { string } key - The name you want to give the map data .
2013-11-27 16:33:49 +00:00
* @ param { string } data - The CSV file data .
2014-03-03 13:43:33 +00:00
* @ param { number } [ tileWidth = 32 ] - The pixel width of a single map tile . If using CSV data you must specify this . Not required if using Tiled map data .
* @ param { number } [ tileHeight = 32 ] - The pixel height of a single map tile . If using CSV data you must specify this . Not required if using Tiled map data .
2013-11-27 16:33:49 +00:00
* @ return { object } Generated map data .
2013-11-25 04:40:04 +00:00
* /
2014-03-03 13:43:33 +00:00
parseCSV : function ( key , data , tileWidth , tileHeight ) {
var map = this . getEmptyData ( ) ;
2013-10-11 03:42:11 +00:00
2013-11-25 04:40:04 +00:00
// Trim any rogue whitespace from the data
data = data . trim ( ) ;
2013-10-11 03:42:11 +00:00
2013-11-25 04:40:04 +00:00
var output = [ ] ;
var rows = data . split ( "\n" ) ;
var height = rows . length ;
var width = 0 ;
2013-10-11 17:18:27 +00:00
2014-03-03 13:43:33 +00:00
for ( var y = 0 ; y < rows . length ; y ++ )
2013-11-25 04:40:04 +00:00
{
2014-03-03 13:43:33 +00:00
output [ y ] = [ ] ;
2013-10-11 03:42:11 +00:00
2014-03-03 13:43:33 +00:00
var column = rows [ y ] . split ( "," ) ;
2013-10-11 05:30:28 +00:00
2014-03-03 13:43:33 +00:00
for ( var x = 0 ; x < column . length ; x ++ )
2013-11-25 04:40:04 +00:00
{
2014-04-28 22:21:57 +00:00
output [ y ] [ x ] = new Phaser . Tile ( map . layers [ 0 ] , parseInt ( column [ x ] , 10 ) , x , y , tileWidth , tileHeight ) ;
2013-11-25 04:40:04 +00:00
}
2013-10-11 05:30:28 +00:00
2013-11-25 04:40:04 +00:00
if ( width === 0 )
{
width = column . length ;
}
}
2014-04-28 22:21:57 +00:00
map . format = Phaser . Tilemap . CSV ;
2014-03-03 13:43:33 +00:00
map . name = key ;
map . width = width ;
map . height = height ;
map . tileWidth = tileWidth ;
map . tileHeight = tileHeight ;
map . widthInPixels = width * tileWidth ;
map . heightInPixels = height * tileHeight ;
2013-12-05 18:12:16 +00:00
2014-03-03 13:43:33 +00:00
map . layers [ 0 ] . width = width ;
map . layers [ 0 ] . height = height ;
map . layers [ 0 ] . widthInPixels = map . widthInPixels ;
map . layers [ 0 ] . heightInPixels = map . heightInPixels ;
map . layers [ 0 ] . data = output ;
return map ;
2013-11-25 04:40:04 +00:00
} ,
2013-10-11 05:30:28 +00:00
2014-02-18 03:01:51 +00:00
/ * *
* Returns an empty map data object .
2014-04-28 22:21:57 +00:00
*
2014-02-18 03:01:51 +00:00
* @ method Phaser . TilemapParser . getEmptyData
* @ return { object } Generated map data .
* /
2014-03-03 13:43:33 +00:00
getEmptyData : function ( tileWidth , tileHeight , width , height ) {
2014-02-18 03:01:51 +00:00
2016-07-20 18:27:32 +00:00
return {
width : ( width !== undefined && width !== null ) ? width : 0 ,
height : ( height !== undefined && height !== null ) ? height : 0 ,
tileWidth : ( tileWidth !== undefined && tileWidth !== null ) ? tileWidth : 0 ,
tileHeight : ( tileHeight !== undefined && tileHeight !== null ) ? tileHeight : 0 ,
orientation : 'orthogonal' ,
version : '1' ,
properties : { } ,
2014-02-18 03:01:51 +00:00
widthInPixels : 0 ,
heightInPixels : 0 ,
2016-07-20 18:27:32 +00:00
layers : [
{
name : 'layer' ,
x : 0 ,
y : 0 ,
width : 0 ,
height : 0 ,
widthInPixels : 0 ,
heightInPixels : 0 ,
alpha : 1 ,
visible : true ,
properties : { } ,
indexes : [ ] ,
callbacks : [ ] ,
bodies : [ ] ,
data : [ ]
}
] ,
images : [ ] ,
objects : { } ,
collision : { } ,
tilesets : [ ] ,
tiles : [ ]
2014-02-18 03:01:51 +00:00
} ;
} ,
2013-11-25 04:40:04 +00:00
/ * *
2013-11-27 16:33:49 +00:00
* Parses a Tiled JSON file into valid map data .
* @ method Phaser . TilemapParser . parseJSON
2013-12-18 16:56:14 +00:00
* @ param { object } json - The JSON map data .
* @ return { object } Generated and parsed map data .
2013-11-25 04:40:04 +00:00
* /
2016-06-27 02:41:46 +00:00
parseTiledJSON : function ( json ) {
2013-10-11 05:30:28 +00:00
2013-12-19 03:49:28 +00:00
if ( json . orientation !== 'orthogonal' )
{
2014-11-27 03:42:42 +00:00
console . warn ( 'TilemapParser.parseTiledJSON - Only orthogonal map types are supported in this version of Phaser' ) ;
2013-12-19 03:49:28 +00:00
return null ;
}
// Map data will consist of: layers, objects, images, tilesets, sizes
2016-07-20 18:27:32 +00:00
var map = {
width : json . width ,
height : json . height ,
tileWidth : json . tilewidth ,
tileHeight : json . tileheight ,
orientation : json . orientation ,
format : Phaser . Tilemap . TILED _JSON ,
version : json . version ,
properties : json . properties ,
2016-08-15 13:46:05 +00:00
widthInPixels : json . width * json . tilewidth ,
heightInPixels : json . height * json . tileheight
2016-07-20 18:27:32 +00:00
} ;
2013-12-19 03:49:28 +00:00
2013-12-18 04:40:10 +00:00
// Tile Layers
2013-11-25 04:40:04 +00:00
var layers = [ ] ;
for ( var i = 0 ; i < json . layers . length ; i ++ )
{
2013-12-18 04:40:10 +00:00
if ( json . layers [ i ] . type !== 'tilelayer' )
2013-11-25 04:40:04 +00:00
{
continue ;
}
2015-08-24 11:03:32 +00:00
var curl = json . layers [ i ] ;
2016-04-03 22:08:41 +00:00
2015-09-13 15:07:57 +00:00
// Base64 decode data if necessary
2016-04-03 22:08:41 +00:00
// NOTE: uncompressed base64 only.
2016-07-20 18:27:32 +00:00
if ( ! curl . compression && curl . encoding && curl . encoding === 'base64' )
{
var binaryString = window . atob ( curl . data ) ;
2015-09-13 15:15:02 +00:00
var len = binaryString . length ;
2016-07-20 18:27:32 +00:00
var bytes = new Array ( len ) ;
2015-09-14 23:38:58 +00:00
// Interpret binaryString as an array of bytes representing
2016-04-03 22:08:41 +00:00
// little-endian encoded uint32 values.
2016-07-20 18:27:32 +00:00
for ( var j = 0 ; j < len ; j += 4 )
{
bytes [ j / 4 ] = (
binaryString . charCodeAt ( j ) |
binaryString . charCodeAt ( j + 1 ) << 8 |
binaryString . charCodeAt ( j + 2 ) << 16 |
binaryString . charCodeAt ( j + 3 ) << 24
) >>> 0 ;
2015-09-13 15:07:57 +00:00
}
2016-07-20 18:27:32 +00:00
2015-09-13 15:07:57 +00:00
curl . data = bytes ;
2016-07-20 18:27:32 +00:00
2016-04-03 22:33:38 +00:00
delete curl . encoding ;
2015-09-13 15:07:57 +00:00
}
2016-07-20 18:27:32 +00:00
else if ( curl . compression )
{
2016-04-03 22:08:41 +00:00
console . warn ( 'TilemapParser.parseTiledJSON - Layer compression is unsupported, skipping layer \'' + curl . name + '\'' ) ;
continue ;
}
2015-09-13 15:07:57 +00:00
2013-11-25 04:40:04 +00:00
var layer = {
2015-08-24 11:03:32 +00:00
name : curl . name ,
x : curl . x ,
y : curl . y ,
width : curl . width ,
height : curl . height ,
widthInPixels : curl . width * json . tilewidth ,
heightInPixels : curl . height * json . tileheight ,
alpha : curl . opacity ,
visible : curl . visible ,
2013-12-05 18:12:16 +00:00
properties : { } ,
2014-01-14 22:34:41 +00:00
indexes : [ ] ,
2014-02-18 03:01:51 +00:00
callbacks : [ ] ,
bodies : [ ]
2013-11-25 04:40:04 +00:00
} ;
2015-08-24 11:03:32 +00:00
if ( curl . properties )
2013-12-05 18:12:16 +00:00
{
2015-08-24 11:03:32 +00:00
layer . properties = curl . properties ;
2013-12-05 18:12:16 +00:00
}
var x = 0 ;
var row = [ ] ;
2013-11-25 04:40:04 +00:00
var output = [ ] ;
2015-02-08 20:03:19 +00:00
var rotation , flipped , flippedVal , gid ;
2013-12-05 18:12:16 +00:00
// Loop through the data field in the JSON.
2014-04-28 22:21:57 +00:00
// This is an array containing the tile indexes, one after the other. -1 = no tile, everything else = the tile index (starting at 1 for Tiled, 0 for CSV)
2014-01-14 22:34:41 +00:00
// If the map contains multiple tilesets then the indexes are relative to that which the set starts from.
2013-12-05 18:12:16 +00:00
// Need to set which tileset in the cache = which tileset in the JSON, if you do this manually it means you can use the same map data but a new tileset.
2013-11-25 04:40:04 +00:00
2015-08-24 11:03:32 +00:00
for ( var t = 0 , len = curl . data . length ; t < len ; t ++ )
2013-11-25 04:40:04 +00:00
{
2015-02-08 20:03:19 +00:00
rotation = 0 ;
flipped = false ;
2015-08-24 11:03:32 +00:00
gid = curl . data [ t ] ;
2016-07-21 01:30:53 +00:00
flippedVal = 0 ;
2015-02-08 23:25:41 +00:00
2016-04-03 22:08:41 +00:00
// If true the current tile is flipped or rotated (Tiled TMX format)
2015-02-08 23:25:41 +00:00
if ( gid > 0x20000000 )
2015-02-08 20:03:19 +00:00
{
2015-02-08 23:25:41 +00:00
// FlippedX
if ( gid > 0x80000000 )
2015-02-08 20:03:19 +00:00
{
2015-02-08 23:25:41 +00:00
gid -= 0x80000000 ;
flippedVal += 4 ;
2015-02-08 20:03:19 +00:00
}
2015-02-08 23:25:41 +00:00
// FlippedY
if ( gid > 0x40000000 )
2015-02-08 20:03:19 +00:00
{
2015-02-08 23:25:41 +00:00
gid -= 0x40000000 ;
flippedVal += 2 ;
2015-02-08 20:03:19 +00:00
}
2015-02-08 23:25:41 +00:00
2016-07-21 01:30:53 +00:00
// FlippedAD (anti-diagonal = top-right is swapped with bottom-left corners)
2015-02-08 23:25:41 +00:00
if ( gid > 0x20000000 )
2015-02-08 20:21:39 +00:00
{
2015-02-08 23:25:41 +00:00
gid -= 0x20000000 ;
flippedVal += 1 ;
2015-02-08 20:03:19 +00:00
}
2016-04-03 22:08:41 +00:00
2015-02-08 20:21:39 +00:00
switch ( flippedVal )
2015-02-08 20:03:19 +00:00
{
case 5 :
2016-07-20 18:27:32 +00:00
rotation = Math . PI / 2 ;
2015-02-08 20:03:19 +00:00
break ;
2016-07-20 18:27:32 +00:00
2015-02-08 20:03:19 +00:00
case 6 :
2015-02-08 20:21:39 +00:00
rotation = Math . PI ;
break ;
2016-07-20 18:27:32 +00:00
2015-02-08 20:03:19 +00:00
case 3 :
2016-07-20 18:27:32 +00:00
rotation = 3 * Math . PI / 2 ;
2015-02-08 20:03:19 +00:00
break ;
2016-07-20 18:27:32 +00:00
2015-02-08 20:03:19 +00:00
case 4 :
rotation = 0 ;
flipped = true ;
break ;
2016-07-20 18:27:32 +00:00
2015-02-08 20:03:19 +00:00
case 7 :
2016-07-20 18:27:32 +00:00
rotation = Math . PI / 2 ;
2015-02-08 20:03:19 +00:00
flipped = true ;
break ;
2016-07-20 18:27:32 +00:00
2015-02-08 20:03:19 +00:00
case 2 :
rotation = Math . PI ;
flipped = true ;
break ;
2016-07-20 18:27:32 +00:00
2015-02-08 20:03:19 +00:00
case 1 :
2016-07-20 18:27:32 +00:00
rotation = 3 * Math . PI / 2 ;
2015-02-08 20:03:19 +00:00
flipped = true ;
break ;
2015-02-08 20:21:39 +00:00
}
2015-02-08 20:03:19 +00:00
}
2015-02-08 23:25:41 +00:00
2013-12-05 18:12:16 +00:00
// index, x, y, width, height
2015-02-08 20:03:19 +00:00
if ( gid > 0 )
2013-12-05 18:12:16 +00:00
{
2016-07-21 01:30:53 +00:00
var tile = new Phaser . Tile ( layer , gid , x , output . length , json . tilewidth , json . tileheight ) ;
2016-07-22 01:35:33 +00:00
2016-07-21 01:30:53 +00:00
tile . rotation = rotation ;
tile . flipped = flipped ;
2016-07-22 01:35:33 +00:00
if ( flippedVal !== 0 )
2016-07-21 01:30:53 +00:00
{
2016-07-22 01:35:33 +00:00
// The WebGL renderer uses this to flip UV coordinates before drawing
2016-07-21 01:30:53 +00:00
tile . flippedVal = flippedVal ;
}
2016-07-22 01:35:33 +00:00
row . push ( tile ) ;
2013-12-05 18:12:16 +00:00
}
else
{
2015-08-24 11:36:23 +00:00
if ( Phaser . TilemapParser . INSERT _NULL )
{
row . push ( null ) ;
}
else
{
row . push ( new Phaser . Tile ( layer , - 1 , x , output . length , json . tilewidth , json . tileheight ) ) ;
}
2013-12-05 18:12:16 +00:00
}
x ++ ;
2015-08-24 11:03:32 +00:00
if ( x === curl . width )
2013-12-05 18:12:16 +00:00
{
output . push ( row ) ;
x = 0 ;
row = [ ] ;
}
2013-12-18 04:40:10 +00:00
}
2013-12-05 18:12:16 +00:00
2013-12-18 04:40:10 +00:00
layer . data = output ;
2013-12-05 18:12:16 +00:00
2013-12-18 04:40:10 +00:00
layers . push ( layer ) ;
}
map . layers = layers ;
// Images
var images = [ ] ;
2013-11-25 04:40:04 +00:00
2013-12-18 04:40:10 +00:00
for ( var i = 0 ; i < json . layers . length ; i ++ )
{
if ( json . layers [ i ] . type !== 'imagelayer' )
{
continue ;
}
2013-12-05 18:12:16 +00:00
2015-08-24 11:03:32 +00:00
var curi = json . layers [ i ] ;
2013-12-18 04:40:10 +00:00
var image = {
2015-08-24 11:03:32 +00:00
name : curi . name ,
image : curi . image ,
x : curi . x ,
y : curi . y ,
alpha : curi . opacity ,
visible : curi . visible ,
2013-12-18 04:40:10 +00:00
properties : { }
} ;
2015-08-24 11:03:32 +00:00
if ( curi . properties )
2013-12-18 04:40:10 +00:00
{
2015-08-24 11:03:32 +00:00
image . properties = curi . properties ;
2013-12-18 04:40:10 +00:00
}
2013-11-25 04:40:04 +00:00
2013-12-18 04:40:10 +00:00
images . push ( image ) ;
}
map . images = images ;
2015-06-27 19:54:16 +00:00
// Tilesets & Image Collections
2014-03-17 23:27:13 +00:00
var tilesets = [ ] ;
2015-06-27 19:54:16 +00:00
var imagecollections = [ ] ;
2016-07-22 01:35:33 +00:00
var lastSet = null ;
2014-03-17 23:27:13 +00:00
for ( var i = 0 ; i < json . tilesets . length ; i ++ )
{
// name, firstgid, width, height, margin, spacing, properties
var set = json . tilesets [ i ] ;
2014-12-10 22:42:17 +00:00
if ( set . image )
2014-03-17 23:27:13 +00:00
{
2014-11-27 03:42:42 +00:00
var newSet = new Phaser . Tileset ( set . name , set . firstgid , set . tilewidth , set . tileheight , set . margin , set . spacing , set . properties ) ;
2014-03-17 23:27:13 +00:00
2014-11-27 03:42:42 +00:00
if ( set . tileproperties )
{
newSet . tileProperties = set . tileproperties ;
}
2014-03-17 23:27:13 +00:00
2014-11-27 03:42:42 +00:00
// For a normal sliced tileset the row/count/size information is computed when updated.
// This is done (again) after the image is set.
newSet . updateTileData ( set . imagewidth , set . imageheight ) ;
2016-07-22 01:35:33 +00:00
2014-11-27 03:42:42 +00:00
tilesets . push ( newSet ) ;
2014-03-17 23:27:13 +00:00
}
else
{
2015-06-27 19:54:16 +00:00
var newCollection = new Phaser . ImageCollection ( set . name , set . firstgid , set . tilewidth , set . tileheight , set . margin , set . spacing , set . properties ) ;
2016-04-03 22:08:41 +00:00
2015-11-12 13:39:42 +00:00
for ( var ti in set . tiles )
2015-06-27 19:54:16 +00:00
{
2015-11-12 13:39:42 +00:00
var image = set . tiles [ ti ] . image ;
var gid = set . firstgid + parseInt ( ti , 10 ) ;
2015-06-27 19:54:16 +00:00
newCollection . addImage ( gid , image ) ;
}
imagecollections . push ( newCollection ) ;
2014-03-17 23:27:13 +00:00
}
2014-11-27 03:42:42 +00:00
2016-07-22 01:35:33 +00:00
// We've got a new Tileset, so set the lastgid into the previous one
if ( lastSet )
{
lastSet . lastgid = set . firstgid - 1 ;
}
lastSet = set ;
2014-03-17 23:27:13 +00:00
}
map . tilesets = tilesets ;
2015-06-27 19:54:16 +00:00
map . imagecollections = imagecollections ;
2014-03-17 23:27:13 +00:00
2014-02-18 03:01:51 +00:00
// Objects & Collision Data (polylines, etc)
2013-12-23 04:19:52 +00:00
var objects = { } ;
2014-02-18 03:01:51 +00:00
var collision = { } ;
2013-12-18 04:40:10 +00:00
2014-05-01 11:05:12 +00:00
function slice ( obj , fields ) {
2015-02-08 23:25:41 +00:00
2014-05-01 11:05:12 +00:00
var sliced = { } ;
2015-02-08 23:25:41 +00:00
for ( var k in fields )
{
2014-05-01 11:05:12 +00:00
var key = fields [ k ] ;
2015-02-08 23:25:41 +00:00
2015-05-27 17:07:33 +00:00
if ( typeof obj [ key ] !== 'undefined' )
2015-02-08 23:25:41 +00:00
{
sliced [ key ] = obj [ key ] ;
}
2014-05-01 11:05:12 +00:00
}
2015-02-08 23:25:41 +00:00
2014-05-01 11:05:12 +00:00
return sliced ;
}
2013-12-18 04:40:10 +00:00
for ( var i = 0 ; i < json . layers . length ; i ++ )
{
if ( json . layers [ i ] . type !== 'objectgroup' )
{
continue ;
}
2015-08-24 11:03:32 +00:00
var curo = json . layers [ i ] ;
objects [ curo . name ] = [ ] ;
collision [ curo . name ] = [ ] ;
2013-12-23 04:19:52 +00:00
2015-08-24 11:03:32 +00:00
for ( var v = 0 , len = curo . objects . length ; v < len ; v ++ )
2013-12-18 04:40:10 +00:00
{
2014-02-18 03:01:51 +00:00
// Object Tiles
2015-08-24 11:03:32 +00:00
if ( curo . objects [ v ] . gid )
2013-11-25 04:40:04 +00:00
{
2013-12-18 04:40:10 +00:00
var object = {
2015-08-24 11:03:32 +00:00
gid : curo . objects [ v ] . gid ,
name : curo . objects [ v ] . name ,
type : curo . objects [ v ] . hasOwnProperty ( "type" ) ? curo . objects [ v ] . type : "" ,
x : curo . objects [ v ] . x ,
y : curo . objects [ v ] . y ,
visible : curo . objects [ v ] . visible ,
properties : curo . objects [ v ] . properties
2013-12-18 04:40:10 +00:00
} ;
2014-03-23 07:59:28 +00:00
2015-08-24 11:03:32 +00:00
if ( curo . objects [ v ] . rotation )
2015-02-08 23:25:41 +00:00
{
2015-08-24 11:03:32 +00:00
object . rotation = curo . objects [ v ] . rotation ;
2015-02-08 23:25:41 +00:00
}
2015-08-24 11:03:32 +00:00
objects [ curo . name ] . push ( object ) ;
2013-11-25 04:40:04 +00:00
}
2015-08-24 11:03:32 +00:00
else if ( curo . objects [ v ] . polyline )
2014-02-18 03:01:51 +00:00
{
var object = {
2015-08-24 11:03:32 +00:00
name : curo . objects [ v ] . name ,
type : curo . objects [ v ] . type ,
x : curo . objects [ v ] . x ,
y : curo . objects [ v ] . y ,
width : curo . objects [ v ] . width ,
height : curo . objects [ v ] . height ,
visible : curo . objects [ v ] . visible ,
properties : curo . objects [ v ] . properties
2014-02-18 03:01:51 +00:00
} ;
2015-08-24 11:03:32 +00:00
if ( curo . objects [ v ] . rotation )
2015-02-08 23:25:41 +00:00
{
2015-08-24 11:03:32 +00:00
object . rotation = curo . objects [ v ] . rotation ;
2015-02-08 23:25:41 +00:00
}
2014-02-18 03:01:51 +00:00
object . polyline = [ ] ;
// Parse the polyline into an array
2015-08-24 11:03:32 +00:00
for ( var p = 0 ; p < curo . objects [ v ] . polyline . length ; p ++ )
2014-02-18 03:01:51 +00:00
{
2015-08-24 11:03:32 +00:00
object . polyline . push ( [ curo . objects [ v ] . polyline [ p ] . x , curo . objects [ v ] . polyline [ p ] . y ] ) ;
2014-02-18 03:01:51 +00:00
}
2015-08-24 11:03:32 +00:00
collision [ curo . name ] . push ( object ) ;
objects [ curo . name ] . push ( object ) ;
2014-02-18 03:01:51 +00:00
}
2014-05-01 11:05:12 +00:00
// polygon
2015-08-24 11:03:32 +00:00
else if ( curo . objects [ v ] . polygon )
2014-05-01 11:05:12 +00:00
{
2016-07-20 18:27:32 +00:00
var object = slice ( curo . objects [ v ] , [ 'name' , 'type' , 'x' , 'y' , 'visible' , 'rotation' , 'properties' ] ) ;
2014-05-01 11:05:12 +00:00
// Parse the polygon into an array
object . polygon = [ ] ;
2015-02-08 23:25:41 +00:00
2015-08-24 11:03:32 +00:00
for ( var p = 0 ; p < curo . objects [ v ] . polygon . length ; p ++ )
2014-05-01 11:05:12 +00:00
{
2016-07-20 18:27:32 +00:00
object . polygon . push ( [ curo . objects [ v ] . polygon [ p ] . x , curo . objects [ v ] . polygon [ p ] . y ] ) ;
2014-05-01 11:05:12 +00:00
}
2015-02-08 23:25:41 +00:00
2015-08-24 11:03:32 +00:00
objects [ curo . name ] . push ( object ) ;
2013-12-18 04:40:10 +00:00
2014-05-01 11:05:12 +00:00
}
// ellipse
2015-08-24 11:03:32 +00:00
else if ( curo . objects [ v ] . ellipse )
2014-05-01 11:05:12 +00:00
{
2016-07-20 18:27:32 +00:00
var object = slice ( curo . objects [ v ] , [ 'name' , 'type' , 'ellipse' , 'x' , 'y' , 'width' , 'height' , 'visible' , 'rotation' , 'properties' ] ) ;
2015-08-24 11:03:32 +00:00
objects [ curo . name ] . push ( object ) ;
2014-05-01 11:05:12 +00:00
}
// otherwise it's a rectangle
else
{
2016-07-20 18:27:32 +00:00
var object = slice ( curo . objects [ v ] , [ 'name' , 'type' , 'x' , 'y' , 'width' , 'height' , 'visible' , 'rotation' , 'properties' ] ) ;
2014-05-01 11:05:12 +00:00
object . rectangle = true ;
2015-08-24 11:03:32 +00:00
objects [ curo . name ] . push ( object ) ;
2014-05-01 11:05:12 +00:00
}
2013-11-25 04:40:04 +00:00
}
2013-12-18 04:40:10 +00:00
}
2013-10-11 05:30:28 +00:00
2013-12-18 04:40:10 +00:00
map . objects = objects ;
2014-02-18 03:01:51 +00:00
map . collision = collision ;
2013-12-05 18:12:16 +00:00
2013-12-19 03:49:28 +00:00
map . tiles = [ ] ;
2013-12-18 16:56:14 +00:00
2013-12-19 03:49:28 +00:00
// Finally lets build our super tileset index
for ( var i = 0 ; i < map . tilesets . length ; i ++ )
2013-12-18 04:40:10 +00:00
{
2013-12-19 03:49:28 +00:00
var set = map . tilesets [ i ] ;
2014-03-23 07:59:28 +00:00
2013-12-19 03:49:28 +00:00
var x = set . tileMargin ;
var y = set . tileMargin ;
2013-12-18 04:40:10 +00:00
2013-12-19 03:49:28 +00:00
var count = 0 ;
var countX = 0 ;
var countY = 0 ;
2013-12-18 04:40:10 +00:00
2013-12-19 03:49:28 +00:00
for ( var t = set . firstgid ; t < set . firstgid + set . total ; t ++ )
{
// Can add extra properties here as needed
map . tiles [ t ] = [ x , y , i ] ;
2013-12-18 16:56:14 +00:00
2013-12-19 03:49:28 +00:00
x += set . tileWidth + set . tileSpacing ;
2013-12-18 16:56:14 +00:00
2013-12-19 03:49:28 +00:00
count ++ ;
2013-10-11 05:30:28 +00:00
2013-12-19 03:49:28 +00:00
if ( count === set . total )
{
break ;
}
2013-12-18 16:56:14 +00:00
2013-12-19 03:49:28 +00:00
countX ++ ;
2013-12-18 16:56:14 +00:00
2013-12-19 03:49:28 +00:00
if ( countX === set . columns )
{
x = set . tileMargin ;
y += set . tileHeight + set . tileSpacing ;
2013-12-18 16:56:14 +00:00
2013-12-19 03:49:28 +00:00
countX = 0 ;
countY ++ ;
2013-12-18 16:56:14 +00:00
2013-12-19 03:49:28 +00:00
if ( countY === set . rows )
{
break ;
}
}
}
2013-12-18 16:56:14 +00:00
2013-11-25 04:40:04 +00:00
}
2013-10-11 03:42:11 +00:00
2014-08-21 20:08:05 +00:00
// assign tile properties
2015-02-11 21:40:37 +00:00
var layer ;
var tile ;
var sid ;
var set ;
2014-08-21 20:08:05 +00:00
2016-06-26 23:46:52 +00:00
// go through each of the map data layers
2015-02-11 21:40:37 +00:00
for ( var i = 0 ; i < map . layers . length ; i ++ )
2014-08-21 20:08:05 +00:00
{
layer = map . layers [ i ] ;
2016-06-26 23:46:52 +00:00
set = null ;
2014-08-21 20:08:05 +00:00
// rows of tiles
2015-02-11 21:40:37 +00:00
for ( var j = 0 ; j < layer . data . length ; j ++ )
2014-08-21 20:08:05 +00:00
{
row = layer . data [ j ] ;
// individual tiles
2015-02-11 21:40:37 +00:00
for ( var k = 0 ; k < row . length ; k ++ )
2014-08-21 20:08:05 +00:00
{
tile = row [ k ] ;
2015-08-24 11:03:32 +00:00
if ( tile === null || tile . index < 0 )
2015-02-11 21:40:37 +00:00
{
continue ;
}
2014-08-21 20:08:05 +00:00
// find the relevant tileset
2015-02-11 21:40:37 +00:00
2014-08-21 20:08:05 +00:00
sid = map . tiles [ tile . index ] [ 2 ] ;
set = map . tilesets [ sid ] ;
2016-06-26 23:46:52 +00:00
2014-08-21 20:08:05 +00:00
// if that tile type has any properties, add them to the tile object
2015-02-11 21:40:37 +00:00
if ( set . tileProperties && set . tileProperties [ tile . index - set . firstgid ] )
{
tile . properties = Phaser . Utils . mixin ( set . tileProperties [ tile . index - set . firstgid ] , tile . properties ) ;
2014-08-21 20:08:05 +00:00
}
2016-06-26 23:46:52 +00:00
2014-08-21 20:08:05 +00:00
}
}
}
2013-12-18 04:40:10 +00:00
return map ;
2013-10-11 03:42:11 +00:00
2013-11-25 04:40:04 +00:00
}
2013-10-11 03:42:11 +00:00
2014-03-23 06:31:02 +00:00
} ;