diff --git a/packages/flame/lib/src/components/core/component.dart b/packages/flame/lib/src/components/core/component.dart index f979ba87aca..7b1fb9f1f6c 100644 --- a/packages/flame/lib/src/components/core/component.dart +++ b/packages/flame/lib/src/components/core/component.dart @@ -580,6 +580,15 @@ class Component { components.forEach(remove); } + /// Removes all the children for which the [test] function returns true. + void removeWhere(bool Function(Component component) test) { + children.forEach((component) { + if (test(component)) { + remove(component); + } + }); + } + /// Remove the component from its parent in the next tick. void removeFromParent() { _parent?.remove(this); diff --git a/packages/flame/test/components/component_test.dart b/packages/flame/test/components/component_test.dart index 502b8957e56..f188471fede 100644 --- a/packages/flame/test/components/component_test.dart +++ b/packages/flame/test/components/component_test.dart @@ -33,6 +33,12 @@ class _ParentOnPrepareComponent extends _OnPrepareComponent { } } +class _IdentifiableComponent extends Component { + final int id; + + _IdentifiableComponent(this.id); +} + void main() { final prepareGame = FlameTester(_PrepareGame.new); @@ -344,6 +350,26 @@ void main() { game.update(0); }, ); + + testWithFlameGame( + 'removeWhere removes the correct components', + (game) async { + final components = List.generate( + 10, + _IdentifiableComponent.new, + ); + game.addAll(components); + await game.ready(); + expect(game.children.length, 10); + game.removeWhere((c) => (c as _IdentifiableComponent).id.isEven); + game.update(0); + expect(game.children.length, 5); + expect( + game.children.every((c) => (c as _IdentifiableComponent).id.isOdd), + true, + ); + }, + ); }); prepareGame.test( diff --git a/packages/flame_bloc/example/lib/src/game/game.dart b/packages/flame_bloc/example/lib/src/game/game.dart index 5303ec41da4..f99cbaea031 100644 --- a/packages/flame_bloc/example/lib/src/game/game.dart +++ b/packages/flame_bloc/example/lib/src/game/game.dart @@ -2,7 +2,6 @@ import 'package:flame/components.dart'; import 'package:flame/game.dart'; import 'package:flame/input.dart'; import 'package:flame_bloc/flame_bloc.dart'; - import 'package:flame_bloc_example/src/game/components/enemy.dart'; import 'package:flame_bloc_example/src/game/components/enemy_creator.dart'; import 'package:flame_bloc_example/src/game/components/player.dart'; @@ -19,7 +18,7 @@ class GameStatsController extends Component with HasGameRef { newState.status == GameStatus.initial; }, onNewState: (state) { - gameRef.children.removeWhere((element) => element is EnemyComponent); + gameRef.removeWhere((element) => element is EnemyComponent); }, ), );