updateLayer method
更细地图瓦片
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);
}