Skip to content

Commit e19de28

Browse files
committed
Tilemap & layers now recalc faces (with a parameter for disabling recalc)
1 parent bdea565 commit e19de28

11 files changed

Lines changed: 64 additions & 44 deletions

File tree

v3/src/gameobjects/tilemap/Tile.js

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -103,6 +103,10 @@ var Tile = new Class({
103103

104104
setCollision: function (left, right, up, down)
105105
{
106+
if (right === undefined) { right = left; }
107+
if (up === undefined) { up = left; }
108+
if (down === undefined) { down = left; }
109+
106110
this.collideLeft = left;
107111
this.collideRight = right;
108112
this.collideUp = up;

v3/src/gameobjects/tilemap/Tilemap.js

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -334,20 +334,20 @@ var Tilemap = new Class({
334334
}
335335
},
336336

337-
putTileAt: function (tile, tileX, tileY, layer)
337+
putTileAt: function (tile, tileX, tileY, recalculateFaces, layer)
338338
{
339339
layer = this.getLayer(layer);
340340
if (this._isStaticCall(layer, 'putTileAt')) { return null; }
341341
if (layer === null) { return null; }
342-
return TilemapComponents.PutTileAt(tile, tileX, tileY, layer);
342+
return TilemapComponents.PutTileAt(tile, tileX, tileY, recalculateFaces, layer);
343343
},
344344

345-
putTileAtWorldXY: function (tile, worldX, worldY, camera, layer)
345+
putTileAtWorldXY: function (tile, worldX, worldY, recalculateFaces, camera, layer)
346346
{
347347
layer = this.getLayer(layer);
348348
if (this._isStaticCall(layer, 'putTileAtWorldXY')) { return null; }
349349
if (layer === null) { return null; }
350-
return TilemapComponents.PutTileAtWorldXY(tile, worldX, worldY, camera, layer);
350+
return TilemapComponents.PutTileAtWorldXY(tile, worldX, worldY, recalculateFaces, camera, layer);
351351
},
352352

353353
randomize: function (tileX, tileY, width, height, indices, layer)
@@ -361,11 +361,11 @@ var Tilemap = new Class({
361361
return this;
362362
},
363363

364-
recalculateFaces: function (layer)
364+
calculateFacesWithin: function (tileX, tileY, width, height, layer)
365365
{
366366
layer = this.getLayer(layer);
367367
if (layer === null) { return this; }
368-
TilemapComponents.RecalculateFaces(layer);
368+
TilemapComponents.CalculateFacesWithin(tileX, tileY, width, height, layer);
369369
return this;
370370
},
371371

@@ -376,20 +376,20 @@ var Tilemap = new Class({
376376
return this;
377377
},
378378

379-
removeTileAt: function (tileX, tileY, replaceWithNull, layer)
379+
removeTileAt: function (tileX, tileY, replaceWithNull, recalculateFaces, layer)
380380
{
381381
layer = this.getLayer(layer);
382382
if (this._isStaticCall(layer, 'removeTileAt')) { return null; }
383383
if (layer === null) { return null; }
384-
return TilemapComponents.RemoveTileAt(tileX, tileY, replaceWithNull, layer);
384+
return TilemapComponents.RemoveTileAt(tileX, tileY, replaceWithNull, recalculateFaces, layer);
385385
},
386386

387-
removeTileAtWorldXY: function (worldX, worldY, replaceWithNull, camera, layer)
387+
removeTileAtWorldXY: function (worldX, worldY, replaceWithNull, recalculateFaces, camera, layer)
388388
{
389389
layer = this.getLayer(layer);
390390
if (this._isStaticCall(layer, 'removeTileAtWorldXY')) { return null; }
391391
if (layer === null) { return null; }
392-
return TilemapComponents.RemoveTileAtWorldXY(worldX, worldY, replaceWithNull, camera, layer);
392+
return TilemapComponents.RemoveTileAtWorldXY(worldX, worldY, replaceWithNull, recalculateFaces, camera, layer);
393393
},
394394

395395
replaceByIndex: function (findIndex, newIndex, tileX, tileY, width, height, layer)

v3/src/gameobjects/tilemap/components/PutTileAt.js

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,16 @@
11
var Tile = require('../Tile');
22
var IsInLayerBounds = require('./IsInLayerBounds');
3+
var RecalculateFacesAt = require('./RecalculateFacesAt');
34

45
// Put Phaser.Tile|number. Note: does not place a reference to tile, it copies the tile or creates a
56
// new one.
6-
var PutTileAt = function (tile, tileX, tileY, layer)
7+
var PutTileAt = function (tile, tileX, tileY, recalculateFaces, layer)
78
{
89
if (!IsInLayerBounds(tileX, tileY, layer)) { return null; }
10+
if (recalculateFaces === undefined) { recalculateFaces = true; }
11+
12+
var oldTile = layer.data[tileY][tileX];
13+
var oldTileCollides = oldTile && oldTile.collides;
914

1015
if (tile instanceof Tile)
1116
{
@@ -31,7 +36,6 @@ var PutTileAt = function (tile, tileX, tileY, layer)
3136
}
3237
}
3338

34-
// TODO: collision & re-calculate faces
3539
// Updating colliding flag on the new tile
3640
var newTile = layer.data[tileY][tileX];
3741
if (layer.collideIndexes.indexOf(newTile.index) !== -1)
@@ -43,7 +47,13 @@ var PutTileAt = function (tile, tileX, tileY, layer)
4347
newTile.resetCollision();
4448
}
4549

46-
return layer.data[tileY][tileX];
50+
// Recalculate faces only if the colliding flag at (tileX, tileY) has changed
51+
if (recalculateFaces && (oldTileCollides !== newTile.collides))
52+
{
53+
RecalculateFacesAt(tileX, tileY, layer);
54+
}
55+
56+
return newTile;
4757
};
4858

4959
module.exports = PutTileAt;

v3/src/gameobjects/tilemap/components/PutTileAtWorldXY.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ var PutTileAt = require('./PutTileAt');
22
var WorldToTileX = require('./WorldToTileX');
33
var WorldToTileY = require('./WorldToTileY');
44

5-
var PutTileAtWorldXY = function (tile, worldX, worldY, camera, layer)
5+
var PutTileAtWorldXY = function (tile, worldX, worldY, recalculateFaces, camera, layer)
66
{
77
var tileX = WorldToTileX(worldX, camera, layer);
88
var tileY = WorldToTileY(worldY, camera, layer);

v3/src/gameobjects/tilemap/components/RemoveTileAt.js

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,12 @@
11
var Tile = require('../Tile');
22
var IsInLayerBounds = require('./IsInLayerBounds');
3+
var RecalculateFacesAt = require('./RecalculateFacesAt');
34

45
// Remove and return Tile with option for placing a -1 index tile or null.
5-
var RemoveTileAt = function (tileX, tileY, replaceWithNull, layer)
6+
var RemoveTileAt = function (tileX, tileY, replaceWithNull, recalculateFaces, layer)
67
{
78
if (replaceWithNull === undefined) { replaceWithNull = false; }
8-
9+
if (recalculateFaces === undefined) { recalculateFaces = true; }
910
if (!IsInLayerBounds(tileX, tileY, layer)) { return null; }
1011

1112
var tile = layer.data[tileY][tileX];
@@ -20,7 +21,11 @@ var RemoveTileAt = function (tileX, tileY, replaceWithNull, layer)
2021
: new Tile(layer, -1, tileX, tileY, tile.width, tile.height);
2122
}
2223

23-
// TODO: re-calculate faces
24+
// Recalculate faces only if the removed tile was a colliding tile
25+
if (recalculateFaces && tile && tile.collides)
26+
{
27+
RecalculateFacesAt(tileX, tileY, layer);
28+
}
2429

2530
return tile;
2631
};

v3/src/gameobjects/tilemap/components/RemoveTileAtWorldXY.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ var RemoveTileAt = require('./RemoveTileAt');
22
var WorldToTileX = require('./WorldToTileX');
33
var WorldToTileY = require('./WorldToTileY');
44

5-
var RemoveTileAtWorldXY = function (worldX, worldY, replaceWithNull, camera, layer)
5+
var RemoveTileAtWorldXY = function (worldX, worldY, replaceWithNull, recalculateFaces, camera, layer)
66
{
77
var tileX = WorldToTileX(worldX, camera, layer);
88
var tileY = WorldToTileY(worldY, camera, layer);

v3/src/gameobjects/tilemap/components/SetCollision.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
var SetTileCollision = require('./SetTileCollision');
2-
var RecalculateFaces = require('./RecalculateFaces');
2+
var CalculateFacesWithin = require('./CalculateFacesWithin');
33
var SetLayerCollisionIndex = require('./SetLayerCollisionIndex');
44

55
var SetCollision = function (indexes, collides, recalculateFaces, layer)
@@ -28,7 +28,7 @@ var SetCollision = function (indexes, collides, recalculateFaces, layer)
2828
}
2929
}
3030

31-
if (recalculateFaces) { RecalculateFaces(layer); }
31+
if (recalculateFaces) { CalculateFacesWithin(0, 0, layer.width, layer.height, layer); }
3232
};
3333

3434
module.exports = SetCollision;

v3/src/gameobjects/tilemap/components/SetCollisionBetween.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
var SetTileCollision = require('./SetTileCollision');
2-
var RecalculateFaces = require('./RecalculateFaces');
2+
var CalculateFacesWithin = require('./CalculateFacesWithin');
33
var SetLayerCollisionIndex = require('./SetLayerCollisionIndex');
44

55
var SetCollisionBetween = function (start, stop, collides, recalculateFaces, layer)
@@ -31,7 +31,7 @@ var SetCollisionBetween = function (start, stop, collides, recalculateFaces, lay
3131
}
3232
}
3333

