Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
30 commits
Select commit Hold shift + click to select a range
899e2cc
added a list of paintables to RenderableLayer. Added API to fetch ren…
TheMaverickProgrammer Jul 21, 2025
e8d92fc
fix lint
TheMaverickProgrammer Jul 21, 2025
25d6ae6
make RenderableLayer export in lib
TheMaverickProgrammer Jul 21, 2025
e5a950f
converted RenderableLayer and all inherited classes into proper flame…
TheMaverickProgrammer Jul 21, 2025
b02abb4
render fixes. TODO: expose RenderableLayer correctly as a pubic API.
TheMaverickProgrammer Jul 22, 2025
f26d189
fixing @internal lib conflcit warning
TheMaverickProgrammer Jul 22, 2025
1629935
updated change log
TheMaverickProgrammer Jul 23, 2025
7ec0432
PR draft personal review of code caught typos.
TheMaverickProgrammer Jul 23, 2025
303fba0
object layers draw themselves. Now all layers are added to enderable…
TheMaverickProgrammer Jul 25, 2025
7767b89
fixed all tests except for orthogonal: parallax effect is not being c…
TheMaverickProgrammer Jul 26, 2025
2d36b26
camera needs to be passed into the child components in new version of…
TheMaverickProgrammer Jul 27, 2025
63f2d43
image layer repeat draw behavior now accurate AND optimized
TheMaverickProgrammer Jul 30, 2025
311256e
cleanup and prettify code
TheMaverickProgrammer Jul 30, 2025
b913f32
parallax math almost perfect with what Tiled shows. WYSIWYG.
TheMaverickProgrammer Jul 31, 2025
21b53ff
stable changes tested in other repos. commiting checkpoint before tests.
TheMaverickProgrammer Aug 13, 2025
97c85db
fixed the animation tests. the only remaining test to fix is test_shi…
TheMaverickProgrammer Aug 14, 2025
91795ac
cleanup for review.
TheMaverickProgrammer Aug 14, 2025
41aba50
Merge branch 'main' into feature/layer_component_ordering
TheMaverickProgrammer Aug 14, 2025
991eea6
patch yaml
TheMaverickProgrammer Aug 14, 2025
f807018
satisfy word check linter
TheMaverickProgrammer Aug 14, 2025
a9776ea
melos format. fixed tiled component key test.
TheMaverickProgrammer Aug 14, 2025
d69552a
PR review: elaborate documentation for UnsupportedLayer class.
TheMaverickProgrammer Aug 14, 2025
3dea410
satisfy spell checker
TheMaverickProgrammer Aug 14, 2025
0cf2ea4
new math allows each layer to apply its own offset to the canvas usin…
TheMaverickProgrammer Aug 15, 2025
f257c7f
fixed parallax effect optimization with new layer translation math
TheMaverickProgrammer Aug 15, 2025
bfc9641
Wrap math fixed.
TheMaverickProgrammer Aug 15, 2025
afd3f38
Parallax effects are now 1:1 with Tiled. WYSIWYG.
TheMaverickProgrammer Aug 16, 2025
344c77d
new tests WIP so far
TheMaverickProgrammer Sep 16, 2025
26c409b
Merge branch 'main' into feature/layer_component_ordering
TheMaverickProgrammer Sep 16, 2025
22ce55d
sync with upstream. TODO: update goldens for est_shifted.tmx. TODO: …
TheMaverickProgrammer Sep 16, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 12 additions & 0 deletions packages/flame/lib/src/game/transform2d.dart
Original file line number Diff line number Diff line change
Expand Up @@ -54,9 +54,21 @@ class Transform2D extends ChangeNotifier {
..scale = other.scale
..offset = other.offset;

factory Transform2D.fromInverse(Transform2D other) {
final t = other.clone();
t.angle = -t.angle;
t.position = -t.position;
t.scale = Vector2(1.0 / t.scale.x, 1.0 / t.scale.y);
t.offset = -t.offset;
return t;
}

/// Clone of this.
Transform2D clone() => Transform2D.copy(this);

/// Inverse of this.
Transform2D inverse() => Transform2D.fromInverse(this);

/// Set this to the values of the [other] [Transform2D].
void setFrom(Transform2D other) {
angle = other.angle;
Expand Down
10 changes: 10 additions & 0 deletions packages/flame_tiled/CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,3 +1,13 @@
## 3.0.8

- **FEAT**: Enable Tiled layers to respect component ordering for overlays and underlays. e.g. Foreground tiles obscure sprites.
- `RenderableLayer` is now a part of the public API.
- `RenderableLayer` is now a `Component` with `HasPaint` and `Position` traits. All render and update methods modified to integrate naturally into the Flame lifecycle.
- `RenderableTiledMap` has method `RenderableLayer? getRenderableLayer(String name)` to return the Flame component by name.
- e.g. `mapComponent.tileMap.getRenderableLayer('Ground')`
- Expanded the example map to be larger and placed coins beneath one of the layers to demonstrate this effect.
- Adjusted the camera move effect to better show-case this example map as the previous one poorly scrolled too far away.

## 3.0.7

- **REFACTOR**: Move MutableRSTransform out of flame_tiled package and into flame package ([#3695](https://github.com/flame-engine/flame/issues/3695)). ([7d644dd8](https://github.com/flame-engine/flame/commit/7d644dd84ce27e292b53f7310967393cf4c60618))
Expand Down
Binary file added packages/flame_tiled/example/assets/images/snow.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
54 changes: 45 additions & 9 deletions packages/flame_tiled/example/assets/tiles/map.tmx

Large diffs are not rendered by default.

59 changes: 51 additions & 8 deletions packages/flame_tiled/example/lib/main.dart
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
import 'dart:math';

import 'package:flame/components.dart';
import 'package:flame/effects.dart';
import 'package:flame/flame.dart';
Expand All @@ -9,6 +11,25 @@ void main() {
runApp(GameWidget(game: TiledGame()));
}

class ScrollSnowComponent extends Component {
ScrollSnowComponent();
double _elapsed = 0;

@override
void update(double dt) {
if (parent is! RenderableLayer || parent == null) {
return;
}

final p = parent! as RenderableLayer;
_elapsed += dt;

p
..offsetX -= sin(_elapsed * 0.5) * 3.0
..offsetY += 1 + sin(_elapsed).abs();
}
}

class TiledGame extends FlameGame {
late TiledComponent mapComponent;

Expand All @@ -27,29 +48,51 @@ class TiledGame extends FlameGame {
..anchor = Anchor.topLeft
..add(
MoveToEffect(
Vector2(1000, 0),
Vector2(180, 90),
EffectController(
duration: 10,
duration: 5,
alternate: true,
infinite: true,
),
),
);

mapComponent = await TiledComponent.load('map.tmx', Vector2.all(16));
world.add(mapComponent);
mapComponent = await TiledComponent.load(
'map.tmx',
Vector2.all(16),
);
await world.add(mapComponent);

final snowLayer = mapComponent.tileMap.getRenderableLayer(
'Snow',
);

// This layer is toggled to scroll infinitely across both
// the x and y axis. Add a component to apply real-time
// scrolling behavior to make the snow fall!
if (snowLayer != null) {
await snowLayer.add(ScrollSnowComponent());
}

final objectGroup = mapComponent.tileMap.getLayer<ObjectGroup>(
'AnimatedCoins',
);

// No coins to add. No work to be done.
if (objectGroup == null) {
return;
}

final coins = await Flame.images.load('coins.png');

// We are 100% sure that an object layer named `AnimatedCoins`
// exists in the example `map.tmx`.
for (final object in objectGroup!.objects) {
world.add(
// Add sprites behind the ground decoration layer.
final groundLayer = mapComponent.tileMap.getRenderableLayer('Ground');

for (final object in objectGroup.objects) {
groundLayer?.add(
SpriteAnimationComponent(
size: Vector2.all(20.0),
anchor: Anchor.center,
position: Vector2(object.x, object.y),
animation: SpriteAnimation.fromFrameData(
coins,
Expand Down
1 change: 1 addition & 0 deletions packages/flame_tiled/example/pubspec.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -23,3 +23,4 @@ flutter:
- assets/images/level_standard_tileset.png
- assets/images/repeatable_background.png
- assets/images/coins.png
- assets/images/snow.png
1 change: 1 addition & 0 deletions packages/flame_tiled/lib/flame_tiled.dart
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ export 'package:tiled/tiled.dart';

export 'src/extensions.dart';
export 'src/flame_tsx_provider.dart';
export 'src/renderable_layers/renderable_layer.dart';
export 'src/renderable_tile_map.dart';
export 'src/simple_flips.dart';
export 'src/tile_atlas.dart';
Expand Down
34 changes: 4 additions & 30 deletions packages/flame_tiled/lib/src/renderable_layers/group_layer.dart
Original file line number Diff line number Diff line change
@@ -1,50 +1,24 @@
import 'package:flame/components.dart';
import 'package:flame/extensions.dart';
import 'package:flame_tiled/src/renderable_layers/renderable_layer.dart';
import 'package:meta/meta.dart';
import 'package:tiled/tiled.dart';

@internal
class GroupLayer extends RenderableLayer<Group> {
/// The child layers of this [Group] to be rendered recursively.
///
/// NOTE: This is set externally instead of via constructor params because
/// there are cyclic dependencies when loading the renderable layers.
late final List<RenderableLayer> children;

GroupLayer({
required super.layer,
required super.parent,
required super.camera,
required super.map,
required super.destTileSize,
required super.layerPaintFactory,
super.filterQuality,
});

@override
void refreshCache() {
for (final child in children) {
final childLayers = children.whereType<RenderableLayer>();
for (final child in childLayers) {
child.refreshCache();
}
}

@override
void handleResize(Vector2 canvasSize) {
for (final child in children) {
child.handleResize(canvasSize);
}
}

@override
void render(Canvas canvas, CameraComponent? camera) {
for (final child in children) {
child.render(canvas, camera);
}
}

@override
void update(double dt) {
for (final child in children) {
child.update(dt);
}
}
}
Loading
Loading