diff --git a/Code/assets/bullet.png b/Code/assets/bullet.png new file mode 100644 index 0000000..ab9b481 Binary files /dev/null and b/Code/assets/bullet.png differ diff --git a/Code/public/js/class.min.js b/Code/public/js/class.min.js index 1a27aac..4297c3f 100644 --- a/Code/public/js/class.min.js +++ b/Code/public/js/class.min.js @@ -1 +1 @@ -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")}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.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; + } }