class Ship extends Phaser.Physics.Arcade.Sprite { constructor (scene, x, y, points) { super(scene, x, y, 'ship', 2); scene.add.existing(this); scene.physics.add.existing(this); this.setScale(2); this.play('thrust'); this.speed = 150; this.points = points; this.target; this.targetIndex = -1; this.isSeeking = true; this.seek(); } seek () { // Pick a random target point var entry = Phaser.Utils.Array.GetRandom(this.points); this.target = entry; this.isSeeking = false; this.scene.tweens.add({ targets: this.body.velocity, x: 0, y: 0, ease: 'Linear', duration: 500, onComplete: function (tween, targets, ship) { ship.isSeeking = true; ship.scene.tweens.add({ targets: ship, speed: 150, delay: 500, ease: 'Sine.easeOut', duration: 1000 }); }, onCompleteParams: [ this ] }); } preUpdate (time, delta) { super.preUpdate(time, delta); // Is the ship within the radius of the target? if (this.target.contains(this.x, this.y)) { this.seek(); } else if (this.isSeeking) { var angle = Math.atan2(this.target.y - this.y, this.target.x - this.x); this.scene.physics.velocityFromRotation(angle, this.speed, this.body.velocity); } } } let config = { type: Phaser.AUTO, parent: 'phaser-example', width: 800, height: 600, pixelArt: true, physics: { default: 'arcade', arcade: { gravity: { y: 0 }, debug: true } }, scene: { preload: preload, create: create, update: update } }; var g; var ship; let game = new Phaser.Game(config); function preload () { this.load.setBaseURL('https://cdn.phaserfiles.com/v355'); this.load.spritesheet('ship', 'assets/games/lazer/ship.png', { frameWidth: 16, frameHeight: 24 }); } function create () { this.anims.create( { key: 'thrust', frames: this.anims.generateFrameNumbers('ship', { frames: [ 2, 7 ] }), frameRate: 20, repeat: -1 }); let points = [ new Phaser.Geom.Circle(100, 100, 32), new Phaser.Geom.Circle(400, 100, 32), new Phaser.Geom.Circle(700, 100, 32), new Phaser.Geom.Circle(100, 300, 32), new Phaser.Geom.Circle(400, 300, 32), new Phaser.Geom.Circle(700, 300, 32), new Phaser.Geom.Circle(100, 500, 32), new Phaser.Geom.Circle(400, 500, 32), new Phaser.Geom.Circle(700, 500, 32) ]; var debug = this.add.graphics(); debug.lineStyle(1, 0x00ff00); points.forEach(function (p) { debug.strokeCircleShape(p); }); g = this.add.graphics(); ship = new Ship(this, 400, 300, points); } function update () { g.clear(); g.fillStyle(0xff0000); g.fillRect(ship.target.x, ship.target.y, 4, 4); }
class Ship extends Phaser.Physics.Arcade.Sprite { constructor (scene, x, y, points) { super(scene, x, y, 'ship', 2); scene.add.existing(this); scene.physics.add.existing(this); this.setScale(2); this.play('thrust'); this.speed = 150; this.points = points; this.target; this.targetIndex = -1; this.isSeeking = true; this.seek(); } seek () { // Pick a random target point var entry = Phaser.Utils.Array.GetRandom(this.points); this.target = entry; this.isSeeking = false; this.scene.tweens.add({ targets: this.body.velocity, x: 0, y: 0, ease: 'Linear', duration: 500, onComplete: function (tween, targets, ship) { ship.isSeeking = true; ship.scene.tweens.add({ targets: ship, speed: 150, delay: 500, ease: 'Sine.easeOut', duration: 1000 }); }, onCompleteParams: [ this ] }); } preUpdate (time, delta) { super.preUpdate(time, delta); // Is the ship within the radius of the target? if (this.target.contains(this.x, this.y)) { this.seek(); } else if (this.isSeeking) { var angle = Math.atan2(this.target.y - this.y, this.target.x - this.x); this.scene.physics.velocityFromRotation(angle, this.speed, this.body.velocity); } } } let config = { type: Phaser.AUTO, parent: 'phaser-example', width: 800, height: 600, pixelArt: true, physics: { default: 'arcade', arcade: { gravity: { y: 0 }, debug: true } }, scene: { preload: preload, create: create, update: update } }; var g; var ship; let game = new Phaser.Game(config); function preload () { this.load.setBaseURL('https://cdn.phaserfiles.com/v355'); this.load.spritesheet('ship', 'assets/games/lazer/ship.png', { frameWidth: 16, frameHeight: 24 }); } function create () { this.anims.create( { key: 'thrust', frames: this.anims.generateFrameNumbers('ship', { frames: [ 2, 7 ] }), frameRate: 20, repeat: -1 }); let points = [ new Phaser.Geom.Circle(100, 100, 32), new Phaser.Geom.Circle(400, 100, 32), new Phaser.Geom.Circle(700, 100, 32), new Phaser.Geom.Circle(100, 300, 32), new Phaser.Geom.Circle(400, 300, 32), new Phaser.Geom.Circle(700, 300, 32), new Phaser.Geom.Circle(100, 500, 32), new Phaser.Geom.Circle(400, 500, 32), new Phaser.Geom.Circle(700, 500, 32) ]; var debug = this.add.graphics(); debug.lineStyle(1, 0x00ff00); points.forEach(function (p) { debug.strokeCircleShape(p); }); g = this.add.graphics(); ship = new Ship(this, 400, 300, points); } function update () { g.clear(); g.fillStyle(0xff0000); g.fillRect(ship.target.x, ship.target.y, 4, 4); }