Skip to content

Commit 4abf0df

Browse files
committed
Added setCollisionFromCollisionGroup for easily setting collision from Tiled collision editor
1 parent 2cabd15 commit 4abf0df

5 files changed

Lines changed: 79 additions & 0 deletions

File tree

src/gameobjects/tilemap/Tilemap.js

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1027,6 +1027,19 @@ var Tilemap = new Class({
10271027
return this;
10281028
},
10291029

1030+
/**
1031+
* See component documentation. If no layer specified, the map's current layer is used.
1032+
*
1033+
* @return {this|null} Returns this, or null if the layer given was invalid.
1034+
*/
1035+
setCollisionFromCollisionGroup: function (collides, recalculateFaces, layer)
1036+
{
1037+
layer = this.getLayer(layer);
1038+
if (layer === null) { return this; }
1039+
TilemapComponents.SetCollisionFromCollisionGroup(collides, recalculateFaces, layer);
1040+
return this;
1041+
},
1042+
10301043
/**
10311044
* See component documentation. If no layer specified, the map's current layer is used.
10321045
*
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
var SetTileCollision = require('./SetTileCollision');
2+
var CalculateFacesWithin = require('./CalculateFacesWithin');
3+
4+
/**
5+
* Sets collision on the tiles within a layer by checking if the tile has a collision group
6+
* (typically defined in Tiled within the tileset collision editor). If any collision objects are
7+
* found, the tile's colliding information will be set. The `collides` parameter controls if
8+
* collision will be enabled (true) or disabled (false).
9+
*
10+
* @param {boolean} [collides=true] - If true it will enable collision. If false it will clear
11+
* collision.
12+
* @param {boolean} [recalculateFaces=true] - Whether or not to recalculate the tile faces after the
13+
* update.
14+
* @param {LayerData} layer - [description]
15+
*/
16+
var SetCollisionFromCollisionGroup = function (collides, recalculateFaces, layer)
17+
{
18+
if (collides === undefined) { collides = true; }
19+
if (recalculateFaces === undefined) { recalculateFaces = true; }
20+
21+
for (var ty = 0; ty < layer.height; ty++)
22+
{
23+
for (var tx = 0; tx < layer.width; tx++)
24+
{
25+
var tile = layer.data[ty][tx];
26+
27+
if (!tile) { continue; }
28+
29+
var collisionGroup = tile.getCollisionGroup();
30+
31+
// It's possible in Tiled to have a collision group without any shapes, e.g. create a
32+
// shape and then delete the shape.
33+
if (collisionGroup && collisionGroup.objects && collisionGroup.objects.length > 0)
34+
{
35+
SetTileCollision(tile, collides);
36+
}
37+
}
38+
}
39+
40+
if (recalculateFaces) { CalculateFacesWithin(0, 0, layer.width, layer.height, layer); }
41+
};
42+
43+
module.exports = SetCollisionFromCollisionGroup;

src/gameobjects/tilemap/components/index.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ module.exports = {
2929
SetCollisionBetween: require('./SetCollisionBetween'),
3030
SetCollisionByProperty: require('./SetCollisionByProperty'),
3131
SetCollisionByExclusion: require('./SetCollisionByExclusion'),
32+
SetCollisionFromCollisionGroup: require('./SetCollisionFromCollisionGroup'),
3233
SetTileIndexCallback: require('./SetTileIndexCallback'),
3334
SetTileLocationCallback: require('./SetTileLocationCallback'),
3435
Shuffle: require('./Shuffle'),

src/gameobjects/tilemap/dynamiclayer/DynamicTilemapLayer.js

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -405,6 +405,17 @@ var DynamicTilemapLayer = new Class({
405405
return this;
406406
},
407407

408+
/**
409+
* See component documentation.
410+
*
411+
* @return {this}
412+
*/
413+
setCollisionFromCollisionGroup: function (collides, recalculateFaces)
414+
{
415+
TilemapComponents.SetCollisionFromCollisionGroup(collides, recalculateFaces, this.layer);
416+
return this;
417+
},
418+
408419
/**
409420
* See component documentation.
410421
*

src/gameobjects/tilemap/staticlayer/StaticTilemapLayer.js

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -481,6 +481,17 @@ var StaticTilemapLayer = new Class({
481481
return this;
482482
},
483483

484+
/**
485+
* See component documentation.
486+
*
487+
* @return {this}
488+
*/
489+
setCollisionFromCollisionGroup: function (collides, recalculateFaces)
490+
{
491+
TilemapComponents.SetCollisionFromCollisionGroup(collides, recalculateFaces, this.layer);
492+
return this;
493+
},
494+
484495
/**
485496
* See component documentation.
486497
*

0 commit comments

Comments
 (0)