diff --git a/doc/other_modules/tiled.md b/doc/other_modules/tiled.md index 0ab79d33d2..f21180b280 100644 --- a/doc/other_modules/tiled.md +++ b/doc/other_modules/tiled.md @@ -9,6 +9,17 @@ the tiles, objects and everything in there. Flame also provides a simple `Tiled` class and its component wrapper `TiledComponent`, for the map rendering, which renders the tiles on the screen and supports rotations and flips. +At its simplest, layers can be retrieved from a Tilemap by invoking: + +``` +getLayer("myObjectGroupLayer"); +getLayer("myImageLayer"); +getLayer("myTileLayer"); +getLayer("myGroupLayer"); +``` + +These methods will either return the requested layer type or null if it does not exist. + Other advanced features are not yet supported, but you can easily read the objects and other features of the tmx and add custom behaviour (eg regions for triggers and walking areas, custom animated objects). diff --git a/packages/flame_tiled/example/lib/main.dart b/packages/flame_tiled/example/lib/main.dart index d5b588b9e5..4c7ab11943 100644 --- a/packages/flame_tiled/example/lib/main.dart +++ b/packages/flame_tiled/example/lib/main.dart @@ -3,6 +3,7 @@ import 'package:flame/flame.dart'; import 'package:flame/game.dart'; import 'package:flame_tiled/flame_tiled.dart'; import 'package:flutter/widgets.dart' hide Animation, Image; +import 'package:tiled/tiled.dart'; void main() { runApp(GameWidget(game: TiledGame())); @@ -15,9 +16,12 @@ class TiledGame extends FlameGame { final tiledMap = await TiledComponent.load('map.tmx', Vector2.all(16)); add(tiledMap); - final objGroup = tiledMap.tileMap.getObjectGroupFromLayer('AnimatedCoins'); + final objGroup = tiledMap.tileMap.getLayer('AnimatedCoins'); final coins = await Flame.images.load('coins.png'); - for (final obj in objGroup.objects) { + + // We are 100% sure that an object layer named `AnimatedCoins` + // exists in the example `map.tmx`. + for (final obj in objGroup!.objects) { add( SpriteAnimationComponent( position: Vector2(obj.x, obj.y), diff --git a/packages/flame_tiled/lib/src/renderable_tile_map.dart b/packages/flame_tiled/lib/src/renderable_tile_map.dart index 744de864b0..63f86d3a24 100644 --- a/packages/flame_tiled/lib/src/renderable_tile_map.dart +++ b/packages/flame_tiled/lib/src/renderable_tile_map.dart @@ -202,10 +202,18 @@ class RenderableTiledMap { /// This returns an object group fetch by name from a given layer. /// Use this to add custom behaviour to special objects and groups. + @Deprecated('This method is deprecated. Use the getLayer() method instead.') ObjectGroup getObjectGroupFromLayer(String name) { final g = map.layers.firstWhere((layer) { return layer is ObjectGroup && layer.name == name; }); return g as ObjectGroup; } + + /// Returns a layer of type [T] with given [name] from all the layers + /// of this map. If no such layer is found, null is returned. + T? getLayer(String name) { + return map.layers + .firstWhereOrNull((layer) => layer is T && layer.name == name) as T?; + } } diff --git a/packages/flame_tiled/test/assets/layers_test.tmx b/packages/flame_tiled/test/assets/layers_test.tmx new file mode 100644 index 0000000000..e917d3fe7a --- /dev/null +++ b/packages/flame_tiled/test/assets/layers_test.tmx @@ -0,0 +1,18 @@ + + + + + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + + + + + Just a dummy map for + testing layers + + + + + + + diff --git a/packages/flame_tiled/test/tiled_test.dart b/packages/flame_tiled/test/tiled_test.dart index 6631f7daad..7a98a3551f 100644 --- a/packages/flame_tiled/test/tiled_test.dart +++ b/packages/flame_tiled/test/tiled_test.dart @@ -8,6 +8,7 @@ import 'package:flame/flame.dart'; import 'package:flame_tiled/flame_tiled.dart'; import 'package:flutter/services.dart' show CachingAssetBundle; import 'package:test/test.dart'; +import 'package:tiled/tiled.dart'; void main() { test('correct loads the file', () async { @@ -123,6 +124,53 @@ void main() { expect(allGreen, true); }); }); + + group('Test getLayer:', () { + late RenderableTiledMap _renderableTiledMap; + setUp(() async { + Flame.bundle = TestAssetBundle( + imageNames: ['map-level1.png'], + mapPath: 'test/assets/layers_test.tmx', + ); + _renderableTiledMap = + await RenderableTiledMap.fromFile('layers_test.tmx', Vector2.all(32)); + }); + + test('Get Tile Layer', () { + expect( + _renderableTiledMap.getLayer('MyTileLayer'), + isNotNull, + ); + }); + + test('Get Object Layer', () { + expect( + _renderableTiledMap.getLayer('MyObjectLayer'), + isNotNull, + ); + }); + + test('Get Image Layer', () { + expect( + _renderableTiledMap.getLayer('MyImageLayer'), + isNotNull, + ); + }); + + test('Get Group Layer', () { + expect( + _renderableTiledMap.getLayer('MyGroupLayer'), + isNotNull, + ); + }); + + test('Get no layer', () { + expect( + _renderableTiledMap.getLayer('Nonexistent layer'), + isNull, + ); + }); + }); } class TestAssetBundle extends CachingAssetBundle {