Advertisement
Guest User

Untitled

a guest
Oct 19th, 2019
100
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 6.80 KB | None | 0 0
  1. function tryFixPolyline(object) {
  2. const margin = 5 // pixels
  3.  
  4. let polygon = object.polygon
  5. if (polygon.length < 3)
  6. return false // can't turn into polygon
  7. let first = polygon[0]
  8. let last = polygon[polygon.length - 1]
  9.  
  10. // check if points are too far away from each other
  11. if (Math.abs(first.x - last.x) > margin)
  12. return false
  13. if (Math.abs(first.y - last.y) > margin)
  14. return false
  15.  
  16. // change polyline to polygon
  17. polygon.pop()
  18. object.asset.macro("Change Polyline to Polygon", function() {
  19. object.polygon = polygon
  20. object.shape = MapObject.Polygon
  21. })
  22.  
  23. return true
  24. }
  25.  
  26. function focusCollisionObject(tileset, tile, object) {
  27. // open tileset and select tile
  28. tiled.open(tileset.fileName)
  29. tileset.selectedTiles = [tile]
  30.  
  31. // switch to collision editor mode, select the object and focus it
  32. let collisionEditor = tiled.tilesetEditor.collisionEditor
  33. collisionEditor.show()
  34. collisionEditor.selectedObjects = [object]
  35. collisionEditor.focusObject(object)
  36. }
  37.  
  38. function checkTileset(tileset) {
  39. for (let tile of tileset.tiles) {
  40. let objectGroup = tile.objectGroup
  41. if (!objectGroup)
  42. continue
  43.  
  44. for (let object of objectGroup.objects) {
  45. if (object.shape == MapObject.Polyline) {
  46. let callback = focusCollisionObject.bind(null, tileset, tile, object)
  47.  
  48. if (tryFixPolyline(object))
  49. tiled.warn("converted polyline to polygon in '" + tileset.name + "' on tile " + tile.id + " (object id " + object.id + ")", callback)
  50. else
  51. tiled.error("polyline detected in '" + tileset.name + "' on tile " + tile.id + " (object id " + object.id + ")", callback)
  52. }
  53. }
  54. }
  55. }
  56.  
  57. let checkForPolylineCollisionShapes = tiled.registerAction('CheckForPolylineCollisionShapes', function(action) {
  58. let checkedTilesets = {}
  59.  
  60. let check = function(tileset) {
  61. if (!checkedTilesets[tileset]) {
  62. checkTileset(tileset)
  63. checkedTilesets[tileset] = true
  64. }
  65. }
  66.  
  67. for (let asset of tiled.openAssets) {
  68. if (asset.isTileset)
  69. check(asset)
  70. else if (asset.isTileMap)
  71. asset.tilesets.forEach(check)
  72. }
  73. })
  74. checkForPolylineCollisionShapes.text = "Check for Polylines in Open Tilesets"
  75.  
  76.  
  77. let removeUnusedTilesets = tiled.registerAction('RemoveUnusedTilesets', function(action) {
  78. const map = tiled.activeAsset;
  79. if (!map.isTileMap) {
  80. tiled.error("Not a tile map!");
  81. return;
  82. }
  83.  
  84. const unusedTilesets = []
  85. const usedTilesets = map.usedTilesets()
  86.  
  87. for (const t of map.tilesets)
  88. if (usedTilesets.indexOf(t) == -1)
  89. unusedTilesets.push(t);
  90.  
  91. if (unusedTilesets.length > 0) {
  92. map.macro("Remove Unused Tilesets", function() {
  93. for (const t of unusedTilesets)
  94. map.removeTileset(t);
  95. });
  96. }
  97. })
  98. removeUnusedTilesets.text = "Remove Unused Tilesets"
  99.  
  100. function cutCommonPath(fileA, fileB) {
  101. while (true) {
  102. let slashA = fileA.indexOf('/')
  103. let slashB = fileB.indexOf('/')
  104.  
  105. if (slashA >= 0 && slashA == slashB && fileA.substring(0, slashA) == fileB.substring(0, slashB)) {
  106. fileA = fileA.substring(slashA + 1)
  107. fileB = fileB.substring(slashA + 1)
  108. } else {
  109. break
  110. }
  111. }
  112.  
  113. return fileB
  114. }
  115.  
  116. // EXAMPLE OUTPUT
  117. //
  118. // Tile image name: XXXXXX
  119. // Number of Colliders: N
  120. // Collider 1: Bounding poly N Object Type N
  121. // Collider 2: Bounding poly N Object Type N
  122. // Etc
  123. // Tile image name: YYYYYY
  124. // Number of Colliders: N
  125. // Collider 1: Bounding poly N Object Type N
  126. // Collider 2: Bounding poly N Object Type N
  127. // Collider 3: Bounding poly N Object Type N
  128. //
  129. function listTilesAndColliders(fileName, usedTiles) {
  130. for (const tile of usedTiles) {
  131. const collisions = tile.objectGroup
  132. const objectCount = collisions ? collisions.objectCount : 0
  133. const imageFileName = tile.imageFileName
  134.  
  135. tiled.log("Tile image name: " + cutCommonPath(fileName, imageFileName))
  136. tiled.log("Number of Colliders: " + objectCount)
  137.  
  138. if (collisions) {
  139. let i = 0
  140. for (const o of collisions.objects) {
  141. ++i
  142.  
  143. let shape = ""
  144. let type = ""
  145.  
  146. switch (o.shape) {
  147. case MapObject.Rectangle:
  148. shape = " Rectangle"
  149. break
  150. case MapObject.Polygon:
  151. shape = " Bouding poly " + o.polygon.length
  152. break
  153. case MapObject.Polyline:
  154. shape = " Polyline " + o.polygon.length
  155. break
  156. case MapObject.Ellipse:
  157. shape = " Ellipse"
  158. break
  159. case MapObject.Text:
  160. shape = " Text"
  161. break
  162. case MapObject.Point:
  163. shape = " Point"
  164. break
  165. }
  166.  
  167. if (o.type.length > 0)
  168. type = " Object Type " + o.type
  169.  
  170. tiled.log("Collider " + i + ":" + shape + type)
  171. }
  172. }
  173.  
  174. tiled.log("")
  175. }
  176. }
  177.  
  178. let listUsedTilesAndColliders = tiled.registerAction('ListUsedTilesAndColliders', function(action) {
  179. const map = tiled.activeAsset;
  180. if (!map.isTileMap) {
  181. tiled.error("Not a tile map!");
  182. return;
  183. }
  184.  
  185. const usedTiles = new Set()
  186.  
  187. function processLayers(thing) {
  188. for (let i = thing.layerCount - 1; i >= 0; i--) {
  189. const layer = thing.layerAt(i)
  190. if (layer.isGroupLayer) {
  191. processLayers(layer)
  192. }
  193. else if (layer.isObjectLayer) {
  194. for (const o of layer.objects) {
  195. const tile = o.tile
  196. if (!tile)
  197. continue
  198.  
  199. usedTiles.add(tile)
  200. }
  201. }
  202. }
  203. }
  204.  
  205. processLayers(map)
  206. listTilesAndColliders(map.fileName, usedTiles)
  207. })
  208. listUsedTilesAndColliders.text = "List Used Tiles and Collider Counts"
  209.  
  210. let listUsedTilesAndCollidersForTileset = tiled.registerAction('ListUsedTilesAndCollidersForTileset', function(action) {
  211. const tileset = tiled.activeAsset;
  212. if (!tileset.isTileset) {
  213. tiled.error("Not a tileset!");
  214. return;
  215. }
  216.  
  217. listTilesAndColliders(tileset.fileName, tileset.tiles)
  218. })
  219. listUsedTilesAndCollidersForTileset.text = "List Tiles and Collider Counts"
  220.  
  221. tiled.extendMenu("Map", [
  222. { separator: true },
  223. { action: "RemoveUnusedTilesets" },
  224. { action: "ListUsedTilesAndColliders" },
  225. ])
  226.  
  227. tiled.extendMenu("Tileset", [
  228. { separator: true },
  229. { action: "CheckForPolylineCollisionShapes" },
  230. { action: "ListUsedTilesAndCollidersForTileset" },
  231. ])
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement