11/// <reference path="../Game.ts" />
22/// <reference path="GameObject.ts" />
33/// <reference path="../system/TilemapLayer.ts" />
4+ /// <reference path="../system/Tile.ts" />
45
56/**
67* Phaser - Tilemap
@@ -19,7 +20,8 @@ module Phaser {
1920
2021 this . isGroup = false ;
2122
22- this . _layers = [ ] ;
23+ this . tiles = [ ] ;
24+ this . layers = [ ] ;
2325
2426 this . mapFormat = format ;
2527
@@ -41,11 +43,11 @@ module Phaser {
4143
4244 }
4345
44- private _layers : TilemapLayer [ ] ;
45-
4646 public static FORMAT_CSV : number = 0 ;
4747 public static FORMAT_TILED_JSON : number = 1 ;
4848
49+ public tiles : Tile [ ] ;
50+ public layers : TilemapLayer [ ] ;
4951 public currentLayer : TilemapLayer ;
5052 public mapFormat : number ;
5153
@@ -57,17 +59,17 @@ module Phaser {
5759 if ( this . cameraBlacklist . indexOf ( camera . ID ) == - 1 )
5860 {
5961 // Loop through the layers
60- for ( var i = 0 ; i < this . _layers . length ; i ++ )
62+ for ( var i = 0 ; i < this . layers . length ; i ++ )
6163 {
62- this . _layers [ i ] . render ( camera , cameraOffsetX , cameraOffsetY ) ;
64+ this . layers [ i ] . render ( camera , cameraOffsetX , cameraOffsetY ) ;
6365 }
6466 }
6567
6668 }
6769
6870 private parseCSV ( data : string , key : string , tileWidth : number , tileHeight : number ) {
6971
70- var layer : TilemapLayer = new TilemapLayer ( this . _game , key , Tilemap . FORMAT_CSV , 'TileLayerCSV' + this . _layers . length . toString ( ) , tileWidth , tileHeight ) ;
72+ var layer : TilemapLayer = new TilemapLayer ( this . _game , this , key , Tilemap . FORMAT_CSV , 'TileLayerCSV' + this . layers . length . toString ( ) , tileWidth , tileHeight ) ;
7173
7274 // Trim any rogue whitespace from the data
7375 data = data . trim ( ) ;
@@ -85,10 +87,13 @@ module Phaser {
8587 }
8688
8789 layer . updateBounds ( ) ;
90+ var tileQuantity = layer . parseTileOffsets ( ) ;
8891
8992 this . currentLayer = layer ;
9093
91- this . _layers . push ( layer ) ;
94+ this . layers . push ( layer ) ;
95+
96+ this . generateTiles ( tileQuantity ) ;
9297
9398 }
9499
@@ -101,10 +106,12 @@ module Phaser {
101106
102107 for ( var i = 0 ; i < json . layers . length ; i ++ )
103108 {
104- var layer : TilemapLayer = new TilemapLayer ( this . _game , key , Tilemap . FORMAT_TILED_JSON , json . layers [ i ] . name , json . tilewidth , json . tileheight ) ;
109+ var layer : TilemapLayer = new TilemapLayer ( this . _game , this , key , Tilemap . FORMAT_TILED_JSON , json . layers [ i ] . name , json . tilewidth , json . tileheight ) ;
105110
106111 layer . alpha = json . layers [ i ] . opacity ;
107112 layer . visible = json . layers [ i ] . visible ;
113+ layer . tileMargin = json . tilesets [ 0 ] . margin ;
114+ layer . tileSpacing = json . tilesets [ 0 ] . spacing ;
108115
109116 var c = 0 ;
110117 var row ;
@@ -129,10 +136,23 @@ module Phaser {
129136
130137 layer . updateBounds ( ) ;
131138
139+ var tileQuantity = layer . parseTileOffsets ( ) ;
140+
132141 this . currentLayer = layer ;
133142
134- this . _layers . push ( layer ) ;
143+ this . layers . push ( layer ) ;
144+
145+ }
146+
147+ this . generateTiles ( tileQuantity ) ;
148+
149+ }
150+
151+ private generateTiles ( qty :number ) {
135152
153+ for ( var i = 0 ; i < qty ; i ++ )
154+ {
155+ this . tiles . push ( new Tile ( this . _game , this , i , this . currentLayer . tileWidth , this . currentLayer . tileHeight ) ) ;
136156 }
137157
138158 }
@@ -145,9 +165,81 @@ module Phaser {
145165 return this . currentLayer . heightInPixels ;
146166 }
147167
168+ // Tile Collision
169+
170+ public setCollisionRange ( start : number , end : number , collision ?:number = Collision . ANY ) {
171+
172+ for ( var i = start ; i < end ; i ++ )
173+ {
174+ this . tiles [ i ] . allowCollisions = collision ;
175+ }
176+
177+ }
178+
179+ public setCollisionByIndex ( values :number [ ] , collision ?:number = Collision . ANY ) {
180+
181+ for ( var i = 0 ; i < values . length ; i ++ )
182+ {
183+ this . tiles [ values [ i ] ] . allowCollisions = collision ;
184+ }
185+
186+ }
187+
188+ // Tile Management
189+
190+ public getTile ( x : number , y : number , layer ?: number = 0 ) :Tile {
191+
192+ return this . tiles [ this . layers [ layer ] . getTileIndex ( x , y ) ] ;
193+
194+ }
195+
196+ public getTileFromWorldXY ( x : number , y : number , layer ?: number = 0 ) :Tile {
197+
198+ return this . tiles [ this . layers [ layer ] . getTileFromWorldXY ( x , y ) ] ;
199+
200+ }
201+
202+ public getTileFromInputXY ( layer ?: number = 0 ) :Tile {
203+
204+ return this . tiles [ this . layers [ layer ] . getTileFromWorldXY ( this . _game . input . worldX , this . _game . input . worldY ) ] ;
205+
206+ }
207+
208+ public getTileOverlaps ( object : GameObject ) {
209+
210+ return this . currentLayer . getTileOverlaps ( object ) ;
211+
212+ }
213+
214+ // COLLIDE
215+ public collide ( objectOrGroup = null , callback = null ) : bool {
216+
217+ if ( objectOrGroup == null )
218+ {
219+ objectOrGroup = this . _game . world . group ;
220+ }
221+
222+ // Group?
223+ if ( objectOrGroup . isGroup == false )
224+ {
225+ if ( objectOrGroup . exists && objectOrGroup . allowCollisions != Collision . NONE )
226+ {
227+ this . currentLayer . getTileOverlaps ( objectOrGroup ) ;
228+ }
229+ }
230+ else
231+ {
232+ // todo
233+ objectOrGroup . forEachAlive ( this . currentLayer . getTileOverlaps ) ;
234+ }
235+
236+ return true ;
237+
238+ }
239+
240+
148241 // Set current layer
149242 // Set layer order?
150- // Get tile from x/y
151243 // Get block of tiles
152244 // Swap tiles around
153245 // Delete tiles of certain type
0 commit comments