mirror of
https://github.com/flame-engine/flame.git
synced 2025-11-01 10:38:17 +08:00
83 lines
2.0 KiB
Dart
83 lines
2.0 KiB
Dart
import 'dart:async';
|
|
import 'dart:ui';
|
|
|
|
import 'package:flame/components/component.dart';
|
|
import 'package:flame/flame.dart';
|
|
import 'package:flutter/material.dart' show Colors;
|
|
import 'package:tiled/tiled.dart' hide Image;
|
|
|
|
class TiledComponent extends Component {
|
|
String filename;
|
|
TileMap map;
|
|
Image image;
|
|
Map<String, Image> images = Map<String, Image>();
|
|
Future future;
|
|
bool _loaded = false;
|
|
|
|
static Paint paint = Paint()..color = Colors.white;
|
|
|
|
TiledComponent(this.filename) {
|
|
this.future = _load();
|
|
}
|
|
|
|
Future _load() async {
|
|
this.map = await _loadMap();
|
|
this.image = await Flame.images.load(map.tilesets[0].image.source);
|
|
this.images = await _loadImages(map);
|
|
this._loaded = true;
|
|
}
|
|
|
|
Future<TileMap> _loadMap() {
|
|
return Flame.bundle.loadString('assets/tiles/' + filename).then((contents) {
|
|
var parser = TileMapParser();
|
|
return parser.parse(contents);
|
|
});
|
|
}
|
|
|
|
Future<Map<String, Image>> _loadImages(TileMap map) async {
|
|
Map<String, Image> result = {};
|
|
await Future.forEach(map.tilesets, (tileset) async {
|
|
await Future.forEach(tileset.images, (tmxImage) async {
|
|
result[tmxImage.source] = await Flame.images.load(tmxImage.source);
|
|
});
|
|
});
|
|
return result;
|
|
}
|
|
|
|
bool loaded() => _loaded;
|
|
|
|
@override
|
|
void render(Canvas c) {
|
|
if (!loaded()) {
|
|
return;
|
|
}
|
|
|
|
map.layers.forEach((layer) {
|
|
if (layer.visible) {
|
|
_renderLayer(c, layer);
|
|
}
|
|
});
|
|
}
|
|
|
|
void _renderLayer(Canvas c, Layer layer) {
|
|
layer.tiles.forEach((tile) {
|
|
if (tile.gid == 0) {
|
|
return;
|
|
}
|
|
|
|
var image = images[tile.image.source];
|
|
|
|
var rect = tile.computeDrawRect();
|
|
var src = Rect.fromLTWH(rect.left.toDouble(), rect.top.toDouble(),
|
|
rect.width.toDouble(), rect.height.toDouble());
|
|
var dst = Rect.fromLTWH(tile.x.toDouble(), tile.y.toDouble(),
|
|
rect.width.toDouble(), rect.height.toDouble());
|
|
|
|
c.drawImageRect(image, src, dst, paint);
|
|
});
|
|
}
|
|
|
|
@override
|
|
void update(double t) {}
|
|
}
|