From 2950bc2b3086292c1b7ca8e90af567d82737bd03 Mon Sep 17 00:00:00 2001 From: Allison Ryan Date: Sun, 8 May 2022 21:40:37 -0500 Subject: [PATCH] feat: rollover sounds --- lib/game/behaviors/behaviors.dart | 1 + .../behaviors/rollover_noise_behavior.dart | 13 ++++ .../google_gallery/google_gallery.dart | 2 + lib/game/pinball_game.dart | 1 + .../pinball_audio/assets/sfx/rollover.mp3 | Bin 0 -> 8914 bytes .../pinball_audio/lib/gen/assets.gen.dart | 1 + .../pinball_audio/lib/src/pinball_audio.dart | 15 +++- .../test/src/pinball_audio_test.dart | 67 +++++++++++++----- .../rollover_noise_behavior_test.dart | 58 +++++++++++++++ .../google_gallery/google_gallery_test.dart | 14 ++++ 10 files changed, 152 insertions(+), 20 deletions(-) create mode 100644 lib/game/behaviors/rollover_noise_behavior.dart create mode 100644 packages/pinball_audio/assets/sfx/rollover.mp3 create mode 100644 test/game/behaviors/rollover_noise_behavior_test.dart diff --git a/lib/game/behaviors/behaviors.dart b/lib/game/behaviors/behaviors.dart index bb196cec..bca8be14 100644 --- a/lib/game/behaviors/behaviors.dart +++ b/lib/game/behaviors/behaviors.dart @@ -6,4 +6,5 @@ export 'camera_focusing_behavior.dart'; export 'character_selection_behavior.dart'; export 'cow_bumper_noise_behavior.dart'; export 'kicker_noise_behavior.dart'; +export 'rollover_noise_behavior.dart'; export 'scoring_behavior.dart'; diff --git a/lib/game/behaviors/rollover_noise_behavior.dart b/lib/game/behaviors/rollover_noise_behavior.dart new file mode 100644 index 00000000..06b2f77a --- /dev/null +++ b/lib/game/behaviors/rollover_noise_behavior.dart @@ -0,0 +1,13 @@ +// ignore_for_file: public_member_api_docs + +import 'package:flame_forge2d/flame_forge2d.dart'; +import 'package:pinball_audio/pinball_audio.dart'; +import 'package:pinball_flame/pinball_flame.dart'; + +class RolloverNoiseBehavior extends ContactBehavior { + @override + void beginContact(Object other, Contact contact) { + super.beginContact(other, contact); + readProvider().play(PinballAudio.rollover); + } +} diff --git a/lib/game/components/google_gallery/google_gallery.dart b/lib/game/components/google_gallery/google_gallery.dart index 0b3d4b10..ec3f9e36 100644 --- a/lib/game/components/google_gallery/google_gallery.dart +++ b/lib/game/components/google_gallery/google_gallery.dart @@ -22,12 +22,14 @@ class GoogleGallery extends Component with ZIndex { side: BoardSide.right, children: [ ScoringContactBehavior(points: Points.fiveThousand), + RolloverNoiseBehavior(), ], ), GoogleRollover( side: BoardSide.left, children: [ ScoringContactBehavior(points: Points.fiveThousand), + RolloverNoiseBehavior(), ], ), GoogleWord(position: Vector2(-4.45, 1.8)), diff --git a/lib/game/pinball_game.dart b/lib/game/pinball_game.dart index dca26b84..b1f3c98a 100644 --- a/lib/game/pinball_game.dart +++ b/lib/game/pinball_game.dart @@ -125,6 +125,7 @@ class PinballGame extends PinballForge2DGame SkillShot( children: [ ScoringContactBehavior(points: Points.oneMillion), + RolloverNoiseBehavior(), ], ), AndroidAcres(), diff --git a/packages/pinball_audio/assets/sfx/rollover.mp3 b/packages/pinball_audio/assets/sfx/rollover.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..543a3560d7b0818533b38fd7375d2312b9e28337 GIT binary patch literal 8914 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 literal 0 HcmV?d00001 diff --git a/packages/pinball_audio/lib/gen/assets.gen.dart b/packages/pinball_audio/lib/gen/assets.gen.dart index c8b66234..0b8fb20b 100644 --- a/packages/pinball_audio/lib/gen/assets.gen.dart +++ b/packages/pinball_audio/lib/gen/assets.gen.dart @@ -26,6 +26,7 @@ class $AssetsSfxGen { String get kickerA => 'assets/sfx/kicker_a.mp3'; String get kickerB => 'assets/sfx/kicker_b.mp3'; String get launcher => 'assets/sfx/launcher.mp3'; + String get rollover => 'assets/sfx/rollover.mp3'; String get sparky => 'assets/sfx/sparky.mp3'; } diff --git a/packages/pinball_audio/lib/src/pinball_audio.dart b/packages/pinball_audio/lib/src/pinball_audio.dart index 9682b520..e0e69988 100644 --- a/packages/pinball_audio/lib/src/pinball_audio.dart +++ b/packages/pinball_audio/lib/src/pinball_audio.dart @@ -33,6 +33,9 @@ enum PinballAudio { /// Kicker. kicker, + /// Rollover. + rollover, + /// Sparky. sparky, @@ -56,7 +59,7 @@ typedef CreateAudioPool = Future Function( }); /// Defines the contract for playing a single audio. -typedef PlaySingleAudio = Future Function(String); +typedef PlaySingleAudio = Future Function(String, {double volume}); /// Defines the contract for looping a single audio. typedef LoopSingleAudio = Future Function(String, {double volume}); @@ -81,18 +84,20 @@ class _SimplePlayAudio extends _Audio { required this.preCacheSingleAudio, required this.playSingleAudio, required this.path, + this.volume, }); final PreCacheSingleAudio preCacheSingleAudio; final PlaySingleAudio playSingleAudio; final String path; + final double? volume; @override Future load() => preCacheSingleAudio(prefixFile(path)); @override void play() { - playSingleAudio(prefixFile(path)); + playSingleAudio(prefixFile(path), volume: volume ?? 1); } } @@ -266,6 +271,12 @@ class PinballAudioPlayer { playSingleAudio: _playSingleAudio, path: Assets.sfx.launcher, ), + PinballAudio.rollover: _SimplePlayAudio( + preCacheSingleAudio: _preCacheSingleAudio, + playSingleAudio: _playSingleAudio, + path: Assets.sfx.rollover, + volume: 0.3, + ), PinballAudio.ioPinballVoiceOver: _SimplePlayAudio( preCacheSingleAudio: _preCacheSingleAudio, playSingleAudio: _playSingleAudio, diff --git a/packages/pinball_audio/test/src/pinball_audio_test.dart b/packages/pinball_audio/test/src/pinball_audio_test.dart index 3e147329..0aeab845 100644 --- a/packages/pinball_audio/test/src/pinball_audio_test.dart +++ b/packages/pinball_audio/test/src/pinball_audio_test.dart @@ -29,15 +29,15 @@ class _MockConfigureAudioCache extends Mock { } class _MockPlaySingleAudio extends Mock { - Future onCall(String url); + Future onCall(String path, {double volume}); } class _MockLoopSingleAudio extends Mock { - Future onCall(String url, {double volume}); + Future onCall(String path, {double volume}); } abstract class _PreCacheSingleAudio { - Future onCall(String url); + Future onCall(String path); } class _MockPreCacheSingleAudio extends Mock implements _PreCacheSingleAudio {} @@ -74,7 +74,8 @@ void main() { when(() => configureAudioCache.onCall(any())).thenAnswer((_) {}); playSingleAudio = _MockPlaySingleAudio(); - when(() => playSingleAudio.onCall(any())).thenAnswer((_) async {}); + when(() => playSingleAudio.onCall(any(), volume: any(named: 'volume'))) + .thenAnswer((_) async {}); loopSingleAudio = _MockLoopSingleAudio(); when(() => loopSingleAudio.onCall(any(), volume: any(named: 'volume'))) @@ -195,6 +196,10 @@ void main() { () => preCacheSingleAudio .onCall('packages/pinball_audio/assets/sfx/launcher.mp3'), ).called(1); + verify( + () => preCacheSingleAudio + .onCall('packages/pinball_audio/assets/sfx/rollover.mp3'), + ).called(1); verify( () => preCacheSingleAudio .onCall('packages/pinball_audio/assets/sfx/cow_moo.mp3'), @@ -345,10 +350,10 @@ void main() { await Future.wait(audioPlayer.load()); audioPlayer.play(PinballAudio.google); - verify( - () => playSingleAudio - .onCall('packages/pinball_audio/${Assets.sfx.google}'), - ).called(1); + verify(() => playSingleAudio.onCall( + 'packages/pinball_audio/${Assets.sfx.google}', + volume: any(named: 'volume'), + )).called(1); }); }); @@ -358,8 +363,10 @@ void main() { audioPlayer.play(PinballAudio.sparky); verify( - () => playSingleAudio - .onCall('packages/pinball_audio/${Assets.sfx.sparky}'), + () => playSingleAudio.onCall( + 'packages/pinball_audio/${Assets.sfx.sparky}', + volume: any(named: 'volume'), + ), ).called(1); }); }); @@ -370,8 +377,10 @@ void main() { audioPlayer.play(PinballAudio.dino); verify( - () => playSingleAudio - .onCall('packages/pinball_audio/${Assets.sfx.dino}'), + () => playSingleAudio.onCall( + 'packages/pinball_audio/${Assets.sfx.dino}', + volume: any(named: 'volume'), + ), ).called(1); }); }); @@ -382,8 +391,10 @@ void main() { audioPlayer.play(PinballAudio.android); verify( - () => playSingleAudio - .onCall('packages/pinball_audio/${Assets.sfx.android}'), + () => playSingleAudio.onCall( + 'packages/pinball_audio/${Assets.sfx.android}', + volume: any(named: 'volume'), + ), ).called(1); }); }); @@ -394,8 +405,10 @@ void main() { audioPlayer.play(PinballAudio.dash); verify( - () => playSingleAudio - .onCall('packages/pinball_audio/${Assets.sfx.dash}'), + () => playSingleAudio.onCall( + 'packages/pinball_audio/${Assets.sfx.dash}', + volume: any(named: 'volume'), + ), ).called(1); }); }); @@ -406,8 +419,24 @@ void main() { audioPlayer.play(PinballAudio.launcher); verify( - () => playSingleAudio - .onCall('packages/pinball_audio/${Assets.sfx.launcher}'), + () => playSingleAudio.onCall( + 'packages/pinball_audio/${Assets.sfx.launcher}', + volume: any(named: 'volume'), + ), + ).called(1); + }); + }); + + group('rollover', () { + test('plays the correct file', () async { + await Future.wait(audioPlayer.load()); + audioPlayer.play(PinballAudio.rollover); + + verify( + () => playSingleAudio.onCall( + 'packages/pinball_audio/${Assets.sfx.rollover}', + volume: .3, + ), ).called(1); }); }); @@ -420,6 +449,7 @@ void main() { verify( () => playSingleAudio.onCall( 'packages/pinball_audio/${Assets.sfx.ioPinballVoiceOver}', + volume: any(named: 'volume'), ), ).called(1); }); @@ -433,6 +463,7 @@ void main() { verify( () => playSingleAudio.onCall( 'packages/pinball_audio/${Assets.sfx.gameOverVoiceOver}', + volume: any(named: 'volume'), ), ).called(1); }); diff --git a/test/game/behaviors/rollover_noise_behavior_test.dart b/test/game/behaviors/rollover_noise_behavior_test.dart new file mode 100644 index 00000000..a196c8b6 --- /dev/null +++ b/test/game/behaviors/rollover_noise_behavior_test.dart @@ -0,0 +1,58 @@ +// ignore_for_file: cascade_invocations + +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/game/behaviors/behaviors.dart'; +import 'package:pinball_audio/pinball_audio.dart'; +import 'package:pinball_flame/pinball_flame.dart'; + +class _TestGame extends Forge2DGame { + Future pump( + _TestBodyComponent child, { + required PinballAudioPlayer audioPlayer, + }) { + return ensureAdd( + FlameProvider.value( + audioPlayer, + children: [child], + ), + ); + } +} + +class _TestBodyComponent extends BodyComponent { + @override + Body createBody() => world.createBody(BodyDef()); +} + +class _MockPinballAudioPlayer extends Mock implements PinballAudioPlayer {} + +class _MockContact extends Mock implements Contact {} + +void main() { + TestWidgetsFlutterBinding.ensureInitialized(); + + group('RolloverNoiseBehavior', () { + late PinballAudioPlayer audioPlayer; + final flameTester = FlameTester(_TestGame.new); + + setUp(() { + audioPlayer = _MockPinballAudioPlayer(); + }); + flameTester.testGameWidget( + 'plays rollover sound on contact', + setUp: (game, _) async { + final behavior = RolloverNoiseBehavior(); + final parent = _TestBodyComponent(); + await game.pump(parent, audioPlayer: audioPlayer); + await parent.ensureAdd(behavior); + behavior.beginContact(Object(), _MockContact()); + }, + verify: (_, __) async { + verify(() => audioPlayer.play(PinballAudio.rollover)).called(1); + }, + ); + }); +} diff --git a/test/game/components/google_gallery/google_gallery_test.dart b/test/game/components/google_gallery/google_gallery_test.dart index 9551285f..719be2dc 100644 --- a/test/game/components/google_gallery/google_gallery_test.dart +++ b/test/game/components/google_gallery/google_gallery_test.dart @@ -97,6 +97,20 @@ void main() { }, ); + flameTester.test( + 'RolloverNoiseBehavior to GoogleRollovers', + (game) async { + await game.pump(GoogleGallery()); + + game.descendants().whereType().forEach( + (rollover) => expect( + rollover.firstChild(), + isNotNull, + ), + ); + }, + ); + flameTester.test('a GoogleWordBonusBehavior', (game) async { final component = GoogleGallery(); await game.pump(component);