Skip to content

Commit 105dc75

Browse files
committed
Tilemap & layers: optimized SetCollision methods
v2 was structured in a way where a full pass through ALL tiles would occur if SetCollisionBetween or SetCollisionByExclusion was used. That's a huge penalty for large tilemaps, so this version duplicates some loop code for the sake of speed.
1 parent 213b7b4 commit 105dc75

10 files changed

Lines changed: 184 additions & 1 deletion

File tree

v3/src/gameobjects/tilemap/Tilemap.js

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -361,6 +361,14 @@ var Tilemap = new Class({
361361
return this;
362362
},
363363

364+
recalculateFaces: function (layer)
365+
{
366+
layer = this.getLayer(layer);
367+
if (layer === null) { return this; }
368+
TilemapComponents.RecalculateFaces(layer);
369+
return this;
370+
},
371+
364372
removeAllLayers: function ()
365373
{
366374
this.layers.length = 0;
@@ -395,6 +403,30 @@ var Tilemap = new Class({
395403
return this;
396404
},
397405

406+
setCollision: function (indexes, collides, recalculateFaces, layer)
407+
{
408+
layer = this.getLayer(layer);
409+
if (layer === null) { return this; }
410+
TilemapComponents.SetCollision(indexes, collides, recalculateFaces, layer);
411+
return this;
412+
},
413+
414+
setCollisionBetween: function (start, stop, collides, recalculateFaces, layer)
415+
{
416+
layer = this.getLayer(layer);
417+
if (layer === null) { return this; }
418+
TilemapComponents.SetCollisionBetween(start, stop, collides, recalculateFaces, layer);
419+
return this;
420+
},
421+
422+
setCollisionByExclusion: function (indexes, collides, recalculateFaces, layer)
423+
{
424+
layer = this.getLayer(layer);
425+
if (layer === null) { return this; }
426+
TilemapComponents.SetCollisionByExclusion(indexes, collides, recalculateFaces, layer);
427+
return this;
428+
},
429+
398430
setLayer: function (layer)
399431
{
400432
var index = this.getLayerIndex(layer);

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ var PutTileAt = function (tile, tileX, tileY, layer)
3131
}
3232
}
3333

34-
// TODO: re-calculate faces
34+
// TODO: collision & re-calculate faces
3535

3636
return layer.data[tileY][tileX];
3737
};
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
var RecalculateFaces = function (layer)
2+
{
3+
return;
4+
};
5+
6+
module.exports = RecalculateFaces;
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
var SetTileCollision = require('./SetTileCollision');
2+
var RecalculateFaces = require('./RecalculateFaces');
3+
4+
var SetCollision = function (indexes, collides, recalculateFaces, layer)
5+
{
6+
if (collides === undefined) { collides = true; }
7+
if (recalculateFaces === undefined) { recalculateFaces = true; }
8+
if (!Array.isArray(indexes)) { indexes = [ indexes ]; }
9+
10+
for (var ty = 0; ty < layer.height; ty++)
11+
{
12+
for (var tx = 0; tx < layer.width; tx++)
13+
{
14+
var tile = layer.data[ty][tx];
15+
16+
if (tile && indexes.indexOf(tile.index) !== -1)
17+
{
18+
SetTileCollision(tile, collides);
19+
}
20+
}
21+
}
22+
23+
if (recalculateFaces) { RecalculateFaces(layer); }
24+
};
25+
26+
module.exports = SetCollision;
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
var SetTileCollision = require('./SetTileCollision');
2+
var RecalculateFaces = require('./RecalculateFaces');
3+
4+
var SetCollisionBetween = function (start, stop, collides, recalculateFaces, layer)
5+
{
6+
if (collides === undefined) { collides = true; }
7+
if (recalculateFaces === undefined) { recalculateFaces = true; }
8+
9+
if (start > stop) { return; }
10+
11+
for (var ty = 0; ty < layer.height; ty++)
12+
{
13+
for (var tx = 0; tx < layer.width; tx++)
14+
{
15+
var tile = layer.data[ty][tx];
16+
if (tile)
17+
{
18+
if (tile.index >= start && tile.index <= stop)
19+
{
20+
SetTileCollision(tile, collides);
21+
}
22+
}
23+
}
24+
}
25+
26+
if (recalculateFaces) { RecalculateFaces(layer); }
27+
};
28+
29+
module.exports = SetCollisionBetween;
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
var SetTileCollision = require('./SetTileCollision');
2+
var RecalculateFaces = require('./RecalculateFaces');
3+
4+
var SetCollisionByExclusion = function (indexes, collides, recalculateFaces, layer)
5+
{
6+
if (collides === undefined) { collides = true; }
7+
if (recalculateFaces === undefined) { recalculateFaces = true; }
8+
if (!Array.isArray(indexes)) { indexes = [ indexes ]; }
9+
10+
for (var ty = 0; ty < layer.height; ty++)
11+
{
12+
for (var tx = 0; tx < layer.width; tx++)
13+
{
14+
var tile = layer.data[ty][tx];
15+
if (tile && indexes.indexOf(tile.index) === -1)
16+
{
17+
SetTileCollision(tile, collides);
18+
}
19+
}
20+
}
21+
22+
if (recalculateFaces) { RecalculateFaces(layer); }
23+
};
24+
25+
module.exports = SetCollisionByExclusion;
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
var SetTileCollision = function (tile, collides)
2+
{
3+
if (collides)
4+
{
5+
tile.setCollision(true, true, true, true);
6+
}
7+
else
8+
{
9+
tile.resetCollision();
10+
}
11+
};
12+
13+
module.exports = SetTileCollision;

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

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,9 +14,13 @@ module.exports = {
1414
PutTileAt: require('./PutTileAt'),
1515
PutTileAtWorldXY: require('./PutTileAtWorldXY'),
1616
Randomize: require('./Randomize'),
17+
RecalculateFaces: require('./RecalculateFaces'),
1718
RemoveTileAt: require('./RemoveTileAt'),
1819
RemoveTileAtWorldXY: require('./RemoveTileAtWorldXY'),
1920
ReplaceByIndex: require('./ReplaceByIndex'),
21+
SetCollision: require('./SetCollision'),
22+
SetCollisionBetween: require('./SetCollisionBetween'),
23+
SetCollisionByExclusion: require('./SetCollisionByExclusion'),
2024
Shuffle: require('./Shuffle'),
2125
SwapByIndex: require('./SwapByIndex'),
2226
WorldToTileX: require('./WorldToTileX'),

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

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -128,6 +128,12 @@ var DynamicTilemapLayer = new Class({
128128
return this;
129129
},
130130

131+
recalculateFaces: function ()
132+
{
133+
TilemapComponents.RecalculateFaces(this.layer);
134+
return this;
135+
},
136+
131137
removeTileAt: function (tileX, tileY, replaceWithNull)
132138
{
133139
return TilemapComponents.RemoveTileAt(tileX, tileY, replaceWithNull, this.layer);
@@ -144,6 +150,24 @@ var DynamicTilemapLayer = new Class({
144150
return this;
145151
},
146152

153+
setCollision: function (indexes, collides, recalculateFaces)
154+
{
155+
TilemapComponents.SetCollision(indexes, collides, recalculateFaces, this.layer);
156+
return this;
157+
},
158+
159+
setCollisionBetween: function (start, stop, collides, recalculateFaces)
160+
{
161+
TilemapComponents.SetCollisionBetween(start, stop, collides, recalculateFaces, this.layer);
162+
return this;
163+
},
164+
165+
setCollisionByExclusion: function (indexes, collides, recalculateFaces)
166+
{
167+
TilemapComponents.SetCollisionByExclusion(indexes, collides, recalculateFaces, this.layer);
168+
return this;
169+
},
170+
147171
shuffle: function (tileX, tileY, width, height)
148172
{
149173
TilemapComponents.Shuffle(tileX, tileY, width, height, this.layer);

v3/src/gameobjects/tilemap/staticlayer/StaticTilemapLayer.js

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -253,6 +253,30 @@ var StaticTilemapLayer = new Class({
253253
return TilemapComponents.HasTileAtWorldXY(worldX, worldY, camera, this.layer);
254254
},
255255

256+
recalculateFaces: function ()
257+
{
258+
TilemapComponents.RecalculateFaces(this.layer);
259+
return this;
260+
},
261+
262+
setCollision: function (indexes, collides, recalculateFaces)
263+
{
264+
TilemapComponents.SetCollision(indexes, collides, recalculateFaces, this.layer);
265+
return this;
266+
},
267+
268+
setCollisionBetween: function (start, stop, collides, recalculateFaces)
269+
{
270+
TilemapComponents.SetCollisionBetween(start, stop, collides, recalculateFaces, this.layer);
271+
return this;
272+
},
273+
274+
setCollisionByExclusion: function (indexes, collides, recalculateFaces)
275+
{
276+
TilemapComponents.SetCollisionByExclusion(indexes, collides, recalculateFaces, this.layer);
277+
return this;
278+
},
279+
256280
worldToTileX: function (worldX, camera)
257281
{
258282
return TilemapComponents.WorldToTileX(worldX, camera, this.layer);

0 commit comments

Comments
 (0)