diff --git a/packages/pinball_components/lib/src/components/layer.dart b/packages/pinball_components/lib/src/components/layer.dart index 3cc0471f..a3f11f46 100644 --- a/packages/pinball_components/lib/src/components/layer.dart +++ b/packages/pinball_components/lib/src/components/layer.dart @@ -8,6 +8,9 @@ import 'package:flutter/material.dart'; /// [BodyComponent]s with compatible [Layer]s can collide with each other, /// ignoring others. This compatibility depends on bit masking operation /// between layers. For more information read: https://en.wikipedia.org/wiki/Mask_(computing). +/// +/// A parent [Layered] have priority against its children's layer. Them won't be +/// changed but will be ignored. /// {@endtemplate} mixin Layered on BodyComponent { Layer _layer = Layer.all; diff --git a/packages/pinball_components/test/src/components/layer_test.dart b/packages/pinball_components/test/src/components/layer_test.dart index 1eaa9135..0b92bc96 100644 --- a/packages/pinball_components/test/src/components/layer_test.dart +++ b/packages/pinball_components/test/src/components/layer_test.dart @@ -14,6 +14,24 @@ class TestBodyComponent extends BodyComponent with Layered { } } +class TestNestedBodyComponent extends BodyComponent with Layered { + TestNestedBodyComponent({required this.childLayer}); + + final Layer childLayer; + + @override + Body createBody() { + final fixtureDef = FixtureDef(CircleShape()); + return world.createBody(BodyDef())..createFixture(fixtureDef); + } + + @override + Future onLoad() async { + await super.onLoad(); + await add(TestBodyComponent()..layer = childLayer); + } +} + void main() { final flameTester = FlameTester(Forge2DGame.new); @@ -121,6 +139,24 @@ void main() { expect(component.layer, equals(Layer.all)); }, ); + + flameTester.test( + 'nested children will keep their layer', + (game) async { + const parentLayer = Layer.jetpack; + const childLayer = Layer.board; + + final component = TestNestedBodyComponent(childLayer: childLayer) + ..layer = parentLayer; + + await game.ensureAdd(component); + expect(childLayer, isNot(equals(parentLayer))); + + for (final child in component.children) { + expect((child as TestBodyComponent).layer, equals(childLayer)); + } + }, + ); }); group('LayerMaskBits', () {