diff --git a/packages/flame_kenney_xml/pubspec.yaml b/packages/flame_kenney_xml/pubspec.yaml index b4a523c26b2..c553ec5963d 100644 --- a/packages/flame_kenney_xml/pubspec.yaml +++ b/packages/flame_kenney_xml/pubspec.yaml @@ -21,7 +21,7 @@ dependencies: flame: ^1.38.0 flutter: sdk: flutter - xml: ^6.5.0 + xml: ">=6.5.0 <8.0.0" dev_dependencies: build_runner: ^2.4.11 diff --git a/packages/flame_tiled/lib/src/flame_tsx_provider.dart b/packages/flame_tiled/lib/src/flame_tsx_provider.dart index a84571ec255..012b3bb631f 100644 --- a/packages/flame_tiled/lib/src/flame_tsx_provider.dart +++ b/packages/flame_tiled/lib/src/flame_tsx_provider.dart @@ -1,36 +1,34 @@ import 'package:flame/flame.dart'; import 'package:flutter/services.dart'; import 'package:tiled/tiled.dart'; -import 'package:xml/xml.dart'; -/// A implementation of [TsxProvider] use by RenderableTileMap. +/// A [ParserProvider] for a single external tileset file loaded from +/// [Flame.bundle] or a custom asset bundle. /// -/// It uses [Flame.bundle] or a custom asset bundle -/// and has a built-in cache for the file read. -class FlameTsxProvider implements TsxProvider { +/// `RenderableTiledMap` resolves external tilesets on its own, this is only +/// needed when parsing a map manually, for example through +/// [TiledMap.parseTmx]. +class FlameTsxProvider implements ParserProvider { /// Parsed data for this tsx file. final String data; /// Stored filename for corresponding tsx file. - final String _filename; + final String filename; - FlameTsxProvider._(this.data, this._filename); + FlameTsxProvider._(this.data, this.filename); @override - String get filename => _filename; + bool canProvide(String path) => path == filename; @override - Parser getSource(String key) { - final node = XmlDocument.parse(data).rootElement; - return XmlParser(node); - } + Parser getSource(String path) => Parser.fromString(data); - @override + /// Parsed tileset source, or `null` when [data] is empty. Parser? getCachedSource() { if (data.isEmpty) { return null; } - return getSource(''); + return getSource(filename); } /// Parses a file returning a [FlameTsxProvider]. diff --git a/packages/flame_tiled/lib/src/renderable_tile_map.dart b/packages/flame_tiled/lib/src/renderable_tile_map.dart index d0a21e77e93..453d519e8b7 100644 --- a/packages/flame_tiled/lib/src/renderable_tile_map.dart +++ b/packages/flame_tiled/lib/src/renderable_tile_map.dart @@ -7,7 +7,6 @@ import 'package:flame/extensions.dart'; import 'package:flame/flame.dart'; import 'package:flame/rendering.dart'; import 'package:flame_tiled/src/extensions.dart'; -import 'package:flame_tiled/src/flame_tsx_provider.dart'; import 'package:flame_tiled/src/renderable_layers/group_layer.dart'; import 'package:flame_tiled/src/renderable_layers/renderable_layer.dart'; import 'package:flame_tiled/src/renderable_layers/tile_layers/tile_layer.dart'; @@ -252,8 +251,9 @@ class RenderableTiledMap { /// /// {@template renderable_tile_map_path} /// The [fileName] is the full path of the map, as declared in the - /// `pubspec.yaml`, for example `assets/tiles/map.tmx`. Any external `.tsx` - /// tileset the map references is resolved relative to that path. + /// `pubspec.yaml`, for example `assets/tiles/map.tmx`. External tilesets + /// (`.tsx`) and object templates (`.tx`) that the map references are + /// resolved relative to that path. /// {@endtemplate} /// /// {@template tiled_images_directory} @@ -306,8 +306,8 @@ class RenderableTiledMap { /// Parses a string returning a [RenderableTiledMap]. /// - /// External `.tsx` tilesets the map references are resolved against - /// [tsxDirectory]. + /// External tilesets (`.tsx`) and object templates (`.tx`) that the map + /// references are resolved against [tsxDirectory]. /// /// {@macro tiled_images_directory} /// @@ -330,9 +330,12 @@ class RenderableTiledMap { double atlasPackingSpacingY = 0, String? package, }) async { + // tiled calls this once for every external file the map references, + // including files referenced from other external files, always with a + // path relative to the map. final map = await TiledMap.fromString( contents, - (key) => FlameTsxProvider.parse(key, bundle, tsxDirectory), + (path) => (bundle ?? Flame.bundle).loadString('$tsxDirectory$path'), ); return fromTiledMap( map, diff --git a/packages/flame_tiled/pubspec.yaml b/packages/flame_tiled/pubspec.yaml index 2f25e110756..ae9b0f906b4 100644 --- a/packages/flame_tiled/pubspec.yaml +++ b/packages/flame_tiled/pubspec.yaml @@ -22,8 +22,7 @@ dependencies: flutter: sdk: flutter meta: ^1.12.0 - tiled: ^0.11.0 - xml: ^6.3.0 + tiled: ^0.12.0 dev_dependencies: dartdoc: ^9.0.0