From 01f34e18b76e1c933098c29d2363217cfa54db9f Mon Sep 17 00:00:00 2001 From: Michael Hadley Date: Thu, 30 Nov 2017 17:18:27 -0600 Subject: [PATCH] Recalculate faces: make this reset faces on non-colliding tiles This handles edge cases where things like copy can make a tile become non-colliding w/o reseting faces --- v3/src/gameobjects/tilemap/Tile.js | 15 +++++++++++ .../components/CalculateFacesWithin.js | 25 ++++++++++++------- .../tilemap/components/RecalculateFacesAt.js | 2 ++ 3 files changed, 33 insertions(+), 9 deletions(-) diff --git a/v3/src/gameobjects/tilemap/Tile.js b/v3/src/gameobjects/tilemap/Tile.js index e4427dc5b..125ea9c79 100644 --- a/v3/src/gameobjects/tilemap/Tile.js +++ b/v3/src/gameobjects/tilemap/Tile.js @@ -286,6 +286,21 @@ var Tile = new Class({ return this; }, + /** + * Reset faces. + * + * @returns {this} + */ + resetFaces: function () + { + this.faceTop = false; + this.faceBottom = false; + this.faceLeft = false; + this.faceRight = false; + + return this; + }, + /** * Sets the collision flags for each side of this tile and updates the interesting faces list. * diff --git a/v3/src/gameobjects/tilemap/components/CalculateFacesWithin.js b/v3/src/gameobjects/tilemap/components/CalculateFacesWithin.js index 2a6499be2..f4c5439bf 100644 --- a/v3/src/gameobjects/tilemap/components/CalculateFacesWithin.js +++ b/v3/src/gameobjects/tilemap/components/CalculateFacesWithin.js @@ -25,17 +25,24 @@ var CalculateFacesWithin = function (tileX, tileY, width, height, layer) { var tile = tiles[i]; - if (tile && tile.collides) + if (tile) { - above = GetTileAt(tile.x, tile.y - 1, true, layer); - below = GetTileAt(tile.x, tile.y + 1, true, layer); - left = GetTileAt(tile.x - 1, tile.y, true, layer); - right = GetTileAt(tile.x + 1, tile.y, true, layer); + if (tile.collides) + { + above = GetTileAt(tile.x, tile.y - 1, true, layer); + below = GetTileAt(tile.x, tile.y + 1, true, layer); + left = GetTileAt(tile.x - 1, tile.y, true, layer); + right = GetTileAt(tile.x + 1, tile.y, true, layer); - tile.faceTop = (above && above.collides) ? false : true; - tile.faceBottom = (below && below.collides) ? false : true; - tile.faceLeft = (left && left.collides) ? false : true; - tile.faceRight = (right && right.collides) ? false : true; + tile.faceTop = (above && above.collides) ? false : true; + tile.faceBottom = (below && below.collides) ? false : true; + tile.faceLeft = (left && left.collides) ? false : true; + tile.faceRight = (right && right.collides) ? false : true; + } + else + { + tile.resetFaces(); + } } } }; diff --git a/v3/src/gameobjects/tilemap/components/RecalculateFacesAt.js b/v3/src/gameobjects/tilemap/components/RecalculateFacesAt.js index fbbda04f9..bae381b73 100644 --- a/v3/src/gameobjects/tilemap/components/RecalculateFacesAt.js +++ b/v3/src/gameobjects/tilemap/components/RecalculateFacesAt.js @@ -52,6 +52,8 @@ var RecalculateFacesAt = function (tileX, tileY, layer) right.faceLeft = !tileCollides; } + if (tile && !tile.collides) { tile.resetFaces(); } + return tile; };