diff --git a/packages/flame/lib/src/components/spawn_component.dart b/packages/flame/lib/src/components/spawn_component.dart index 947e5d2fb3..dbf5b63e0d 100644 --- a/packages/flame/lib/src/components/spawn_component.dart +++ b/packages/flame/lib/src/components/spawn_component.dart @@ -25,6 +25,7 @@ class SpawnComponent extends Component { this.area, this.within = true, this.selfPositioning = false, + this.autoStart = true, Random? random, super.key, }) : assert( @@ -46,6 +47,7 @@ class SpawnComponent extends Component { this.area, this.within = true, this.selfPositioning = false, + this.autoStart = true, Random? random, super.key, }) : assert( @@ -102,6 +104,9 @@ class SpawnComponent extends Component { /// The amount of spawned components. int amount = 0; + /// Whether the timer automatically starts or not. + final bool autoStart; + @override FutureOr onLoad() async { if (area == null && !selfPositioning) { @@ -147,6 +152,7 @@ class SpawnComponent extends Component { updatePeriod(); amount++; }, + autoStart: autoStart, ); timer = timerComponent.timer; add(timerComponent); diff --git a/packages/flame/test/components/spawn_component_test.dart b/packages/flame/test/components/spawn_component_test.dart index c0ff4154cd..19c82f169d 100644 --- a/packages/flame/test/components/spawn_component_test.dart +++ b/packages/flame/test/components/spawn_component_test.dart @@ -140,5 +140,31 @@ void main() { isTrue, ); }); + + testWithFlameGame('Does not spawns when auto start is false', (game) async { + final random = Random(0); + final shape = Rectangle.fromCenter( + center: Vector2(100, 200), + size: Vector2.all(200), + ); + final spawn = SpawnComponent( + factory: (_) => PositionComponent(), + period: 1, + area: shape, + random: random, + autoStart: false, + ); + final world = game.world; + await world.ensureAdd(spawn); + game.update(1.5); + await game.ready(); + expect(world.children.length, 1); + + spawn.timer.start(); + + game.update(1); + await game.ready(); + expect(world.children.length, 2); + }); }); }