J'arrive à stopper le déplacement des autres acteurs en ajoutant un booléen dans le BoatMovementBehavior : 'rightMove'
Si je clique sur un acteur j'active bien la possibilité de le déplacer et je désactive la possibilité de déplacer le précédent, ça fonctionne donc plutôt bien de ce côté là.
Le problème c'est que si je clic sur un acteur alors que le précédent est toujours en déplacement (en restant appuyer sur une touche du clavier), le déplacement de l'acteur précédent ne s'arrête pas. Il garde la direction dans laquelle il était au moment de la sélection de l'autre acteur et ne fait même plus cas des collisions. Comme vous le voyez j'ai essayer plusieurs choses : booléen, overide de la méthode de mouvement, redéfinition de la variable speed, destroy du behavior mais rien y fait.
Si quelqu'un à une idée ? Merci
Ci dessous mon objet Boat qui implémente le comportement BoatMovementBehavior.
Tout en bas une copie écran pour visualiser le comportement des acteurs.
class Boat { public actor : Sup.Actor; public sprite : Sup.SpriteRenderer; public ab2b : Sup.ArcadePhysics2D.Body; constructor(objActor: any, objSprite: any, objAb2d: any) { .. } ... public startMove () : void { this.actor.addBehavior(BoatMovementBehavior); this.actor.getBehavior(BoatMovementBehavior).startMove(); } public stopMove () : void { // this.actor.getBehavior(BoatMovementBehavior).stopMove(); this.actor.getBehavior(BoatMovementBehavior).destroy(); Sup.log("destroy?:", this.actor.getBehavior(BoatMovementBehavior).isDestroyed()); } .... }
class BoatMovementBehavior extends Sup.Behavior { public speed :number = 0; public last_key :string = "down"; public rightMove :boolean = false; inputMove = function () {}; stopMove() { this.speed = 0; this.rightMove = false; this.inputMove = function () {}; } startMove() { this.speed = 0.05; this.rightMove = true; this.inputMove = function () { if(this.rightMove){ let x = 0, y = 0, key = this.last_key; if (Sup.Input.isKeyDown("LEFT")) { x = -this.speed; key = "left"; } if (Sup.Input.isKeyDown("RIGHT")) { x = this.speed; key = "right"; } if (Sup.Input.isKeyDown("UP")) { y = this.speed; key = "up"; } if (Sup.Input.isKeyDown("DOWN")) { y = -this.speed; key = "down"; } if (Sup.Input.isKeyDown("UP") && Sup.Input.isKeyDown("RIGHT")) { x = this.speed; y = this.speed; key = "up_right"; } if (Sup.Input.isKeyDown("DOWN") && Sup.Input.isKeyDown("RIGHT")) { key = "down_right"; } if (Sup.Input.isKeyDown("UP") && Sup.Input.isKeyDown("LEFT")) { key = "up_left"; } if (Sup.Input.isKeyDown("DOWN") && Sup.Input.isKeyDown("LEFT")) { key = "down_left"; } this.move(x, y, key); } } } update() { this.inputMove(); } getCollisions(x, y){ if(this.rightMove){ Sup.ArcadePhysics2D.collides(this.actor.arcadeBody2D, Sup.ArcadePhysics2D.getAllBodies()); this.actor.arcadeBody2D.setVelocity(new Sup.Math.Vector2(x, y)); } } move(x, y, key){ if(key.indexOf("left")>1) { key.replace("left","right"); // this.actor.spriteRenderer.setHorizontalFlip(true); } else{ // this.actor.spriteRenderer.setHorizontalFlip(false); } this.last_key = key; if(x !== 0 || y !== 0){ // this.actor.spriteRenderer.setAnimation(key); this.getCollisions(x, y); } else { // this.actor.spriteRenderer.setAnimation(key); this.getCollisions(0, 0); } } } Sup.registerBehavior(BoatMovementBehavior);