diff --git a/packages/pinball_audio/lib/src/pinball_audio.dart b/packages/pinball_audio/lib/src/pinball_audio.dart index 70355f2c..dafcdbb5 100644 --- a/packages/pinball_audio/lib/src/pinball_audio.dart +++ b/packages/pinball_audio/lib/src/pinball_audio.dart @@ -151,7 +151,7 @@ class _SingleLoopAudio extends _LoopAudio { } class _SingleAudioPool extends _Audio { - _SingleAudioPoll({ + _SingleAudioPool({ required this.path, required this.createAudioPool, required this.maxPlayers, @@ -307,7 +307,7 @@ class PinballAudioPlayer { path: Assets.sfx.rollover, volume: 0.3, ), - PinballAudio.flipper: _SingleAudioPoll( + PinballAudio.flipper: _SingleAudioPool( path: Assets.sfx.flipper, createAudioPool: _createAudioPool, maxPlayers: 2, diff --git a/packages/pinball_audio/test/src/pinball_audio_test.dart b/packages/pinball_audio/test/src/pinball_audio_test.dart index 28c4f1f6..554e9752 100644 --- a/packages/pinball_audio/test/src/pinball_audio_test.dart +++ b/packages/pinball_audio/test/src/pinball_audio_test.dart @@ -357,7 +357,7 @@ void main() { ).thenAnswer((_) async => pool); }); - test('plays the bumper A sound pool', () async { + test('plays the flipper sound pool', () async { when(seed.nextBool).thenReturn(true); await Future.wait( audioPlayer.load().map((loadableBuilder) => loadableBuilder()), diff --git a/packages/pinball_components/lib/src/components/flipper/behaviors/behaviors.dart b/packages/pinball_components/lib/src/components/flipper/behaviors/behaviors.dart index d3743ae9..2325227d 100644 --- a/packages/pinball_components/lib/src/components/flipper/behaviors/behaviors.dart +++ b/packages/pinball_components/lib/src/components/flipper/behaviors/behaviors.dart @@ -1,3 +1,4 @@ export 'flipper_jointing_behavior.dart'; export 'flipper_key_controlling_behavior.dart'; export 'flipper_moving_behavior.dart'; +export 'flipper_noise_behavior.dart'; diff --git a/packages/pinball_components/lib/src/components/flipper/behaviors/flipper_moving_behavior.dart b/packages/pinball_components/lib/src/components/flipper/behaviors/flipper_moving_behavior.dart index 12cc66d2..56023e78 100644 --- a/packages/pinball_components/lib/src/components/flipper/behaviors/flipper_moving_behavior.dart +++ b/packages/pinball_components/lib/src/components/flipper/behaviors/flipper_moving_behavior.dart @@ -27,9 +27,6 @@ class FlipperMovingBehavior extends Component void onNewState(FlipperState state) { super.onNewState(state); if (bloc.state.isMovingDown) _moveDown(); - if (bloc.state.isMovingUp) { - readProvider().play(PinballAudio.flipper); - } } @override diff --git a/packages/pinball_components/lib/src/components/flipper/behaviors/flipper_noise_behavior.dart b/packages/pinball_components/lib/src/components/flipper/behaviors/flipper_noise_behavior.dart new file mode 100644 index 00000000..6dc4a88e --- /dev/null +++ b/packages/pinball_components/lib/src/components/flipper/behaviors/flipper_noise_behavior.dart @@ -0,0 +1,18 @@ +import 'package:flame/components.dart'; +import 'package:flame_bloc/flame_bloc.dart'; +import 'package:pinball_audio/pinball_audio.dart'; +import 'package:pinball_components/pinball_components.dart'; +import 'package:pinball_flame/pinball_flame.dart'; + +class FlipperNoiseBehavior extends Component + with + FlameBlocListenable, + FlameBlocReader { + @override + void onNewState(FlipperState state) { + super.onNewState(state); + if (bloc.state.isMovingUp) { + readProvider().play(PinballAudio.flipper); + } + } +} diff --git a/packages/pinball_components/lib/src/components/flipper/flipper.dart b/packages/pinball_components/lib/src/components/flipper/flipper.dart index 265e7924..cc6ef13a 100644 --- a/packages/pinball_components/lib/src/components/flipper/flipper.dart +++ b/packages/pinball_components/lib/src/components/flipper/flipper.dart @@ -25,7 +25,10 @@ class Flipper extends BodyComponent with KeyboardHandler, InitialPosition { FlipperJointingBehavior(), FlameBlocProvider( create: FlipperCubit.new, - children: [FlipperMovingBehavior(strength: 90)], + children: [ + FlipperMovingBehavior(strength: 90), + FlipperNoiseBehavior(), + ], ), ], ); diff --git a/packages/pinball_components/test/src/components/flipper/behaviors/flipper_moving_behavior_test.dart b/packages/pinball_components/test/src/components/flipper/behaviors/flipper_moving_behavior_test.dart index ac629544..de379201 100644 --- a/packages/pinball_components/test/src/components/flipper/behaviors/flipper_moving_behavior_test.dart +++ b/packages/pinball_components/test/src/components/flipper/behaviors/flipper_moving_behavior_test.dart @@ -10,7 +10,6 @@ import 'package:flutter_test/flutter_test.dart'; import 'package:mocktail/mocktail.dart'; import 'package:pinball_audio/pinball_audio.dart'; import 'package:pinball_components/pinball_components.dart'; -import 'package:pinball_flame/pinball_flame.dart'; class _TestGame extends Forge2DGame { Future pump( @@ -19,14 +18,7 @@ class _TestGame extends Forge2DGame { PinballAudioPlayer? audioPlayer, }) async { final flipper = Flipper.test(side: BoardSide.left); - await ensureAdd( - FlameProvider.value( - audioPlayer ?? _MockPinballAudioPlayer(), - children: [ - flipper, - ], - ), - ); + await ensureAdd(flipper); await flipper.ensureAdd( FlameBlocProvider.value( value: flipperBloc ?? FlipperCubit(), @@ -36,8 +28,6 @@ class _TestGame extends Forge2DGame { } } -class _MockPinballAudioPlayer extends Mock implements PinballAudioPlayer {} - class _MockFlipperCubit extends Mock implements FlipperCubit {} void main() { @@ -109,30 +99,5 @@ void main() { expect(flipper.body.linearVelocity.y, -strength); }, ); - - flameTester.test( - 'plays the flipper sound when moving up', - (game) async { - final audioPlayer = _MockPinballAudioPlayer(); - final bloc = _MockFlipperCubit(); - whenListen( - bloc, - Stream.fromIterable([FlipperState.movingUp]), - initialState: FlipperState.movingUp, - ); - - const strength = 10.0; - final behavior = FlipperMovingBehavior(strength: strength); - await game.pump( - behavior, - flipperBloc: bloc, - audioPlayer: audioPlayer, - ); - behavior.onNewState(FlipperState.movingUp); - game.update(0); - - verify(() => audioPlayer.play(PinballAudio.flipper)).called(1); - }, - ); }); } diff --git a/packages/pinball_components/test/src/components/flipper/behaviors/flipper_noise_behavior_test.dart b/packages/pinball_components/test/src/components/flipper/behaviors/flipper_noise_behavior_test.dart new file mode 100644 index 00000000..2a046a0b --- /dev/null +++ b/packages/pinball_components/test/src/components/flipper/behaviors/flipper_noise_behavior_test.dart @@ -0,0 +1,79 @@ +// ignore_for_file: avoid_dynamic_calls, cascade_invocations + +import 'dart:async'; + +import 'package:bloc_test/bloc_test.dart'; +import 'package:flame_bloc/flame_bloc.dart'; +import 'package:flame_forge2d/flame_forge2d.dart'; +import 'package:flame_test/flame_test.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:mocktail/mocktail.dart'; +import 'package:pinball_audio/pinball_audio.dart'; +import 'package:pinball_components/pinball_components.dart'; +import 'package:pinball_flame/pinball_flame.dart'; + +class _TestGame extends Forge2DGame { + Future pump( + FlipperNoiseBehavior behavior, { + FlipperCubit? flipperBloc, + PinballAudioPlayer? audioPlayer, + }) async { + final flipper = Flipper.test(side: BoardSide.left); + await ensureAdd( + FlameProvider.value( + audioPlayer ?? _MockPinballAudioPlayer(), + children: [ + flipper, + ], + ), + ); + await flipper.ensureAdd( + FlameBlocProvider.value( + value: flipperBloc ?? FlipperCubit(), + children: [behavior], + ), + ); + } +} + +class _MockPinballAudioPlayer extends Mock implements PinballAudioPlayer {} + +class _MockFlipperCubit extends Mock implements FlipperCubit {} + +void main() { + TestWidgetsFlutterBinding.ensureInitialized(); + final flameTester = FlameTester(_TestGame.new); + + group('FlipperNoiseBehavior', () { + test('can be instantiated', () { + expect( + FlipperNoiseBehavior(), + isA(), + ); + }); + + flameTester.test( + 'plays the flipper sound when moving up', + (game) async { + final audioPlayer = _MockPinballAudioPlayer(); + final bloc = _MockFlipperCubit(); + whenListen( + bloc, + Stream.fromIterable([FlipperState.movingUp]), + initialState: FlipperState.movingUp, + ); + + final behavior = FlipperNoiseBehavior(); + await game.pump( + behavior, + flipperBloc: bloc, + audioPlayer: audioPlayer, + ); + behavior.onNewState(FlipperState.movingUp); + game.update(0); + + verify(() => audioPlayer.play(PinballAudio.flipper)).called(1); + }, + ); + }); +}