Build games as easily as you play them — join the Phaser Beam waitlist for Early Access.
var config = { type: Phaser.AUTO, width: 800, height: 600, backgroundColor: '#1affdd', parent: 'phaser-example', pixelArt: true, scene: { preload: preload, create: create, update: update } }; var game = new Phaser.Game(config); var p1 = null; var p2 = null; var map; var controls; var graphics; var selectedShape = 'rectangle'; var onlyColliding = false; function preload() { this.load.tilemapTiledJSON('map', 'assets/tilemaps/maps/cybernoid.json'); this.load.image('cybernoid', 'assets/tilemaps/tiles/cybernoid.png'); } function create() { map = this.add.tilemap('map'); var tiles = map.addTilesetImage('cybernoid'); var layer = map.createLayer(0, tiles); // var layer = map.createDynamicLayer(0, tiles); layer.setScale(1.25, 1.25); graphics = this.add.graphics({ lineStyle: { width: 4, color: 0xa8fff2 }, fillStyle: { color: 0xa8fff2 } }); map.setCollisionByExclusion(7); this.input.keyboard.on('keydown-ONE', function (event) { selectedShape = 'rectangle'; helpText.setText(getHelpMessage()); }); this.input.keyboard.on('keydown-TWO', function (event) { selectedShape = 'line'; helpText.setText(getHelpMessage()); }); this.input.keyboard.on('keydown-THREE', function (event) { selectedShape = 'circle'; helpText.setText(getHelpMessage()); }); this.input.keyboard.on('keydown-FOUR', function (event) { selectedShape = 'triangle'; helpText.setText(getHelpMessage()); }); this.input.keyboard.on('keydown-C', function (event) { onlyColliding = !onlyColliding; helpText.setText(getHelpMessage()); }); this.cameras.main.setBounds(0, 0, map.widthInPixels, map.heightInPixels); var cursors = this.input.keyboard.createCursorKeys(); var controlConfig = { camera: this.cameras.main, left: cursors.left, right: cursors.right, up: cursors.up, down: cursors.down, speed: 0.5 }; controls = new Phaser.Cameras.Controls.FixedKeyControl(controlConfig); var helpText = this.add.text(16, 16, getHelpMessage(), { fontSize: '18px', padding: { x: 10, y: 5 }, fill: '#ffffff', backgroundColor: '#000000' }); helpText.setScrollFactor(0); this.input.on('pointerdown', function () { // Update p1 & p2 based on where user clicks var worldPoint = this.input.activePointer.positionToCamera(this.cameras.main); if (!p1) { p1 = worldPoint.clone(); } else if (!p2) { p2 = worldPoint.clone(); } else { p1 = worldPoint.clone(); p2 = null; } }, this); } function update(time, delta) { controls.update(delta); graphics.clear(); // Show user where they clicked if (p1) { graphics.fillCircle(p1.x, p1.y, 3); } if (p2) { graphics.fillCircle(p2.x, p2.y, 3); } // If we have both points, draw a shape and manipulate the tiles in that shape if (p1 && p2) { map.forEachTile(function (tile) { tile.alpha = 1; }); var overlappingTiles = []; switch (selectedShape) { case 'rectangle': var xStart = Math.min(p1.x, p2.x); var yStart = Math.min(p1.y, p2.y); var xEnd = Math.max(p1.x, p2.x); var yEnd = Math.max(p1.y, p2.y); var rect = new Phaser.Geom.Rectangle(xStart, yStart, xEnd - xStart, yEnd - yStart); overlappingTiles = map.getTilesWithinShape(rect, { isColliding: onlyColliding }); graphics.strokeRectShape(rect); break; case 'line': var line = new Phaser.Geom.Line(p1.x, p1.y, p2.x, p2.y); overlappingTiles = map.getTilesWithinShape(line, { isColliding: onlyColliding }); graphics.strokeLineShape(line); break; case 'circle': var radius = Math.sqrt(Math.pow(p2.x - p1.x, 2) + Math.pow(p2.y - p1.y, 2)) / 2; var cx = (p1.x + p2.x) / 2; var cy = (p1.y + p2.y) / 2; var circle = new Phaser.Geom.Circle(cx, cy, radius); overlappingTiles = map.getTilesWithinShape(circle, { isColliding: onlyColliding }); graphics.strokeCircleShape(circle); break; case 'triangle': var tri = new Phaser.Geom.Triangle(p1.x, p1.y, p1.x, p2.y, p2.x, p2.y); overlappingTiles = map.getTilesWithinShape(tri, { isColliding: onlyColliding }); graphics.strokeTriangleShape(tri); break; default: break; } overlappingTiles.forEach(function (tile) { tile.alpha = 0.25; }); } } function getHelpMessage() { return 'Click to draw. Press 1/2/3/4 to change shapes.' + '\nSelected shape: ' + selectedShape + '\nPress C to only select colliding tiles: ' + (onlyColliding ? 'on' : 'off') + '\nArrows to scroll.'; }
var config = {
type: Phaser.AUTO,
width: 800,
height: 600,
backgroundColor: '#1affdd',
parent: 'phaser-example',
pixelArt: true,
scene: {
preload: preload,
create: create,
update: update
}
};
var game = new Phaser.Game(config);
var p1 = null;
var p2 = null;
var map;
var controls;
var graphics;
var selectedShape = 'rectangle';
var onlyColliding = false;
function preload() {
this.load.tilemapTiledJSON('map', 'assets/tilemaps/maps/cybernoid.json');
this.load.image('cybernoid', 'assets/tilemaps/tiles/cybernoid.png');
}
function create() {
map = this.add.tilemap('map');
var tiles = map.addTilesetImage('cybernoid');
var layer = map.createLayer(0, tiles);
// var layer = map.createDynamicLayer(0, tiles);
layer.setScale(1.25, 1.25);
graphics = this.add.graphics({
lineStyle: { width: 4, color: 0xa8fff2 },
fillStyle: { color: 0xa8fff2 }
});
map.setCollisionByExclusion(7);
this.input.keyboard.on('keydown-ONE', function (event) {
selectedShape = 'rectangle';
helpText.setText(getHelpMessage());
});
this.input.keyboard.on('keydown-TWO', function (event) {
selectedShape = 'line';
helpText.setText(getHelpMessage());
});
this.input.keyboard.on('keydown-THREE', function (event) {
selectedShape = 'circle';
helpText.setText(getHelpMessage());
});
this.input.keyboard.on('keydown-FOUR', function (event) {
selectedShape = 'triangle';
helpText.setText(getHelpMessage());
});
this.input.keyboard.on('keydown-C', function (event) {
onlyColliding = !onlyColliding;
helpText.setText(getHelpMessage());
});
this.cameras.main.setBounds(0, 0, map.widthInPixels, map.heightInPixels);
var cursors = this.input.keyboard.createCursorKeys();
var controlConfig = {
camera: this.cameras.main,
left: cursors.left,
right: cursors.right,
up: cursors.up,
down: cursors.down,
speed: 0.5
};
controls = new Phaser.Cameras.Controls.FixedKeyControl(controlConfig);
var helpText = this.add.text(16, 16, getHelpMessage(), {
fontSize: '18px',
padding: { x: 10, y: 5 },
fill: '#ffffff',
backgroundColor: '#000000'
});
helpText.setScrollFactor(0);
this.input.on('pointerdown', function () {
// Update p1 & p2 based on where user clicks
var worldPoint = this.input.activePointer.positionToCamera(this.cameras.main);
if (!p1) {
p1 = worldPoint.clone();
}
else if (!p2) {
p2 = worldPoint.clone();
}
else {
p1 = worldPoint.clone();
p2 = null;
}
}, this);
}
function update(time, delta) {
controls.update(delta);
graphics.clear();
// Show user where they clicked
if (p1) { graphics.fillCircle(p1.x, p1.y, 3); }
if (p2) { graphics.fillCircle(p2.x, p2.y, 3); }
// If we have both points, draw a shape and manipulate the tiles in that shape
if (p1 && p2) {
map.forEachTile(function (tile) { tile.alpha = 1; });
var overlappingTiles = [];
switch (selectedShape) {
case 'rectangle':
var xStart = Math.min(p1.x, p2.x);
var yStart = Math.min(p1.y, p2.y);
var xEnd = Math.max(p1.x, p2.x);
var yEnd = Math.max(p1.y, p2.y);
var rect = new Phaser.Geom.Rectangle(xStart, yStart, xEnd - xStart, yEnd - yStart);
overlappingTiles = map.getTilesWithinShape(rect, { isColliding: onlyColliding });
graphics.strokeRectShape(rect);
break;
case 'line':
var line = new Phaser.Geom.Line(p1.x, p1.y, p2.x, p2.y);
overlappingTiles = map.getTilesWithinShape(line, { isColliding: onlyColliding });
graphics.strokeLineShape(line);
break;
case 'circle':
var radius = Math.sqrt(Math.pow(p2.x - p1.x, 2) + Math.pow(p2.y - p1.y, 2)) / 2;
var cx = (p1.x + p2.x) / 2;
var cy = (p1.y + p2.y) / 2;
var circle = new Phaser.Geom.Circle(cx, cy, radius);
overlappingTiles = map.getTilesWithinShape(circle, { isColliding: onlyColliding });
graphics.strokeCircleShape(circle);
break;
case 'triangle':
var tri = new Phaser.Geom.Triangle(p1.x, p1.y, p1.x, p2.y, p2.x, p2.y);
overlappingTiles = map.getTilesWithinShape(tri, { isColliding: onlyColliding });
graphics.strokeTriangleShape(tri);
break;
default:
break;
}
overlappingTiles.forEach(function (tile) { tile.alpha = 0.25; });
}
}
function getHelpMessage() {
return 'Click to draw. Press 1/2/3/4 to change shapes.' +
'\nSelected shape: ' + selectedShape +
'\nPress C to only select colliding tiles: ' + (onlyColliding ? 'on' : 'off') +
'\nArrows to scroll.';
}