Render_PiezaGrafico.js

/**
 * Clase que gestiona la representación gráfica de las piezas en el tablero.
 * @class PiezaGrafico
 * @memberof Render
 */
class PiezaGrafico {

  /**
   * Constructor de PiezaGrafico.
   * @param {Phaser.Scene} escena - la escena de Phaser donde se crearán los sprites
   * @param {Tablero} tablero - referencia a la lógica del tablero
   * @param {number} [tamCasilla=64] - tamaño en píxeles de cada casilla
   */
  constructor(escena, tablero, tamCasilla = 64) {
    this.escena = escena;
    this.tablero = tablero;
    this.tamCasilla = tamCasilla;
    this.sprites = new Map(); // estructura tipo array (parecida a un diccionario)
  }

  /**
   * Dibuja un sprite para la pieza especificada y lo asocia en el mapa interno.
   * @param {Pieza} pieza - instancia de la pieza a dibujar
   */
  dibujarPieza(pieza, data) {
    const x = pieza.col * this.tamCasilla + this.tamCasilla / 2;
    const y = pieza.fil * this.tamCasilla + this.tamCasilla / 2;

    let sprite = null;
    if(pieza.getTipo() == 'Soldado'){
      if (pieza.getJugador() == "J1") sprite = this.escena.add.image(x, y, 'peon');
      else sprite = this.escena.add.image(x, y, 'peon2');
    }
    else if (pieza.getTipo() == 'Caballeria'){
        if (pieza.getJugador() == "J1") sprite = this.escena.add.image(x, y, 'caballeria');
        else sprite = this.escena.add.image(x, y, 'caballeria2');
    }
    else if (pieza.getTipo() == 'Comandante'){
        if (pieza.getJugador() == "J1") sprite = this.escena.add.image(x, y, 'comandante');
        else sprite = this.escena.add.image(x, y, 'comandante2');
    }
    else if (pieza.getTipo() == 'Artilleria'){
        if (pieza.getJugador() == "J1") sprite = this.escena.add.image(x, y, 'artilleria');
        else sprite = this.escena.add.image(x, y, 'artilleria2');
    }
    sprite.setDisplaySize(this.tamCasilla, this.tamCasilla);
    console.log(data);
    sprite.setAlpha(data ? data.alpha : 1); // Restaurar la transparencia si se proporciona data
    this.sprites.set(pieza, sprite);
  }

  /**
   * Elimina el sprite asociado a la pieza y limpia la referencia interna.
   * @param {Pieza} pieza - pieza cuyo sprite se desea eliminar
   * @returns {Object} datos de la imagen eliminada
   */
  eliminarPieza(pieza) {
    // Buscar el sprite asociado
    const sprite = this.sprites.get(pieza);
    // Si existe, eliminarlo del juego y del mapa
    if (sprite) {
      let imageData = sprite;
      sprite.destroy(); // Esto elimina el sprite de la escena de Phaser
      this.sprites.delete(pieza); // Y lo quitamos del Map
      return imageData;
    } else {
      console.warn("Intento de eliminar pieza que no tiene sprite asociado:", pieza);
    }
  }
  
  /**
   * Devuelve el mapa de sprites asociados a las piezas.
   * @returns {Map} mapa de piezas a sprites
   */
  getMapSprites() {
    return this.sprites;
  }
}

export default PiezaGrafico;