From 8fc8bbbb499fcdb017368a12af1ea1e40891d908 Mon Sep 17 00:00:00 2001 From: Chip Bradford Date: Mon, 31 Jul 2023 21:52:40 -0700 Subject: [PATCH 1/2] fixes 2633 Compute isometric tile scale based on the map's tile size rather than the tile image's default size. This fixes an issue where scale was incorrect when those two sizes differed. --- .../src/renderable_layers/tile_layers/isometric_tile_layer.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/flame_tiled/lib/src/renderable_layers/tile_layers/isometric_tile_layer.dart b/packages/flame_tiled/lib/src/renderable_layers/tile_layers/isometric_tile_layer.dart index d562572e47a..e6d14f96ec9 100644 --- a/packages/flame_tiled/lib/src/renderable_layers/tile_layers/isometric_tile_layer.dart +++ b/packages/flame_tiled/lib/src/renderable_layers/tile_layers/isometric_tile_layer.dart @@ -60,7 +60,7 @@ class IsometricTileLayer extends FlameTileLayer { .translate(spriteOffset.dx, spriteOffset.dy), ); final flips = SimpleFlips.fromFlips(tileGid.flips); - final scale = size.x / src.width; + final scale = size.x / map.tileWidth; final anchorX = src.width - halfMapTile.x; final anchorY = src.height - halfMapTile.y; From 8b4f07c33ce6c13edba0da77e7165577ac50136b Mon Sep 17 00:00:00 2001 From: Chip Bradford Date: Fri, 4 Aug 2023 10:45:30 -0700 Subject: [PATCH 2/2] fixed oversized tile handling in other map types and added test --- .../tile_layers/hexagonal_tile_layer.dart | 2 +- .../tile_layers/orthogonal_tile_layer.dart | 2 +- .../tile_layers/staggered_tile_layer.dart | 2 +- .../test/assets/oversized_tiles_hexagonal.tmx | 11 ++++++ .../test/assets/oversized_tiles_isometric.tmx | 11 ++++++ .../assets/oversized_tiles_orthogonal.tmx | 11 ++++++ .../test/assets/oversized_tiles_staggered.tmx | 11 ++++++ .../goldens/oversized_tiles_hexagonal.png | Bin 0 -> 1756 bytes .../goldens/oversized_tiles_isometric.png | Bin 0 -> 1680 bytes .../goldens/oversized_tiles_orthogonal.png | Bin 0 -> 1537 bytes .../goldens/oversized_tiles_staggered.png | Bin 0 -> 1271 bytes packages/flame_tiled/test/tiled_test.dart | 35 ++++++++++++++++++ 12 files changed, 82 insertions(+), 3 deletions(-) create mode 100644 packages/flame_tiled/test/assets/oversized_tiles_hexagonal.tmx create mode 100644 packages/flame_tiled/test/assets/oversized_tiles_isometric.tmx create mode 100644 packages/flame_tiled/test/assets/oversized_tiles_orthogonal.tmx create mode 100644 packages/flame_tiled/test/assets/oversized_tiles_staggered.tmx create mode 100644 packages/flame_tiled/test/goldens/oversized_tiles_hexagonal.png create mode 100644 packages/flame_tiled/test/goldens/oversized_tiles_isometric.png create mode 100644 packages/flame_tiled/test/goldens/oversized_tiles_orthogonal.png create mode 100644 packages/flame_tiled/test/goldens/oversized_tiles_staggered.png diff --git a/packages/flame_tiled/lib/src/renderable_layers/tile_layers/hexagonal_tile_layer.dart b/packages/flame_tiled/lib/src/renderable_layers/tile_layers/hexagonal_tile_layer.dart index bc5b56ccef7..74e1b567dba 100644 --- a/packages/flame_tiled/lib/src/renderable_layers/tile_layers/hexagonal_tile_layer.dart +++ b/packages/flame_tiled/lib/src/renderable_layers/tile_layers/hexagonal_tile_layer.dart @@ -95,7 +95,7 @@ class HexagonalTileLayer extends FlameTileLayer { } final flips = SimpleFlips.fromFlips(tileGid.flips); - final scale = size.x / src.width; + final scale = size.x / map.tileWidth; final anchorX = src.width - halfMapTile.x; final anchorY = src.height - halfMapTile.y; diff --git a/packages/flame_tiled/lib/src/renderable_layers/tile_layers/orthogonal_tile_layer.dart b/packages/flame_tiled/lib/src/renderable_layers/tile_layers/orthogonal_tile_layer.dart index cfb9166e4f2..4d8440ada55 100644 --- a/packages/flame_tiled/lib/src/renderable_layers/tile_layers/orthogonal_tile_layer.dart +++ b/packages/flame_tiled/lib/src/renderable_layers/tile_layers/orthogonal_tile_layer.dart @@ -59,7 +59,7 @@ class OrthogonalTileLayer extends FlameTileLayer { ); final flips = SimpleFlips.fromFlips(tileGid.flips); - final scale = size.x / src.width; + final scale = size.x / map.tileWidth; final anchorX = src.width - halfMapTile.x; final anchorY = src.height - halfMapTile.y; diff --git a/packages/flame_tiled/lib/src/renderable_layers/tile_layers/staggered_tile_layer.dart b/packages/flame_tiled/lib/src/renderable_layers/tile_layers/staggered_tile_layer.dart index 3d156b9a026..3884159d44d 100644 --- a/packages/flame_tiled/lib/src/renderable_layers/tile_layers/staggered_tile_layer.dart +++ b/packages/flame_tiled/lib/src/renderable_layers/tile_layers/staggered_tile_layer.dart @@ -95,7 +95,7 @@ class StaggeredTileLayer extends FlameTileLayer { } final flips = SimpleFlips.fromFlips(tileGid.flips); - final scale = size.x / src.width; + final scale = size.x / map.tileWidth; final anchorX = src.width - halfMapTile.x; final anchorY = src.height - halfMapTile.y; diff --git a/packages/flame_tiled/test/assets/oversized_tiles_hexagonal.tmx b/packages/flame_tiled/test/assets/oversized_tiles_hexagonal.tmx new file mode 100644 index 00000000000..822626bacf4 --- /dev/null +++ b/packages/flame_tiled/test/assets/oversized_tiles_hexagonal.tmx @@ -0,0 +1,11 @@ + + + + + + + + eJxjYEAFrlA6lQE7KIbSJUC8AIgBKkgCMg== + + + diff --git a/packages/flame_tiled/test/assets/oversized_tiles_isometric.tmx b/packages/flame_tiled/test/assets/oversized_tiles_isometric.tmx new file mode 100644 index 00000000000..70c10f1a1a2 --- /dev/null +++ b/packages/flame_tiled/test/assets/oversized_tiles_isometric.tmx @@ -0,0 +1,11 @@ + + + + + + + + eJxjYMAOiqB0EpQOhtKFaOoALSgBmQ== + + + diff --git a/packages/flame_tiled/test/assets/oversized_tiles_orthogonal.tmx b/packages/flame_tiled/test/assets/oversized_tiles_orthogonal.tmx new file mode 100644 index 00000000000..3b534d918ea --- /dev/null +++ b/packages/flame_tiled/test/assets/oversized_tiles_orthogonal.tmx @@ -0,0 +1,11 @@ + + + + + + + + eJxjYEAFxVC6hAE7KITSRVAaADKQAcs= + + + diff --git a/packages/flame_tiled/test/assets/oversized_tiles_staggered.tmx b/packages/flame_tiled/test/assets/oversized_tiles_staggered.tmx new file mode 100644 index 00000000000..61f7ba48e31 --- /dev/null +++ b/packages/flame_tiled/test/assets/oversized_tiles_staggered.tmx @@ -0,0 +1,11 @@ + + + + + + + + eJxjYMANDgBxEppYMZQuAeI+IAYANIgCmA== + + + diff --git a/packages/flame_tiled/test/goldens/oversized_tiles_hexagonal.png b/packages/flame_tiled/test/goldens/oversized_tiles_hexagonal.png new file mode 100644 index 0000000000000000000000000000000000000000..99159395c23db50554b615c95cae8ead142787ed GIT binary patch literal 1756 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 literal 0 HcmV?d00001 diff --git a/packages/flame_tiled/test/goldens/oversized_tiles_staggered.png b/packages/flame_tiled/test/goldens/oversized_tiles_staggered.png new file mode 100644 index 0000000000000000000000000000000000000000..b4ebd30f8fc382a0f7d0d41a042c353bde9385af GIT binary patch literal 1271 zcmVPx#1am@3R0s$N2z&@+hyVZtp-DtRRA_;)VN#M z@_NY|?k`;B+PA|-$xcrZs?P;Kz`=nzhgF>)FPzcPZ z9n)uf`TB$7`7)5bHYKN7_u%NJ2A`Q6llO~f1B^_hux)!={3&G+mSwqzKmIAOlS)o& zvJLQ(($mon!1VQuEJv*i2(oVdIS*_fk~|r7f8lDuZ`@CgAVz)B`P=sb%Tem$IpVo9 zlVg%3%d*@`ljO;us>T-!I-Gg?Wkx1a%uJ5aJvi#gmga_f0CLMKn;N{Qqg@i#_QG@W zxq$pAy&s*aC_#}lNRZRqQ18hALCj{q@-!6Kh31BOa?2~UCfj5t`4MC@Y}+>c?K-kg z5@g%9VFd)-ntZQ7gmcR)IF5tkI9m$9_X3`=y9Y<5E(r(%7H{4F;NYPnq<+tG{MCf) zvoQ5M04;rYw-TC!CxePG?m~V#i1hC=_Hr3VO91NFmSwr>6jncsWm&Eu1|Z|q07!BK zc`bc+B}qCEI>pqfB}hs%KIZb@+G6lPXq%X7K@jAmKinhR_H^!#C7#GW2=c)@jss2g zu>=#OBYp^S0G{a_qCe9Lz(sBW(4T1~eYRJdMF=HG{HX*!Ym0{*6=9iEPJ|Mq1}m~B zyR<8|fc#oCZrh&gLUVFcUjXn;(;xp`*(d8=8siBiNEOX;WRHN~P(q#@|1^BIZl9-* zzrIzNVRL@|_C1+J=kKg?vZ-2Y02@IiT(v12>&QgPvtShX;pbTZ-ud+sSB@Uz{GC<0 zjQFNlG5E=8?)zNE1#so)u~^0p-R@8|NcACcBe%R#RIF{=HUwcRF``{(rkP@O4k^~l z>*(oNlm_wOp(6mX`k?i3gGE|}(4)Ar2f+Ms@{+8GvLHlVOo|}l^g$|uL^=p@>yjC? zRUy2O-_<&fQ`SG(c0kGByx;DZlN`VPZ1kW&o0C=p2@*xs2W6Lbk!XAzt5Niit7=f^ z?!%GpoqL$p7Kd4COBAAOfo@c4TtCdPEm2s{tXcOT5>(D8s_0sKRP@@M#&IIA#ma3I zqio}zGaeMQ4Y{>i<1qb!`0MIM+2YL`(hJ3nC_bnhFiRcT958o#rd+wmfoK|(&HMsD zqWvvdzmOcz8b_cH64+n2SC)lQJlRxDc1ddt+Zs}X{2OB`gdY+s`Eo2Z!Zc{stbyc! zM~5yX2lDN!`r;_iAQeH^gcph%Q8Z}QtYK)amUG4fhTPgbIhtV%zuV)2SA&B5ka|p9 z4ir0-3^I#dYmYqS%sou&bJE4uVnIj5)7LYBdqyX|`i}2Ec|Wvm{Nis6_rKw3J3Tqe z=|S%%>BvONQ!nM9{p9F|@#ZTXF66&dDIJ3R@vwU2ED&^Wl(wjSKCOOf1Fr;MuKuMh hgF=s4o>b@}=wDRTT6r;)=!gIS002ovPDHLkV1l39UY7s> literal 0 HcmV?d00001 diff --git a/packages/flame_tiled/test/tiled_test.dart b/packages/flame_tiled/test/tiled_test.dart index 83b5f267d7b..b742ee472b1 100644 --- a/packages/flame_tiled/test/tiled_test.dart +++ b/packages/flame_tiled/test/tiled_test.dart @@ -866,4 +866,39 @@ void main() { }); } }); + + group('oversized tiles', () { + late TiledComponent component; + final size = Vector2(16, 16); + + for (final mapType in [ + 'orthogonal', + 'isometric', + 'hexagonal', + 'staggered' + ]) { + group(mapType, () { + setUp(() async { + Flame.bundle = TestAssetBundle( + imageNames: [ + '0x72_DungeonTilesetII_v1.4.png', + ], + stringNames: ['oversized_tiles_$mapType.tmx'], + ); + component = await TiledComponent.load( + 'oversized_tiles_$mapType.tmx', + size, + ); + }); + + test('renders ($mapType)', () async { + final pngData = await renderMapToPng(component); + await expectLater( + pngData, + matchesGoldenFile('goldens/oversized_tiles_$mapType.png'), + ); + }); + }); + } + }); }