diff --git a/media/images/blueenemy.png b/media/images/blueenemy.png new file mode 100644 index 0000000..4d26c1b Binary files /dev/null and b/media/images/blueenemy.png differ diff --git a/media/images/blueenemybeam.png b/media/images/blueenemybeam.png new file mode 100644 index 0000000..47802f4 Binary files /dev/null and b/media/images/blueenemybeam.png differ diff --git a/src/data/wavesData.yaml b/src/data/wavesData.yaml index 539f49d..459277a 100644 --- a/src/data/wavesData.yaml +++ b/src/data/wavesData.yaml @@ -30,20 +30,24 @@ - h: 15 e: 8 + r: 1 - g: 15 e: 8 a: 6 h: 4 + r: 2 - g: 20 e: 10 a: 4 h: 6 + r: 3 - g: 25 e: 10 a: 8 + r: 4 - g: 25 e: 10 diff --git a/src/plugins/shooting.js b/src/plugins/shooting.js index e025a35..90a8bb5 100644 --- a/src/plugins/shooting.js +++ b/src/plugins/shooting.js @@ -17,6 +17,7 @@ export default class Shooting { this.playerBullets = this.game.add.group(); this.enforcerBullets = this.game.add.group(); + this.rangerBullets = this.game.add.group(); this.spears = this.game.add.group(); for (let x = 0; x < NUM_BULLETS; x++) { let bullet = new Bullet(this.game, 0, 0); @@ -27,7 +28,11 @@ export default class Shooting { enforcerBullet.alive = enforcerBullet.exists = enforcerBullet.visible = false; this.enforcerBullets.add(enforcerBullet); - let spear = new Spear(this.game, 0, 0); + let rangerBullet = new rangerBullet(this.game, 0, 0); + rangerBullet.alive = rangerBullet.exists = rangerBullet.visible = false; + this.rangerBullets.add(rangerBullet); + + let spear = new Spear(this.game, 0, 0); spear.alive = spear.exists = spear.visible = false; this.spears.add(spear); } @@ -35,9 +40,11 @@ export default class Shooting { this.game.waves.onTransition.add(() => { this.playerBullets.callAll('kill'); this.enforcerBullets.callAll('kill'); + this.rangerBullets.callAll('kill'); this.spears.callAll('kill'); // Set tint on bullets and spears. this.enforcerBullets.setAll('tint', this.game.tinting.currentTint); + this.rangerBullets.setAll('tint', this.game.tinting.currentTint); this.spears.setAll('tint', this.game.tinting.currentTint); }); } @@ -63,6 +70,15 @@ export default class Shooting { } } + rangerShoot(sx, sy, vx, vy) { + let bullet = this.rangerBullets.getFirstExists(false); + if (bullet) { + bullet.reset(sx, sy); + bullet.fire(vx, vy); + //this.enforcerShootSound.play(); + } + } + spearWarn() { this.spearWarnSound.play(); } @@ -87,6 +103,13 @@ export default class Shooting { this.game.physics.arcade.overlap(player, this.spears, this.onEnforcerBullet, null, this); } } + + let player = this.game.player; + if (player) { + this.game.physics.arcade.overlap(player, this.rangerBullets, this.onRangerBullet, null, this); + this.game.physics.arcade.overlap(player, this.spears, this.onRangerBullet, null, this); + } + } onProcess(enemy) { return enemy && enemy.alive; diff --git a/src/plugins/waves.js b/src/plugins/waves.js index eeddeb0..b4fcede 100644 --- a/src/plugins/waves.js +++ b/src/plugins/waves.js @@ -75,6 +75,16 @@ export default class Waves { this.loaded = true; }); } + + for (let i = 0; i < wave.r; i++) { + let ranger = new Ranger(this.game, this.game.world.randomX, this.game.world.randomY); + this.enemiesGroup.add(ranger); + this.game.spawn.startSpawn(ranger, () => { + this.loading = false; + this.loaded = true; + }); + } + for (let i = 0; i < wave.a; i++) { let assassin = new Assassin(this.game, this.game.world.randomX, this.game.world.randomY); this.enemiesGroup.add(assassin); diff --git a/src/sprites/ranger.js b/src/sprites/ranger.js new file mode 100644 index 0000000..f54da09 --- /dev/null +++ b/src/sprites/ranger.js @@ -0,0 +1,24 @@ +import Enemy from './enemy'; +import OrbitPlayer from '../behaviors/orbitPlayer'; +import ShootPlayer from '../behaviors/shootPlayer'; + +export default class Ranger extends Enemy { +constructor(game, x, y) { +super(game, x, y, 'blueenemy', 0); + +this.addBehavior(new OrbitPlayer()); +this.addBehavor(new ShootPlayer()); + +this.anchor.set(0.5); +this.body.width = 20; +this.body.height = 30; +this.body.bounce.set(0.6); + +this.health = 40; +this.score = 600; + + + + +} +} \ No newline at end of file diff --git a/src/sprites/rangerBullet.js b/src/sprites/rangerBullet.js new file mode 100644 index 0000000..6750b63 --- /dev/null +++ b/src/sprites/rangerBullet.js @@ -0,0 +1,32 @@ +const BULLET_LIFETIME_MS = 2000; +const BULLET_MAIN_VELOCITY = 500; + +export default class RangerBullet extends Phaser.Sprite { +constructor(game, x, y){ +super(game, x, y, 'blueenemybeam', 0); +game.physics.arcade.enable(this); + +this.anchor.setTo(0.5); +this.body.width = 4; +this.body.height = 4; +this.tint = game.tinting.currentTint; + +} + +update(){ +this.rotation += 0.1 * this.game.time.physicsElapsedMS; +} +fire(velX, velY){ +this.killEvent = this.game.time.events.add(BULLET_LIFETIME_MS, () =>{ +this.kill(); +}); +this.body.velocity.x = BULLET_MAIN_VELOCITY * velX; +this.body.velocity.y = BULLET_MAIN_VELOCITY * velY; +} + +kill() { +super.kill(); +this.game.time.events.remove(this.killEvent); +} + +} \ No newline at end of file diff --git a/src/states/preload.js b/src/states/preload.js index 4a07aa2..b9d97ec 100644 --- a/src/states/preload.js +++ b/src/states/preload.js @@ -17,7 +17,9 @@ export default class Preload extends Phaser.State { this.game.load.image('button', require('../../media/images/button.png'), 240, 80); this.game.load.image('phaserLogo', require('../../media/images/Phaser-Logo-Small.png'), 382, 331); this.game.load.image('drhayesLogo', require('../../media/images/drhayes.png'), 552, 586); - + this.game.load.image('blueenemy', require('../../media/images/blueenemy.png'), 32,32); + this.game.load.image('blueenemybeam', require('../../media/images/blueenemybeam.png'), 32,32); + this.game.load.audio('shoot', require('../../media/sounds/shoot.mp3')); this.game.load.audio('smallBoom', require('../../media/sounds/smallBoom.mp3')); this.game.load.audio('mediumBoom', require('../../media/sounds/mediumBoom.mp3'));