diff --git a/lib/game/components/components.dart b/lib/game/components/components.dart index 61d0f3ca..9dd7eed4 100644 --- a/lib/game/components/components.dart +++ b/lib/game/components/components.dart @@ -5,4 +5,5 @@ export 'controlled_flipper.dart'; export 'flutter_forest.dart'; export 'plunger.dart'; export 'score_points.dart'; +export 'sparky_fire_zone.dart'; export 'wall.dart'; diff --git a/lib/game/components/sparky_fire_zone.dart b/lib/game/components/sparky_fire_zone.dart new file mode 100644 index 00000000..9d88f0f5 --- /dev/null +++ b/lib/game/components/sparky_fire_zone.dart @@ -0,0 +1,44 @@ +// ignore_for_file: avoid_renaming_method_parameters + +import 'package:flame/components.dart'; +import 'package:pinball/flame/flame.dart'; +import 'package:pinball/game/game.dart'; +import 'package:pinball_components/pinball_components.dart'; + +// TODO(ruimiguel): create and add SparkyFireZone component here in other PR. + +// TODO(ruimiguel): make private and remove ignore once SparkyFireZone is done +// ignore: public_member_api_docs +class ControlledSparkyBumper extends SparkyBumper + with Controls<_SparkyBumperController> { + // TODO(ruimiguel): make private and remove ignore once SparkyFireZone is done + // ignore: public_member_api_docs + ControlledSparkyBumper() : super.a() { + controller = _SparkyBumperController(this); + } +} + +/// {@template sparky_bumper_controller} +/// Controls a [SparkyBumper]. +/// {@endtemplate} +class _SparkyBumperController extends ComponentController + with HasGameRef { + /// {@macro sparky_bumper_controller} + _SparkyBumperController(ControlledSparkyBumper controlledSparkyBumper) + : super(controlledSparkyBumper); + + /// Flag for activated state of the [SparkyBumper]. + /// + /// Used to toggle [SparkyBumper]s' state between activated and deactivated. + bool isActivated = false; + + /// Registers when a [SparkyBumper] is hit by a [Ball]. + void hit() { + if (isActivated) { + component.deactivate(); + } else { + component.activate(); + } + isActivated = !isActivated; + } +} diff --git a/lib/gen/assets.gen.dart b/lib/gen/assets.gen.dart index 5c2a87c2..90013646 100644 --- a/lib/gen/assets.gen.dart +++ b/lib/gen/assets.gen.dart @@ -3,6 +3,8 @@ /// FlutterGen /// ***************************************************** +// ignore_for_file: directives_ordering,unnecessary_import + import 'package:flutter/widgets.dart'; class $AssetsImagesGen { @@ -15,6 +17,7 @@ class $AssetsImagesGen { class $AssetsImagesComponentsGen { const $AssetsImagesComponentsGen(); + /// File path: assets/images/components/background.png AssetGenImage get background => const AssetGenImage('assets/images/components/background.png'); diff --git a/test/game/components/sparky_fire_zone_test.dart b/test/game/components/sparky_fire_zone_test.dart new file mode 100644 index 00000000..dceaa9cc --- /dev/null +++ b/test/game/components/sparky_fire_zone_test.dart @@ -0,0 +1,45 @@ +// ignore_for_file: cascade_invocations + +import 'package:flame_test/flame_test.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:pinball/game/game.dart'; + +import '../../helpers/helpers.dart'; + +void main() { + TestWidgetsFlutterBinding.ensureInitialized(); + final flameTester = FlameTester(EmptyPinballGameTest.new); + + group('SparkyFireZone', () { + group('bumpers', () { + late ControlledSparkyBumper controlledSparkyBumper; + + flameTester.testGameWidget( + 'activate when deactivated bumper is hit', + setUp: (game, tester) async { + controlledSparkyBumper = ControlledSparkyBumper(); + await game.ensureAdd(controlledSparkyBumper); + + controlledSparkyBumper.controller.hit(); + }, + verify: (game, tester) async { + expect(controlledSparkyBumper.controller.isActivated, isTrue); + }, + ); + + flameTester.testGameWidget( + 'deactivate when activated bumper is hit', + setUp: (game, tester) async { + controlledSparkyBumper = ControlledSparkyBumper(); + await game.ensureAdd(controlledSparkyBumper); + + controlledSparkyBumper.controller.hit(); + controlledSparkyBumper.controller.hit(); + }, + verify: (game, tester) async { + expect(controlledSparkyBumper.controller.isActivated, isFalse); + }, + ); + }); + }); +}