class Example extends Phaser.Scene { waterHeight = 60; maxHeight = 120; offsetY = 90; spacing = 12; size = 20; gridHeight = 46; gridWidth = 39; cursors; py = 0; px = 0; land = []; heightmap; color = new Phaser.Display.Color(); preload () { this.load.setBaseURL('https://cdn.phaserfiles.com/v385'); this.load.image('noise', 'assets/tests/noise.png'); // this.load.image('noise', 'assets/tests/heightmap.png'); } create () { this.heightmap = this.textures.createCanvas('map', 512, 512); this.heightmap.draw(0, 0, this.textures.get('noise').getSourceImage()); let ox = this.size; let r = 0; const h = this.size; for (let y = 0; y < this.gridHeight; y++) { const row = []; for (let x = 0; x < this.gridWidth - r; x++) { const tile = this.add.isobox(ox + x * this.size, this.offsetY + y * this.spacing, this.size, h, 0x8dcb0e, 0x3f8403, 0x63a505); row.push(tile); } r++; ox += this.size / 2; if (r === 2) { r = 0; ox = this.size; } this.land.push(row); } this.updateLand(); this.cursors = this.input.keyboard.createCursorKeys(); } update () { let down = false; if (this.cursors.left.isDown) { this.px--; if (this.px < 0) { this.px = 512; } down = true; } else if (this.cursors.right.isDown) { this.px++; if (this.px === 512) { this.px = 0; } down = true; } if (this.cursors.up.isDown) { this.py--; if (this.py < 0) { this.py = 512; } down = true; } else if (this.cursors.down.isDown) { this.py++; if (this.py === 512) { this.py = 0; } down = true; } if (down) { this.updateLand(); } } updateLand () { let r = 0; for (let y = 0; y < this.gridHeight; y++) { for (let x = 0; x < this.gridWidth - r; x++) { const cx = Phaser.Math.Wrap(this.px + x, 0, 512); const cy = Phaser.Math.Wrap(this.py + y, 0, 512); this.heightmap.getPixel(cx, cy, this.color); const h = (Math.max(this.color.r, this.color.g, this.color.b) / 255) * this.maxHeight; if (h < this.waterHeight) { this.land[y][x].setFillStyle(0x00b9f2, 0x016fce, 0x028fdf); } else if (h === this.maxHeight) { this.land[y][x].setFillStyle(0xffe31f, 0xf2a022, 0xf8d80b); } else { this.land[y][x].setFillStyle(0x8dcb0e, 0x3f8403, 0x63a505); } this.land[y][x].height = h; } r++; if (r === 2) { r = 0; } } } } const config = { type: Phaser.WEBGL, parent: 'phaser-example', width: 800, height: 600, backgroundColor: '#efefef', scene: Example }; const game = new Phaser.Game(config);
Scan to open on your mobile device
class Example extends Phaser.Scene { waterHeight = 60; maxHeight = 120; offsetY = 90; spacing = 12; size = 20; gridHeight = 46; gridWidth = 39; cursors; py = 0; px = 0; land = []; heightmap; color = new Phaser.Display.Color(); preload () { this.load.setBaseURL('https://cdn.phaserfiles.com/v385'); this.load.image('noise', 'assets/tests/noise.png'); // this.load.image('noise', 'assets/tests/heightmap.png'); } create () { this.heightmap = this.textures.createCanvas('map', 512, 512); this.heightmap.draw(0, 0, this.textures.get('noise').getSourceImage()); let ox = this.size; let r = 0; const h = this.size; for (let y = 0; y < this.gridHeight; y++) { const row = []; for (let x = 0; x < this.gridWidth - r; x++) { const tile = this.add.isobox(ox + x * this.size, this.offsetY + y * this.spacing, this.size, h, 0x8dcb0e, 0x3f8403, 0x63a505); row.push(tile); } r++; ox += this.size / 2; if (r === 2) { r = 0; ox = this.size; } this.land.push(row); } this.updateLand(); this.cursors = this.input.keyboard.createCursorKeys(); } update () { let down = false; if (this.cursors.left.isDown) { this.px--; if (this.px < 0) { this.px = 512; } down = true; } else if (this.cursors.right.isDown) { this.px++; if (this.px === 512) { this.px = 0; } down = true; } if (this.cursors.up.isDown) { this.py--; if (this.py < 0) { this.py = 512; } down = true; } else if (this.cursors.down.isDown) { this.py++; if (this.py === 512) { this.py = 0; } down = true; } if (down) { this.updateLand(); } } updateLand () { let r = 0; for (let y = 0; y < this.gridHeight; y++) { for (let x = 0; x < this.gridWidth - r; x++) { const cx = Phaser.Math.Wrap(this.px + x, 0, 512); const cy = Phaser.Math.Wrap(this.py + y, 0, 512); this.heightmap.getPixel(cx, cy, this.color); const h = (Math.max(this.color.r, this.color.g, this.color.b) / 255) * this.maxHeight; if (h < this.waterHeight) { this.land[y][x].setFillStyle(0x00b9f2, 0x016fce, 0x028fdf); } else if (h === this.maxHeight) { this.land[y][x].setFillStyle(0xffe31f, 0xf2a022, 0xf8d80b); } else { this.land[y][x].setFillStyle(0x8dcb0e, 0x3f8403, 0x63a505); } this.land[y][x].height = h; } r++; if (r === 2) { r = 0; } } } } const config = { type: Phaser.WEBGL, parent: 'phaser-example', width: 800, height: 600, backgroundColor: '#efefef', scene: Example }; const game = new Phaser.Game(config);