Guest User

Untitled

a guest
May 3rd, 2020
69
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. class Attack {
  2.  
  3.   constructor(data) {
  4.  
  5.     // si aucun argument n'est passé, data sera indéfiné, donc si on fait data['quelque_chose'] le script renverra une erreur,
  6.     // pour empêcher cette erreur, on remplace data par {} donc le cas où data n'est pas défini
  7.     data = data || {};
  8.  
  9.     // data.spriteSheets est un tableau qui contient le nom des assets
  10.     this.spriteSheetsData = data.spriteSheets || [];
  11.  
  12.     // on organise ça dans un objet pour faciliter l'accès
  13.     this.spriteSheets = {};
  14.     for (var i = 0; i < this.spriteSheetsData.length; i++) {
  15.       this.spriteSheets[this.spriteSheetsData[i]] = null;
  16.     }
  17.  
  18.     // les dégats de l'attaque
  19.     this.damage = typeof data.damage !== 'undefined' ? data.damage : 4;
  20.  
  21.     // tous les "events"
  22.     this.oncreate = typeof data.oncreate === 'function' ? data.oncreate : function(){};
  23.     this.onstart = typeof data.onstart === 'function' ? data.onstart.bind({parent:this,caller:'onstart'}) : function(){};
  24.     this.onend = typeof data.onend === 'function' ? data.onend.bind({parent:this,caller:'onend'}) : function(){};
  25.     this.ondraw = typeof data.ondraw === 'function' ? data.ondraw.bind({parent:this,caller:'ondraw'}) : function(){};
  26.     this.onupdate = typeof data.onupdate === 'function' ? data.onupdate : function(){};
  27.  
  28.     // l'état local de l'attaque
  29.     this.state = 'onstart';
  30.  
  31.     // on stocke les données temporaires de l'état ici
  32.     this.stateData = {};
  33.  
  34.     // on propose à l'utilisateur de mettre ces variables dedans (ce qui est conseillé pour éviter de réécrire des variables existantes)
  35.     this.data = {};
  36.  
  37.   }
  38.  
  39.   /**
  40.   * reset: permet de reset l'attaque
  41.   */
  42.   reset() {
  43.     this.state = 'onstart'; // on revient à l'état initiale de l'attaque
  44.     this.stateData = {};
  45.     this.oncreate();
  46.   }
  47.  
  48.   /**
  49.   * init: permet d'initialiser l'attaque
  50.   * @param game {Game} : un instancier de la classe Game
  51.   */
  52.   init(game) {
  53.  
  54.     // on stocke les variables dont on aura besoin
  55.     this.game = game;
  56.     this.assetManager = this.game.assetManager;
  57.     this.area = this.game.area;
  58.     this.player = this.game.player;
  59.  
  60.     // on "reset" l'attaque
  61.     this.oncreate();
  62.  
  63.   }
  64.  
  65.   /**
  66.   * run: permet de faire "tourner l'attaque", cette fonction est exécuté à 60FPS
  67.   */
  68.   run() {
  69.  
  70.     // on récupère le scope actuel, le "this" correspond à notre objet attaque (construit avec new Attack())
  71.     var _this = this;
  72.  
  73.     // on ecécute la fonction "onstart", "ondraw", ou "onend" (à 60FPS)
  74.     this[this.state](function(__this){
  75.  
  76.       // ici le "__this", correspond au scope lorsque qu'on ".bind" les 3 fonctions,
  77.       // donc le "__this" contient ceci : {parent:_this,caller:...} (le "_this" est le même que celui juste au-dessus)
  78.       // ainsi, comme leur variable "caller" porte leur nom, on est en mesure de savoir quelle fonction est appelée
  79.  
  80.       // l'objectif ici, c'est de faire en sorte que cette fonction ne soit appelé seulement une fois
  81.       // (je rappele qu'on est dans une fonction qui est exécuté une centaine de fois par seconde)
  82.  
  83.       // si "_this.stateData[__this.caller]" est défini, c'est que la fonction a déjà été appelé à l'état "__this.caller"
  84.       if (typeof _this.stateData[__this.caller] !== 'undefined') return;
  85.  
  86.       // si on arrive là, c'est la fonction next n'a jamais été appelé à cet état de l'attaque, donc on fais en sorte,
  87.       // que ce soit le 1er appelle mais aussi surtout le dernier appelle
  88.       _this.stateData[__this.caller] = true;
  89.  
  90.       // on passe à la fonction suivante
  91.       if (_this.state == 'onstart') {
  92.         _this.state = 'ondraw';
  93.       } else if (_this.state == 'ondraw') {
  94.         _this.state = 'onend';
  95.       } else if (_this.state == 'onend') {
  96.         _this.reset(); // reset attack
  97.       }
  98.  
  99.     });
  100.   }
  101.  
  102.   draw() {
  103.     if (typeof this.ondraw === 'function') this.ondraw();
  104.   }
  105.  
  106.   update() {
  107.     if (typeof this.onupdate === 'function') this.onupdate();
  108.   }
  109.  
  110. }
Add Comment
Please, Sign In to add comment