Skip to main content

On Sale: GamesAssetsToolsTabletopComics
Indie game storeFree gamesFun gamesHorror games
Game developmentAssetsComics
SalesBundles
Jobs
TagsGame Engines
0
Members

Remove Behavior ?

A topic by Kant01 created Feb 11, 2016 Views: 442 Replies: 3
Viewing posts 1 to 4
(1 edit)

Bonjour à tous !

Je voudrait tout d'abord remercier toute l'équipe pour ce projet superpowers, je m'éclate tous les jours à aller un peu plus loin dans le petit jeu que je suis en train de faire. Ainsi que tous ceux qui nous font des super tutos pour mieux appréhender et utiliser le soft et tous ceux qui nous aide dans nos galères :) !

Je fait un petit jeu 2D où je place mes acteurs sur la map, je leur ajoute un behavior de type button pour savoir lorsque je clique dessus (merci aux tutos vidéos). Quand on clique sur un acteur je lui ajoute le behavior de déplacement. Mais j'aimerai supprimer ce behavior des autres acteurs pour ne pas tous les déplacer en même temps.

Donc existe t-il un remove ou destroy pour faire un actor.removeBehavior(BoatMovementBehavior); (je n'ai pas réussi à trouver) ?
Sinon quel système je pourrais utiliser ?

Merci pour votre aide et bonne journée,

(1 edit)

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);



Moderator

Tu peux supprimer un behavior en faisant :

Sup.getActor("Un acteur").getBehavior(UnBehavior).destroy();

PS: Je suis un ours.

Merci bilou pour ta réponse.
Un peu comme je fait là ? Ou est-il nécessaire d'utiliser getActor ?
class Boat :: stopMove ()
this.actor.getBehavior(BoatMovementBehavior).destroy();
Bonne soirée