From f0ea86361084e8866abde7421e58a85a252eb7ef Mon Sep 17 00:00:00 2001 From: clmaisonha Date: Mon, 8 Jun 2020 21:48:26 +0200 Subject: [PATCH] =?UTF-8?q?Cr=C3=A9ation=20des=20bars=20de=20vie=20et=20de?= =?UTF-8?q?=20bouclier.=20Ajout=20animation=20de=20tir.=20Les=20robots=20c?= =?UTF-8?q?hangent=20automatiquement=20de=20cible=20quand=20celle-ci=20meu?= =?UTF-8?q?re.=20Les=20robots=20choisissent=20pour=20cible=20le=20robot=20?= =?UTF-8?q?le=20plus=20proche=20d'eux.=20Si=20deux=20robots=20sont=20?= =?UTF-8?q?=C3=A0=20la=20meme=20distance,=20c'est=20al=C3=A9atoire.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Code/assets/bullet.png | Bin 0 -> 37847 bytes Code/public/js/class.min.js | 2 +- Code/src/js/classes/Boot.js | 1 + Code/src/js/classes/GamingBoard.js | 70 ++++++++++----- Code/src/js/classes/HealthBar.js | 68 +++++++++++++++ Code/src/js/classes/Missile.js | 9 ++ Code/src/js/classes/Robot.js | 136 ++++++++++++++++++++--------- 7 files changed, 224 insertions(+), 62 deletions(-) create mode 100644 Code/assets/bullet.png create mode 100644 Code/src/js/classes/HealthBar.js create mode 100644 Code/src/js/classes/Missile.js diff --git a/Code/assets/bullet.png b/Code/assets/bullet.png new file mode 100644 index 0000000000000000000000000000000000000000..ab9b481f2d85c35bf600ab8cb6253e63faf49260 GIT binary patch literal 37847 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.setFrame(0)),t.on("pointerover",()=>t.setFrame(1)),t.on("pointerdown",()=>this.clickPlay(t))}clickPlay(t){t.setFrame(2),console.log("Play"),this.scene.start("Type")}}class Game extends Phaser.Scene{constructor(t){super("Game"),this.game=t}preload(){this.gm=new GamingBoard,this.game.scene.add("GamingBoard",this.gm)}create(){let t=this.add.sprite(WIDTH_WINDOW/1.5,HEIGHT_WINDOW/3*2,"btn_play").setOrigin(.5,.5).setInteractive();t.on("pointerout",()=>t.setFrame(0)),t.on("pointerover",()=>t.setFrame(1)),t.on("pointerdown",()=>this.clickPlay(t)),this.scene.launch("GamingBoard"),this.scene.pause("GamingBoard")}clickPlay(t){this.scene.isPaused("GamingBoard")?this.scene.resume("GamingBoard"):this.scene.pause("GamingBoard")}}class GamingBoard extends Phaser.Scene{constructor(){super("GamingBoard")}preload(){this.cameras.main.setViewport(WIDTH_WINDOW/10,HEIGHT_WINDOW/10,WIDTH_MAP,WIDTH_MAP)}create(){this.add.image(0,0,"background").alpha=.1,this.enemy=new Robot(.1*WIDTH_MAP,.1*WIDTH_MAP,.9*WIDTH_MAP,.9*WIDTH_MAP,6711039,this),this.myself=new Robot(.1*WIDTH_MAP,.1*WIDTH_MAP,.1*WIDTH_MAP,.1*WIDTH_MAP,16724940,this),this.myself2=new Robot(.1*WIDTH_MAP,.1*WIDTH_MAP,.1*WIDTH_MAP,.9*WIDTH_MAP,16777215,this),this.myself.setTarget(this.enemy),this.myself2.setTarget(this.enemy),this.events.on("resume",()=>this.resume())}update(t,e){super.update(t,e),null!=this.myself.target&&this.myself.target.isAlive()&&(this.myself.isTargetInRange()?this.myself.attackTarget():this.myself.advanceToTarget()),null!=this.myself2.target&&this.myself2.target.isAlive()&&(this.myself2.isTargetInRange()?this.myself2.attackTarget():this.myself2.advanceToTarget(),console.log(this.enemy.life))}resume(){this.myself2.updateTarget()}}class Robot{constructor(t,e,s,i,a,h){this.height=t,this.width=e,this.x=s,this.y=i,this.color=a,this.range=WIDTH_MAP/2,this.damage=DAMAGE,this.life=LIFE,this.shield=SHIELD,this.addScene(h)}addScene(t){this.scene=t,this.circle=this.scene.add.circle(this.x,this.y,this.width/2,this.color)}setX(t){this.x=t,this.circle.setX(this.x)}setY(t){this.y=t,this.circle.setY(this.y)}setTarget(t){this.target=t,null!=this.target&&this.updateTarget()}updateTarget(){this.setTargetPos(this.target.x,this.target.y)}setTargetPos(t,e){let s=this.target.x-this.x,i=this.target.y-this.y,a=Math.hypot(s,i);this.velocityX=s/a*WIDTH_MAP/1e3*SPEED,this.velocityY=i/a*WIDTH_MAP/1e3*SPEED}advanceToTarget(){this.velocityX>=0&&this.x>=this.target.x||this.velocityX<=0&&this.x<=this.target.x?this.setX(this.target.x):this.setX(this.x+this.velocityX),this.velocityY>=0&&this.y>=this.target.y||this.velocityY<=0&&this.y<=this.target.y?this.setY(this.target.y):this.setY(this.y+this.velocityY)}fleeFromTarget(){this.velocityX>=0&&this.x-this.width/2<=0?this.setX(this.width/2):this.velocityX<=0&&this.x+this.width/2>=WIDTH_MAP?this.setX(WIDTH_MAP-this.width/2):this.setX(this.x-this.velocityX),this.velocityY>=0&&this.y-this.width/2<=0?this.setY(this.height/2):this.velocityY<=0&&this.y+this.width/2>=WIDTH_MAP?this.setY(WIDTH_MAP-this.height/2):this.setY(this.y-this.velocityY)}attackTarget(){return this.isTargetInRange()&&this.attack(this.target),!1}attack(t){t.beAttack(this.damage)&&this.setTarget(null)}beAttack(t){return this.shield=this.shield-t,this.shield<0&&(this.life+=this.shield,this.shield=0),this.life<=0&&(this.life=0),this.die()}isTargetInRange(){return Math.hypot(this.target.x-this.x,this.target.y-this.y)0}die(){return 0===this.life&&(this.circle.destroy(),!0)}}class Type extends Phaser.Scene{constructor(){super("Type")}preload(){}create(){this.add.text(WIDTH_WINDOW/2,HEIGHT_WINDOW/4,"WARIA",{font:"200px stencil",fill:"#e2e2e2"}).setOrigin(.5,1);let t=this.add.sprite(WIDTH_WINDOW/8*3,HEIGHT_WINDOW/4*2,"btn_duel").setInteractive();this.createbutton(t);let e=this.add.sprite(WIDTH_WINDOW/8*5,HEIGHT_WINDOW/4*2,"btn_last").setInteractive();this.createbutton(e);let s=this.add.sprite(WIDTH_WINDOW/8*2,HEIGHT_WINDOW/4*3,"btn_team").setInteractive();this.createbutton(s);let i=this.add.sprite(WIDTH_WINDOW/8*4,HEIGHT_WINDOW/4*3,"btn_flag").setInteractive();this.createbutton(i);let a=this.add.sprite(WIDTH_WINDOW/8*6,HEIGHT_WINDOW/4*3,"btn_map").setInteractive();this.createbutton(a)}createbutton(t){t.displayHeight=HEIGHT_WINDOW/4,t.scaleX=t.scaleY,t.on("pointerout",()=>t.setFrame(0)),t.on("pointerover",()=>t.setFrame(1)),t.on("pointerdown",()=>this.clickPlay(t))}clickPlay(t){this.scene.start("Game")}} \ No newline at end of file +class Boot extends Phaser.Scene{constructor(){super("Boot")}preload(){this.load.spritesheet("btn_play","assets/btnPlay.png",{frameWidth:650,frameHeight:170}),this.load.spritesheet("btn_duel","assets/btnDuel.png",{frameWidth:269,frameHeight:262}),this.load.spritesheet("btn_last","assets/btnLast.png",{frameWidth:269,frameHeight:262}),this.load.spritesheet("btn_team","assets/btnTeam.png",{frameWidth:269,frameHeight:262}),this.load.spritesheet("btn_flag","assets/btnFlag.png",{frameWidth:269,frameHeight:262}),this.load.spritesheet("btn_map","assets/btnMap.png",{frameWidth:269,frameHeight:262}),this.load.image("background","assets/background.png"),this.load.image("bullet","assets/bullet.png")}create(){this.add.text(WIDTH_WINDOW/2,HEIGHT_WINDOW/3,"WARIA",{font:"200px stencil",fill:"#e2e2e2"}).setOrigin(.5,.5);let t=this.add.sprite(WIDTH_WINDOW/2,HEIGHT_WINDOW/3*2,"btn_play").setInteractive();t.on("pointerout",()=>t.setFrame(0)),t.on("pointerover",()=>t.setFrame(1)),t.on("pointerdown",()=>this.clickPlay(t))}clickPlay(t){t.setFrame(2),console.log("Play"),this.scene.start("Type")}}class Game extends Phaser.Scene{constructor(t){super("Game"),this.game=t}preload(){this.gm=new GamingBoard,this.game.scene.add("GamingBoard",this.gm)}create(){let t=this.add.sprite(WIDTH_WINDOW/1.5,HEIGHT_WINDOW/3*2,"btn_play").setOrigin(.5,.5).setInteractive();t.on("pointerout",()=>t.setFrame(0)),t.on("pointerover",()=>t.setFrame(1)),t.on("pointerdown",()=>this.clickPlay(t)),this.scene.launch("GamingBoard"),this.scene.pause("GamingBoard")}clickPlay(t){this.scene.isPaused("GamingBoard")?this.scene.resume("GamingBoard"):this.scene.pause("GamingBoard")}}class GamingBoard extends Phaser.Scene{constructor(){super("GamingBoard")}preload(){this.cameras.main.setViewport(WIDTH_WINDOW/10,HEIGHT_WINDOW/10,WIDTH_MAP,WIDTH_MAP)}create(){this.add.image(0,0,"background").alpha=.1,this.listRobot=[],this.listRobot.push(new Robot(.1*WIDTH_MAP,.1*WIDTH_MAP,.9*WIDTH_MAP,.9*WIDTH_MAP,6711039,this)),this.listRobot.push(new Robot(.1*WIDTH_MAP,.1*WIDTH_MAP,.1*WIDTH_MAP,.1*WIDTH_MAP,16724940,this)),this.listRobot.push(new Robot(.1*WIDTH_MAP,.1*WIDTH_MAP,.1*WIDTH_MAP,.9*WIDTH_MAP,16777215,this));for(let t=0;tthis.resume())}update(t,e){super.update(t,e),this.listRobot.forEach(function(t){t.haveTarget()&&(t.isTargetInRange()?t.attackTarget():t.advanceToTarget())});for(let t=0;t=h&&(e>h&&(e=h,s=[]),s.push(i))}}),this.listRobot.length>1?t.setTarget(s[Math.floor(Math.random()*(s.length+1))]):t.setTarget(s[0])}}class HealthBar{constructor(t,e,s,i,h,a,r){this.bar=new Phaser.GameObjects.Graphics(t),this.width=e,this.height=s,this.valueMax=a,this.value=a,this.color=r,this.draw(),this.setX(i),this.setY(h),t.add.existing(this.bar)}decrease(t){this.value-=t;let e=0;return this.value<0&&(e=-this.value,this.value=0),this.draw(),e}setX(t){this.bar.setX(t-this.width/2)}setY(t){this.bar.setY(t)}draw(){this.bar.clear(),this.bar.fillStyle(0),this.bar.fillRect(0,0,this.width,this.height),this.bar.fillStyle(16777215),this.bar.fillRect(2,2,this.width-4,this.height-4);let t=this.value/this.valueMax;t<.3?this.bar.fillStyle(16711680):this.bar.fillStyle(this.color);let e=Math.floor(t*(this.width-4));this.bar.fillRect(2,2,e,this.height-4)}destroy(){this.bar.destroy()}}class Missile extends Phaser.GameObjects.Image{constructor(t,e,s,i){super(t,0,0,e),this.visible=!1,this.setOrigin(.5,.5),this.setScale(.02)}}class Robot{constructor(t,e,s,i,h,a){this.height=t,this.width=e,this.x=s,this.y=i,this.color=h,this.range=WIDTH_MAP/2,this.damage=DAMAGE,this.life=new HealthBar(a,2*this.width,this.width/3,this.x,this.y-this.width,LIFE,32768),this.shield=new HealthBar(a,2*this.width,this.width/3,this.x,this.y-1.5*this.width,SHIELD,255),this.canAttack=!0,this.missile=new Missile(a,"bullet",this.width/5,this.width/4),a.add.existing(this.missile),this.addScene(a)}addScene(t){this.scene=t,this.circle=this.scene.add.circle(this.x,this.y,this.width/2,this.color)}setX(t){this.x=t,this.circle.setX(this.x),this.life.setX(this.x),this.shield.setX(this.x)}setY(t){this.y=t,this.life.setY(this.y-this.width),this.shield.setY(this.y-1.5*this.width),this.circle.setY(this.y)}setTarget(t){this.target=t,this.updateTarget()}updateTarget(){this.verifyTarget()&&this.setTargetPos(this.target.x,this.target.y)}setTargetPos(t,e){let s=this.target.x-this.x,i=this.target.y-this.y,h=Math.hypot(s,i);this.velocityX=s/h*WIDTH_MAP/1e3*SPEED,this.velocityY=i/h*WIDTH_MAP/1e3*SPEED}advanceToTarget(){this.verifyTarget()&&(this.velocityX>=0&&this.x>=this.target.x||this.velocityX<=0&&this.x<=this.target.x?this.setX(this.target.x):this.setX(this.x+this.velocityX),this.velocityY>=0&&this.y>=this.target.y||this.velocityY<=0&&this.y<=this.target.y?this.setY(this.target.y):this.setY(this.y+this.velocityY))}fleeFromTarget(){this.verifyTarget()&&(this.velocityX>=0&&this.x-this.width/2<=0?this.setX(this.width/2):this.velocityX<=0&&this.x+this.width/2>=WIDTH_MAP?this.setX(WIDTH_MAP-this.width/2):this.setX(this.x-this.velocityX),this.velocityY>=0&&this.y-this.width/2<=0?this.setY(this.height/2):this.velocityY<=0&&this.y+this.width/2>=WIDTH_MAP?this.setY(WIDTH_MAP-this.height/2):this.setY(this.y-this.velocityY))}attackTarget(){return!!(this.verifyTarget()&&this.canAttack&&this.target.isAlive()&&this.isTargetInRange())&&(this.attack(this.target),!0)}verifyTarget(){return!!this.haveTarget()&&(!!this.target.isAlive()||(this.setTarget(null),!1))}attack(t){this.canAttack=!1,this.missile.setPosition(this.x,this.y).setVisible(!0),this.missile.setRotation(Math.atan2(this.y-this.target.y,this.x-this.target.x)-1.57),this.scene.tweens.add({targets:this.missile,x:t.x,y:t.y,ease:"Linear",duration:200,onComplete:()=>this.finishAttack(t)}),this.scene.time.addEvent({delay:Phaser.Math.Between(1e3,3e3),callback:this.reload,callbackScope:this})}finishAttack(t){t.beAttack(this.damage)&&this.setTarget(null),this.missile.setVisible(!1)}reload(){this.canAttack=!0}beAttack(t){let e=this.shield.decrease(t);return e>0&&(console.log("Shield Broken"),this.life.decrease(e)),this.die()}isTargetInRange(){if(this.verifyTarget()){return Math.hypot(this.target.x-this.x,this.target.y-this.y)0}die(){return 0===this.life.value&&(this.circle.destroy(),this.shield.destroy(),this.life.destroy(),!0)}haveTarget(){return null!=this.target}}class Type extends Phaser.Scene{constructor(){super("Type")}preload(){}create(){this.add.text(WIDTH_WINDOW/2,HEIGHT_WINDOW/4,"WARIA",{font:"200px stencil",fill:"#e2e2e2"}).setOrigin(.5,1);let t=this.add.sprite(WIDTH_WINDOW/8*3,HEIGHT_WINDOW/4*2,"btn_duel").setInteractive();this.createbutton(t);let e=this.add.sprite(WIDTH_WINDOW/8*5,HEIGHT_WINDOW/4*2,"btn_last").setInteractive();this.createbutton(e);let s=this.add.sprite(WIDTH_WINDOW/8*2,HEIGHT_WINDOW/4*3,"btn_team").setInteractive();this.createbutton(s);let i=this.add.sprite(WIDTH_WINDOW/8*4,HEIGHT_WINDOW/4*3,"btn_flag").setInteractive();this.createbutton(i);let h=this.add.sprite(WIDTH_WINDOW/8*6,HEIGHT_WINDOW/4*3,"btn_map").setInteractive();this.createbutton(h)}createbutton(t){t.displayHeight=HEIGHT_WINDOW/4,t.scaleX=t.scaleY,t.on("pointerout",()=>t.setFrame(0)),t.on("pointerover",()=>t.setFrame(1)),t.on("pointerdown",()=>this.clickPlay(t))}clickPlay(t){this.scene.start("Game")}} \ No newline at end of file diff --git a/Code/src/js/classes/Boot.js b/Code/src/js/classes/Boot.js index bec87e5..e1d46aa 100644 --- a/Code/src/js/classes/Boot.js +++ b/Code/src/js/classes/Boot.js @@ -11,6 +11,7 @@ class Boot extends Phaser.Scene { this.load.spritesheet('btn_flag', 'assets/btnFlag.png', {frameWidth: 269, frameHeight: 262}); this.load.spritesheet('btn_map', 'assets/btnMap.png', {frameWidth: 269, frameHeight: 262}); this.load.image('background', 'assets/background.png'); + this.load.image('bullet','assets/bullet.png'); } create() { diff --git a/Code/src/js/classes/GamingBoard.js b/Code/src/js/classes/GamingBoard.js index bb863e4..1675024 100644 --- a/Code/src/js/classes/GamingBoard.js +++ b/Code/src/js/classes/GamingBoard.js @@ -5,43 +5,73 @@ class GamingBoard extends Phaser.Scene { preload() { this.cameras.main.setViewport(WIDTH_WINDOW / 10, HEIGHT_WINDOW / 10, WIDTH_MAP, WIDTH_MAP); - } create() { this.add.image(0, 0, 'background').alpha = 0.1; - this.enemy = new Robot(WIDTH_MAP * 0.1, WIDTH_MAP * 0.1, WIDTH_MAP * 0.9, WIDTH_MAP * 0.9, 0x6666ff, this); - //this.myself = this.add.circle(this.width * 0.1, this.width * 0.1, this.width * 0.05, 0x6666ff); - this.myself = new Robot(WIDTH_MAP * 0.1, WIDTH_MAP * 0.1, WIDTH_MAP * 0.1, WIDTH_MAP * 0.1, 0xff33cc, this); - this.myself2 = new Robot(WIDTH_MAP * 0.1, WIDTH_MAP * 0.1, WIDTH_MAP * 0.1, WIDTH_MAP * 0.9, 0xffffff, this); + this.listRobot = []; + this.listRobot.push(new Robot(WIDTH_MAP * 0.1, WIDTH_MAP * 0.1, WIDTH_MAP * 0.9, WIDTH_MAP * 0.9, 0x6666ff, this)); + this.listRobot.push(new Robot(WIDTH_MAP * 0.1, WIDTH_MAP * 0.1, WIDTH_MAP * 0.1, WIDTH_MAP * 0.1, 0xff33cc, this)); + this.listRobot.push(new Robot(WIDTH_MAP * 0.1, WIDTH_MAP * 0.1, WIDTH_MAP * 0.1, WIDTH_MAP * 0.9, 0xffffff, this)); - this.myself.setTarget(this.enemy); - this.myself2.setTarget(this.enemy); + for (let i = 0; i < this.listRobot.length; i++) { + this.chooseTarget(this.listRobot[i]); + } this.events.on('resume', () => this.resume()); } update(time, delta) { super.update(time, delta); - if (this.myself.target != null && this.myself.target.isAlive()) { - if (!this.myself.isTargetInRange()) - this.myself.advanceToTarget(); - else - this.myself.attackTarget(); - } - if (this.myself2.target != null && this.myself2.target.isAlive()) { - if (!this.myself2.isTargetInRange()) - this.myself2.advanceToTarget(); - else - this.myself2.attackTarget(); - console.log(this.enemy.life); + this.listRobot.forEach(function (robot) { + if (robot.haveTarget()) { + if (!robot.isTargetInRange()) + robot.advanceToTarget(); + else + robot.attackTarget(); + } + }) + + for (let i = 0; i < this.listRobot.length; i++) { + if (!this.listRobot[i].isAlive()) { + this.listRobot.splice(i, 1); + i -= 1; + } else { + if (!this.listRobot[i].haveTarget()) { + this.chooseTarget(this.listRobot[i]); + } else { + this.listRobot[i].updateTarget(); + } + } } } resume() { - this.myself2.updateTarget(); + //this.myself2.updateTarget(); + } + + chooseTarget(robot) { + let minDist = WIDTH_MAP * 2; + let l = []; + this.listRobot.forEach(function (item) { + if (item !== robot && item.isAlive()) { + let hypot = Math.hypot(item.x - robot.x, item.y - robot.y); + if (minDist >= hypot) { + if (minDist > hypot) { + minDist = hypot; + l = []; + } + l.push(item); + } + } + }); + if (this.listRobot.length > 1) { + robot.setTarget(l[Math.floor(Math.random() * (l.length + 1))]); + } else { + robot.setTarget(l[0]); + } } diff --git a/Code/src/js/classes/HealthBar.js b/Code/src/js/classes/HealthBar.js new file mode 100644 index 0000000..9c6a6b1 --- /dev/null +++ b/Code/src/js/classes/HealthBar.js @@ -0,0 +1,68 @@ +class HealthBar { + constructor(scene, width, height, x, y, valueMax, color) { + this.bar = new Phaser.GameObjects.Graphics(scene); + + this.width = width; + this.height = height; + this.valueMax = valueMax; + this.value = valueMax; + this.color = color; + + this.draw(); + + this.setX(x); + this.setY(y); + scene.add.existing(this.bar); + } + + decrease(amount) { + this.value -= amount; + + let diff = 0; + if (this.value < 0) { + diff = -this.value; + this.value = 0; + } + + this.draw(); + + return diff; + } + + setX(x) { + this.bar.setX(x - this.width / 2); + } + + setY(y) { + this.bar.setY(y); + } + + draw() { + this.bar.clear(); + + // BG + this.bar.fillStyle(0x000000); + this.bar.fillRect(0, 0, this.width, this.height); + + // Health + + this.bar.fillStyle(0xffffff); + this.bar.fillRect(2, 2, this.width - 4, this.height - 4); + + let percent = this.value / this.valueMax; + + if (percent < 0.3) { + this.bar.fillStyle(0xff0000); + } else { + this.bar.fillStyle(this.color); + } + + let d = Math.floor(percent * (this.width - 4)); + + this.bar.fillRect(2, 2, d, this.height - 4); + } + + destroy() { + this.bar.destroy(); + } +} \ No newline at end of file diff --git a/Code/src/js/classes/Missile.js b/Code/src/js/classes/Missile.js new file mode 100644 index 0000000..59ca1ef --- /dev/null +++ b/Code/src/js/classes/Missile.js @@ -0,0 +1,9 @@ +class Missile extends Phaser.GameObjects.Image { + + constructor(scene, frame, width, height) { + super(scene, 0, 0, frame); + this.visible = false; + this.setOrigin(0.5, 0.5); + this.setScale(0.02); + } +} \ No newline at end of file diff --git a/Code/src/js/classes/Robot.js b/Code/src/js/classes/Robot.js index 2bcc357..c298fb7 100644 --- a/Code/src/js/classes/Robot.js +++ b/Code/src/js/classes/Robot.js @@ -7,8 +7,13 @@ class Robot { this.color = color; this.range = WIDTH_MAP / 2; this.damage = DAMAGE; - this.life = LIFE; - this.shield = SHIELD; + this.life = new HealthBar(scene, this.width * 2, this.width / 3, this.x, this.y - this.width, LIFE, 0x008000); + this.shield = new HealthBar(scene, this.width * 2, this.width / 3, this.x, this.y - this.width * 1.5, SHIELD, 0x0000FF); + + this.canAttack = true; + this.missile = new Missile(scene, 'bullet', this.width / 5, this.width / 4); + scene.add.existing(this.missile); + this.addScene(scene); } @@ -20,21 +25,25 @@ class Robot { setX(x) { this.x = x; this.circle.setX(this.x); + this.life.setX(this.x); + this.shield.setX(this.x); } setY(y) { this.y = y; + this.life.setY(this.y - this.width); + this.shield.setY(this.y - this.width * 1.5); this.circle.setY(this.y); } setTarget(target) { this.target = target; - if (this.target != null) - this.updateTarget(); + this.updateTarget(); } updateTarget() { - this.setTargetPos(this.target.x, this.target.y); + if (this.verifyTarget()) + this.setTargetPos(this.target.x, this.target.y); } setTargetPos(x, y) { @@ -46,75 +55,120 @@ class Robot { } advanceToTarget() { - if ((this.velocityX >= 0 && this.x >= this.target.x) || (this.velocityX <= 0 && this.x <= this.target.x)) - this.setX(this.target.x); - else - this.setX(this.x + this.velocityX); - - if ((this.velocityY >= 0 && this.y >= this.target.y) || (this.velocityY <= 0 && this.y <= this.target.y)) - this.setY(this.target.y); - else - this.setY(this.y + this.velocityY); - + if (this.verifyTarget()) { + if ((this.velocityX >= 0 && this.x >= this.target.x) || (this.velocityX <= 0 && this.x <= this.target.x)) + this.setX(this.target.x); + else + this.setX(this.x + this.velocityX); + + if ((this.velocityY >= 0 && this.y >= this.target.y) || (this.velocityY <= 0 && this.y <= this.target.y)) + this.setY(this.target.y); + else + this.setY(this.y + this.velocityY); + } } fleeFromTarget() { - if (this.velocityX >= 0 && this.x - this.width / 2 <= 0) - this.setX(this.width / 2); - else if (this.velocityX <= 0 && this.x + this.width / 2 >= WIDTH_MAP) - this.setX(WIDTH_MAP - this.width / 2); - else - this.setX(this.x - this.velocityX); - - if (this.velocityY >= 0 && this.y - this.width / 2 <= 0) - this.setY(this.height / 2); - else if (this.velocityY <= 0 && this.y + this.width / 2 >= WIDTH_MAP) - this.setY(WIDTH_MAP - this.height / 2); - else - this.setY(this.y - this.velocityY); + if (this.verifyTarget()) { + if (this.velocityX >= 0 && this.x - this.width / 2 <= 0) + this.setX(this.width / 2); + else if (this.velocityX <= 0 && this.x + this.width / 2 >= WIDTH_MAP) + this.setX(WIDTH_MAP - this.width / 2); + else + this.setX(this.x - this.velocityX); + + if (this.velocityY >= 0 && this.y - this.width / 2 <= 0) + this.setY(this.height / 2); + else if (this.velocityY <= 0 && this.y + this.width / 2 >= WIDTH_MAP) + this.setY(WIDTH_MAP - this.height / 2); + else + this.setY(this.y - this.velocityY); + } } attackTarget() { - if (this.isTargetInRange()) { + if (this.verifyTarget() && this.canAttack && this.target.isAlive() && this.isTargetInRange()) { this.attack(this.target); + return true; } return false; } + verifyTarget() { + if (this.haveTarget()) { + if (!this.target.isAlive()) { + this.setTarget(null); + return false; + } + return true; + } + + return false; + } + attack(target) { + this.canAttack = false; + + this.missile.setPosition(this.x, this.y).setVisible(true); + + this.missile.setRotation(Math.atan2(this.y - this.target.y, this.x - this.target.x) - 3.14 / 2); + + this.scene.tweens.add({ + targets: this.missile, + x: target.x, + y: target.y, + ease: 'Linear', + duration: 200, + onComplete: () => this.finishAttack(target) + }); + + this.scene.time.addEvent({delay: Phaser.Math.Between(1000, 3000), callback: this.reload, callbackScope: this}); + } + + finishAttack(target) { if (target.beAttack(this.damage)) { this.setTarget(null); } + this.missile.setVisible(false); + } + + reload() { + this.canAttack = true; } beAttack(damage) { - this.shield = this.shield - damage; - if (this.shield < 0) { - this.life += this.shield; - this.shield = 0; - } - if (this.life <= 0) { - this.life = 0; + let diff = this.shield.decrease(damage) + if (diff > 0) { + console.log("Shield Broken"); + this.life.decrease(diff); } return this.die(); } isTargetInRange() { - let hypot = Math.hypot(this.target.x - this.x, this.target.y - this.y); - return hypot < this.range; - + if (this.verifyTarget()) { + let hypot = Math.hypot(this.target.x - this.x, this.target.y - this.y); + return hypot < this.range; + } + return false; } isAlive() { - return this.life > 0; + return this.life.value > 0; } die() { - if (this.life === 0) { + if (this.life.value === 0) { this.circle.destroy(); + this.shield.destroy(); + this.life.destroy(); return true; } return false; } + + haveTarget() { + return this.target != null; + } }