updateLayer method

Future<void> updateLayer(
  1. DFCamera camera
)

更细地图瓦片

Implementation

Future<void> updateLayer(DFCamera camera) async {
  if (this.tileMap == null) return;

  /// 上一下刷新时摄像机的位置
  if (this.cameraPosition != null) {
    if ((this.cameraPosition!.x - camera.sprite!.position.x).abs() < this.tileMap!.tileWidth! * 5 * scale &&
        (this.cameraPosition!.y - camera.sprite!.position.y).abs() < this.tileMap!.tileHeight! * 5 * scale) {
      return;
    }
  }

  /// 保存上一下刷新时摄像机的位置
  this.cameraPosition = DFPosition(camera.sprite!.position.x, camera.sprite!.position.y);
  double drawX = camera.sprite!.position.x - camera.rect.width;
  double drawY = camera.sprite!.position.y - camera.rect.height;

  /// 可视区域
  DFRect visibleRect = DFRect(drawX, drawY, camera.rect.width * 2,
      camera.rect.height * 2);

  /// print("visibleRect:" + visibleRect.toString());

  /// 将全部的瓦片设置为不可见
  sprites.forEach((element) {
    element.visible = false;
  });

  /// 遍历图层瓦片
  if (mapLayer != null) {
    DFTileSet? tileSet;
    double tileWidth = 0;
    double tileHeight = 0;
    int columnCount = 0;
    await Future.forEach<int>(mapLayer!.data ?? [], (tile) async {
      if (tile != 0) {
        if (tileSet == null) {
          tileSet = tileMap!.tileSets!.lastWhere((element) {
            return element.firsTgId != null && tile >= element.firsTgId!;
          });
          columnCount = (tileMap!.width! * tileMap!.tileWidth!) ~/ tileSet!.tileWidth!.toDouble();
          tileWidth = tileSet!.tileWidth!.toDouble() * this.scale;
          tileHeight = tileSet!.tileHeight!.toDouble() * this.scale;
        }
        if (tileSet != null) {
          int tileIndex = tile - tileSet!.firsTgId!;
          int row = _getY(tileIndex, columnCount).toInt();
          int column = _getX(tileIndex, columnCount).toInt();

          /// print("row:" + row.toString() + ",column:" + column.toString() + ",scale:" + this.scale.toString());
          Rect tileRect = Rect.fromLTWH(column * tileWidth, row * tileHeight, tileWidth, tileHeight);

          /// print("tileRect:" + tileRect.toString());
          /// 在可视区域的瓦片设置为显示
          if (visibleRect.toRect().overlaps(tileRect)) {
            DFImageSprite? imageSprite = existImageSprite(row, column);
            if (imageSprite == null) {
              imageSprite = await getTileImageSprite(tileSet!, tileIndex, row, column, this.scale);
              sprites.add(imageSprite);
            } else {
              imageSprite.visible = true;
            }
          }
        }
      }
    });
  }

  /// 删除不可见的精灵
  sprites.removeWhere((element) => !element.visible);
}