From 9ba17166a7cc711b847e9ea269e8265ca4f8baf5 Mon Sep 17 00:00:00 2001 From: clmaisonha Date: Tue, 9 Jun 2020 20:08:54 +0200 Subject: [PATCH] =?UTF-8?q?Cr=C3=A9ation=20d'un=20cube=20d=C3=A9pla=C3=A7a?= =?UTF-8?q?ble=20-=20Cr=C3=A9ation=20des=20nodes=20:=20Les=20actions=20se?= =?UTF-8?q?=20font=20de=20mani=C3=A8re=20dynamique=20sur=20le=20robot=20-?= =?UTF-8?q?=20si=20la=20premi=C3=A8re=20action=20n'aboutit=20pas,=20la=20d?= =?UTF-8?q?euxi=C3=A8me=20action=20est=20effectu=C3=A9e=20-=20Cr=C3=A9atio?= =?UTF-8?q?n=20des=20conditions=20-=20Pour=20le=20moment,=20si=20le=20robo?= =?UTF-8?q?t=20passe=20en=20dessous=20de=20la=20condition=20de=20bouclier,?= =?UTF-8?q?=20il=20effectue=20les=20action=20qui=20lui=20sont=20li=C3=A9s?= =?UTF-8?q?=20(Ex=20:=20reculer)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Code/public/js/class.min.js | 2 +- Code/src/js/classes/Attack.js | 12 ++++++ Code/src/js/classes/Condition.js | 60 ++++++++++++++++++++++++++++++ Code/src/js/classes/Game.js | 22 +++++++++-- Code/src/js/classes/GamingBoard.js | 9 +---- Code/src/js/classes/Move.js | 24 ++++++++++++ Code/src/js/classes/Node.js | 0 Code/src/js/classes/Robot.js | 37 +++++++++++++++--- 8 files changed, 150 insertions(+), 16 deletions(-) create mode 100644 Code/src/js/classes/Attack.js create mode 100644 Code/src/js/classes/Condition.js create mode 100644 Code/src/js/classes/Move.js create mode 100644 Code/src/js/classes/Node.js diff --git a/Code/public/js/class.min.js b/Code/public/js/class.min.js index 4297c3f..7082a21 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"),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 +class Attack{constructor(){}do(t){return!(!t.haveTarget()||!t.isTargetInRange())&&t.attackTarget()}}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 Condition{constructor(t,e=!1,s=!1,i,h){this.shieldFilter=e,this.rangeFilter=s,this.shield=i,this.range=h,this.target=t,this.lNode=[]}addNode(t){this.lNode.push(t)}do(t){if(this.doCondition(t))for(let e=0;et.setFrame(0)),t.on("pointerover",()=>t.setFrame(1)),t.on("pointerdown",()=>this.clickPlay(t)),this.scene.launch("GamingBoard"),this.scene.pause("GamingBoard");let e=this.add.rectangle(WIDTH_WINDOW/2,500,100,100,16777215);e.setInteractive(),this.input.setDraggable(e),this.input.on("drag",this.doDrag)}startDrag(t,e){this.input.off("pointerdown",this.startDrag,this),this.dragObj=e[0],this.input.on("pointermove",this.doDrag,this),this.input.on("pointerup",this.stopDrag,this)}doDrag(t,e,s,i){e.x=s,e.y=i}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,.2*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.read()});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 Move{constructor(t){this.toward=t}do(t){return!!t.haveTarget()&&(!0===this.toward?this.moveToward(t):this.fleeFrom(t))}moveToward(t){return t.advanceToTarget()}fleeFrom(t){return t.fleeFromTarget()}}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),this.lNode=[];let r=new Condition(this,!0,!1,.5,0);r.addNode(new Move(!1)),this.addNode(r),this.addNode(new Attack),this.addNode(new Move(!0))}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(){return!!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),!0)}fleeFromTarget(){return!!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),!0)}attackTarget(){return!!(this.verifyTarget()&&this.target.isAlive()&&this.isTargetInRange())&&(this.canAttack&&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(){return!!this.verifyTarget()&&this.calcDistance(this.target)0}die(){return 0===this.life.value&&(this.circle.destroy(),this.shield.destroy(),this.life.destroy(),!0)}haveTarget(){return null!=this.target}read(){for(let t=0;tt.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/Attack.js b/Code/src/js/classes/Attack.js new file mode 100644 index 0000000..4cc1625 --- /dev/null +++ b/Code/src/js/classes/Attack.js @@ -0,0 +1,12 @@ +class Attack { + constructor() { + + } + + do(robot) { + if (robot.haveTarget() && robot.isTargetInRange()) { + return robot.attackTarget(); + } + return false; + } +} \ No newline at end of file diff --git a/Code/src/js/classes/Condition.js b/Code/src/js/classes/Condition.js new file mode 100644 index 0000000..ec25823 --- /dev/null +++ b/Code/src/js/classes/Condition.js @@ -0,0 +1,60 @@ +class Condition { + constructor(target, shieldFilter = false, rangeFilter = false, shield, range) { //shieldFilter : true/false - rangeFilter : true/false + this.shieldFilter = shieldFilter; + this.rangeFilter = rangeFilter; + this.shield = shield; + this.range = range; + this.target = target; + + this.lNode = []; + } + + addNode(node) { + this.lNode.push(node); + } + + do(robot) { + if (this.doCondition(robot)) { + for (let i = 0; i < this.lNode.length; i++) { + if (this.lNode[i].do(robot)) { + return true; + } + } + } + return false; + } + + doCondition(robot) { + if (this.shieldFilter) { + if (this.shieldCondition()) { + if (this.rangeFilter) { + return this.rangeCondition(robot); + } + return true; + } + } else if (this.rangeFilter) { + return this.rangeCondition(robot); + } + return false; + } + + rangeCondition(robot) { + return robot.calcDistance(this.target) <= this.range; + } + + shieldCondition() { + if (this.target.shield.value / this.target.shield.valueMax <= this.shield) { + return true; + } + return false; + } + + + moveToward(robot) { + return robot.advanceToTarget(); + } + + fleeFrom(robot) { + return robot.fleeFromTarget(); + } +} \ No newline at end of file diff --git a/Code/src/js/classes/Game.js b/Code/src/js/classes/Game.js index 6dbe9e4..4609081 100644 --- a/Code/src/js/classes/Game.js +++ b/Code/src/js/classes/Game.js @@ -6,7 +6,7 @@ class Game extends Phaser.Scene { preload() { this.gm = new GamingBoard(); - this.game.scene.add('GamingBoard',this.gm); + this.game.scene.add('GamingBoard', this.gm); } create() { @@ -19,10 +19,26 @@ class Game extends Phaser.Scene { btn.on('pointerdown', () => this.clickPlay(btn)); this.scene.launch('GamingBoard'); this.scene.pause('GamingBoard'); + let rect = this.add.rectangle(WIDTH_WINDOW / 2, 500, 100, 100, 0xffffff); + rect.setInteractive(); + this.input.setDraggable(rect); + this.input.on('drag', this.doDrag); } - clickPlay(btn){ - if(this.scene.isPaused('GamingBoard')) + startDrag(pointer, targets) { + this.input.off('pointerdown', this.startDrag, this); + this.dragObj = targets[0]; + this.input.on('pointermove', this.doDrag, this); + this.input.on('pointerup', this.stopDrag, this); + } + + doDrag(pointer, target, dragX, dragY) { + target.x = dragX; + target.y = dragY; + } + + clickPlay(btn) { + if (this.scene.isPaused('GamingBoard')) this.scene.resume('GamingBoard'); else this.scene.pause('GamingBoard'); diff --git a/Code/src/js/classes/GamingBoard.js b/Code/src/js/classes/GamingBoard.js index 1675024..625ecfe 100644 --- a/Code/src/js/classes/GamingBoard.js +++ b/Code/src/js/classes/GamingBoard.js @@ -12,7 +12,7 @@ class GamingBoard extends Phaser.Scene { 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.2, 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)); for (let i = 0; i < this.listRobot.length; i++) { @@ -26,12 +26,7 @@ class GamingBoard extends Phaser.Scene { super.update(time, delta); this.listRobot.forEach(function (robot) { - if (robot.haveTarget()) { - if (!robot.isTargetInRange()) - robot.advanceToTarget(); - else - robot.attackTarget(); - } + robot.read(); }) for (let i = 0; i < this.listRobot.length; i++) { diff --git a/Code/src/js/classes/Move.js b/Code/src/js/classes/Move.js new file mode 100644 index 0000000..b2886fe --- /dev/null +++ b/Code/src/js/classes/Move.js @@ -0,0 +1,24 @@ +class Move { + constructor(toward) { //true = move toward / false = flee from + this.toward = toward; + } + + do(robot) { + if (robot.haveTarget()) { + if (this.toward === true) { + return this.moveToward(robot); + } else { + return this.fleeFrom(robot); + } + } + return false; + } + + moveToward(robot) { + return robot.advanceToTarget(); + } + + fleeFrom(robot) { + return robot.fleeFromTarget(); + } +} \ No newline at end of file diff --git a/Code/src/js/classes/Node.js b/Code/src/js/classes/Node.js new file mode 100644 index 0000000..e69de29 diff --git a/Code/src/js/classes/Robot.js b/Code/src/js/classes/Robot.js index c298fb7..d0a4d7e 100644 --- a/Code/src/js/classes/Robot.js +++ b/Code/src/js/classes/Robot.js @@ -15,6 +15,14 @@ class Robot { scene.add.existing(this.missile); this.addScene(scene); + + this.lNode = []; + + let condition = new Condition(this, true, false, 0.5, 0); + condition.addNode(new Move(false)); + this.addNode(condition); + this.addNode(new Attack()); + this.addNode(new Move(true)); } addScene(scene) { @@ -65,7 +73,9 @@ class Robot { this.setY(this.target.y); else this.setY(this.y + this.velocityY); + return true; } + return false; } fleeFromTarget() { @@ -83,13 +93,16 @@ class Robot { this.setY(WIDTH_MAP - this.height / 2); else this.setY(this.y - this.velocityY); + return true; } + return false; } attackTarget() { - if (this.verifyTarget() && this.canAttack && this.target.isAlive() && this.isTargetInRange()) { - this.attack(this.target); + if (this.verifyTarget() && this.target.isAlive() && this.isTargetInRange()) { + if (this.canAttack) + this.attack(this.target); return true; } return false; @@ -103,7 +116,6 @@ class Robot { } return true; } - return false; } @@ -148,12 +160,15 @@ class Robot { isTargetInRange() { if (this.verifyTarget()) { - let hypot = Math.hypot(this.target.x - this.x, this.target.y - this.y); - return hypot < this.range; + return this.calcDistance(this.target) < this.range; } return false; } + calcDistance(robot) { + return Math.hypot(robot.x - this.x, robot.y - this.y); + } + isAlive() { return this.life.value > 0; } @@ -171,4 +186,16 @@ class Robot { haveTarget() { return this.target != null; } + + read() { + for (let i = 0; i < this.lNode.length; i++) { + if (this.lNode[i].do(this)) { + break; + } + } + } + + addNode(node) { + this.lNode.push(node); + } }