34-
if (recalculateFaces) { RecalculateFaces(layer); }
34+
if (recalculateFaces) { CalculateFacesWithin(0, 0, layer.width, layer.height, layer); }
3535
};
3636

3737
module.exports = SetCollisionBetween;

v3/src/gameobjects/tilemap/components/SetCollisionByExclusion.js

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
11
var SetTileCollision = require('./SetTileCollision');
2-
var RecalculateFaces = require('./RecalculateFaces');
2+
var CalculateFacesWithin = require('./CalculateFacesWithin');
33
var SetLayerCollisionIndex = require('./SetLayerCollisionIndex');
44

5+
// Note: this only updates layer.collideIndexes for tile indexes found currently in the layer
56
var SetCollisionByExclusion = function (indexes, collides, recalculateFaces, layer)
67
{
78
if (collides === undefined) { collides = true; }
@@ -21,7 +22,7 @@ var SetCollisionByExclusion = function (indexes, collides, recalculateFaces, lay
2122
}
2223
}
2324

24-
if (recalculateFaces) { RecalculateFaces(layer); }
25+
if (recalculateFaces) { CalculateFacesWithin(0, 0, layer.width, layer.height, layer); }
2526
};
2627

2728
module.exports = SetCollisionByExclusion;

v3/src/gameobjects/tilemap/dynamiclayer/DynamicTilemapLayer.js

