var game = new Phaser.Game(800, 600, Phaser.CANVAS, 'phaser-example', { preload: preload, create: create, update: update, render: render }); function preload() { // game.load.tilemap('map', 'assets/tilemaps/maps/platform.json', null, Phaser.Tilemap.TILED_JSON); // game.load.image('platformer_tiles', 'assets/tilemaps/tiles/platformer_tiles.png'); game.load.tilemap('map', 'assets/tilemaps/maps/features_test.json', null, Phaser.Tilemap.TILED_JSON); game.load.image('ground_1x1', 'assets/tilemaps/tiles/ground_1x1.png'); game.load.image('walls_1x2', 'assets/tilemaps/tiles/walls_1x2.png'); game.load.image('tiles2', 'assets/tilemaps/tiles/tiles2.png'); } var map; var layer; var mapLayer; var polys = []; var tiles = []; var idx = 0; var group = []; function create() { game.stage.backgroundColor = '#124184'; // map = game.add.tilemap('map'); // map.addTilesetImage('platformer_tiles'); // map.setCollisionBetween(21, 53); // layer = map.createLayer('Tile Layer 1'); // layer.debug = true; map = game.add.tilemap('map'); map.addTilesetImage('ground_1x1'); map.addTilesetImage('walls_1x2'); map.addTilesetImage('tiles2'); map.setCollisionBetween(1, 12); layer = map.createLayer('Tile Layer 1'); mapLayer = map.layers[0]; tiles = getInterestingTiles(); console.log('found',tiles.length,'interesting tiles'); // group = []; // var tile = getFirstUnscanned(); // console.log('starting from', tile); // floodFill(tile); // console.log('group collected, size', group.length); // now scan the group // scanEdges(); // works great :) while (getScannedLeft() > 0) { // group = []; var tile = getFirstUnscanned(); console.log('starting from', tile); floodFill(tile); console.log('group collected, size', group.length); console.log('remaining: ', getScannedLeft()); } } function getFirstUnscanned() { for (var i = 0; i < tiles.length; i++) { if (!tiles[i].scanned) { return tiles[i]; } } } function getScannedLeft() { var total = tiles.length; for (var i = 0; i < tiles.length; i++) { if (tiles[i].scanned) { total--; } } return total; } var current; function scanEdges() { var points = []; var start = group[0]; // special case for when group.length = 1 should go here } function scanTop(origin) { } function floodFill(origin) { if (origin.scanned === true) { return; } origin.scanned = true; group.push(origin); // console.log('ff origin', origin.x, origin.y); var west = map.getTileLeft(0, origin.x, origin.y); if (west && (west.faceTop || west.faceBottom || west.faceLeft || west.faceRight)) { // console.log('west found', west); floodFill(west); } var east = map.getTileRight(0, origin.x, origin.y); if (east && (east.faceTop || east.faceBottom || east.faceLeft || east.faceRight)) { // console.log('east found', east); floodFill(east); } var north = map.getTileAbove(0, origin.x, origin.y); if (north && (north.faceTop || north.faceBottom || north.faceLeft || north.faceRight)) { // console.log('north found', north); floodFill(north); } var south = map.getTileBelow(0, origin.x, origin.y); if (south && (south.faceTop || south.faceBottom || south.faceLeft || south.faceRight)) { // console.log('south found', south); floodFill(south); } } function getInterestingTiles() { var tiles = []; for (var y = 0, h = mapLayer.height; y < h; y++) { for (var x = 0, w = mapLayer.width; x < w; x++) { var tile = mapLayer.data[y][x]; if (tile && (tile.faceTop || tile.faceBottom || tile.faceLeft || tile.faceRight)) { // reset the scanned status tile.scanned = false; tiles.push(tile); } } } return tiles; } function getTile() { for (var y = 0, h = mapLayer.height; y < h; y++) { for (var x = 0, w = mapLayer.width; x < w; x++) { var tile = mapLayer.data[y][x]; if (tile && (tile.faceTop || tile.faceBottom || tile.faceLeft || tile.faceRight)) { return tile; } } } } function update() { } function render() { if (group) { game.context.fillStyle = 'rgba(255,0,0,0.7)'; for (var i = 0; i < group.length; i++) { game.context.fillRect(group[i].x * group[i].width, group[i].y * group[i].height, group[i].width, group[i].height); } } }