Lines changed: 14 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,12 @@ var DynamicTilemapLayer = new Class({
4949
this.skipIndexZero = false;
5050
},
5151

52+
calculateFacesWithin: function (tileX, tileY, width, height)
53+
{
54+
TilemapComponents.CalculateFacesWithin(tileX, tileY, width, height, this.layer);
55+
return this;
56+
},
57+
5258
cull: function (camera)
5359
{
5460
TilemapComponents.CullTiles(this.layer, camera, this.culledTiles);
@@ -112,14 +118,14 @@ var DynamicTilemapLayer = new Class({
112118
return TilemapComponents.HasTileAtWorldXY(worldX, worldY, camera, this.layer);
113119
},
114120

115-
putTileAt: function (tile, tileX, tileY)
121+
putTileAt: function (tile, tileX, tileY, recalculateFaces)
116122
{
117-
return TilemapComponents.PutTileAt(tile, tileX, tileY, this.layer);
123+
return TilemapComponents.PutTileAt(tile, tileX, tileY, recalculateFaces, this.layer);
118124
},
119125

120-
putTileAtWorldXY: function (tile, worldX, worldY, camera)
126+
putTileAtWorldXY: function (tile, worldX, worldY, recalculateFaces, camera)
121127
{
122-
return TilemapComponents.PutTileAtWorldXY(tile, worldX, worldY, camera, this.layer);
128+
return TilemapComponents.PutTileAtWorldXY(tile, worldX, worldY, recalculateFaces, camera, this.layer);
123129
},
124130

125131
randomize: function (tileX, tileY, width, height, indices)
@@ -128,20 +134,14 @@ var DynamicTilemapLayer = new Class({
128134
return this;
129135
},
130136

131-
recalculateFaces: function ()
132-
{
133-
TilemapComponents.RecalculateFaces(this.layer);
134-
return this;
135-
},
136-
137-
removeTileAt: function (tileX, tileY, replaceWithNull)
137+
removeTileAt: function (tileX, tileY, replaceWithNull, recalculateFaces)
138138
{
139-
return TilemapComponents.RemoveTileAt(tileX, tileY, replaceWithNull, this.layer);
139+
return TilemapComponents.RemoveTileAt(tileX, tileY, replaceWithNull, recalculateFaces, this.layer);
140140
},
141141

142-
removeTileAtWorldXY: function (worldX, worldY, replaceWithNull, camera)
142+
removeTileAtWorldXY: function (worldX, worldY, replaceWithNull, recalculateFaces, camera)
143143
{
144-
return TilemapComponents.RemoveTileAtWorldXY(worldX, worldY, replaceWithNull, camera, this.layer);
144+
return TilemapComponents.RemoveTileAtWorldXY(worldX, worldY, replaceWithNull, recalculateFaces, camera, this.layer);
145145
},
146146

147147
replaceByIndex: function (findIndex, newIndex, tileX, tileY, width, height)

0 commit comments

Comments
 (0)