From d455633987a1ed1ddce64add7d4896d80b85c427 Mon Sep 17 00:00:00 2001 From: Allison Ryan Date: Sun, 8 May 2022 12:28:11 -0500 Subject: [PATCH] feat: add cow moo sound --- lib/game/behaviors/behaviors.dart | 1 + .../behaviors/cow_bumper_noise_behavior.dart | 13 ++++ .../android_acres/android_acres.dart | 2 +- packages/pinball_audio/assets/sfx/cow_moo.mp3 | Bin 0 -> 52751 bytes .../pinball_audio/lib/gen/assets.gen.dart | 1 + .../pinball_audio/lib/src/pinball_audio.dart | 63 ++++++++++++++---- packages/pinball_audio/pubspec.yaml | 1 + .../test/src/pinball_audio_test.dart | 43 ++++++++++++ .../behaviors/bumper_noise_behavior_test.dart | 4 +- .../cow_bumper_noise_behavior_test.dart | 58 ++++++++++++++++ .../android_acres/android_acres_test.dart | 29 ++++++-- 11 files changed, 193 insertions(+), 22 deletions(-) create mode 100644 lib/game/behaviors/cow_bumper_noise_behavior.dart create mode 100644 packages/pinball_audio/assets/sfx/cow_moo.mp3 create mode 100644 test/game/behaviors/cow_bumper_noise_behavior_test.dart diff --git a/lib/game/behaviors/behaviors.dart b/lib/game/behaviors/behaviors.dart index 5900f2b3..a89b38ce 100644 --- a/lib/game/behaviors/behaviors.dart +++ b/lib/game/behaviors/behaviors.dart @@ -4,4 +4,5 @@ export 'bonus_ball_spawning_behavior.dart'; export 'bonus_noise_behavior.dart'; export 'bumper_noise_behavior.dart'; export 'camera_focusing_behavior.dart'; +export 'cow_bumper_noise_behavior.dart'; export 'scoring_behavior.dart'; diff --git a/lib/game/behaviors/cow_bumper_noise_behavior.dart b/lib/game/behaviors/cow_bumper_noise_behavior.dart new file mode 100644 index 00000000..14ad1307 --- /dev/null +++ b/lib/game/behaviors/cow_bumper_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 CowBumperNoiseBehavior extends ContactBehavior { + @override + void beginContact(Object other, Contact contact) { + super.beginContact(other, contact); + readProvider().play(PinballAudio.cowMoo); + } +} diff --git a/lib/game/components/android_acres/android_acres.dart b/lib/game/components/android_acres/android_acres.dart index 902eb11c..cfaf7c7a 100644 --- a/lib/game/components/android_acres/android_acres.dart +++ b/lib/game/components/android_acres/android_acres.dart @@ -47,7 +47,7 @@ class AndroidAcres extends Component { AndroidBumper.cow( children: [ ScoringContactBehavior(points: Points.twentyThousand), - BumperNoiseBehavior(), + CowBumperNoiseBehavior(), ], )..initialPosition = Vector2(-20.7, -13), AndroidSpaceshipBonusBehavior(), diff --git a/packages/pinball_audio/assets/sfx/cow_moo.mp3 b/packages/pinball_audio/assets/sfx/cow_moo.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..ce69e941f2bdcbc8bf759b37b187feea395f063c GIT binary patch literal 52751 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

H3$9BGXOhf`z9s_T~@Fa zc0vRul*Tk^wH3HfOc<=X^-a9fRd0<~%uJgoM0a(Q zSzLv$hA3_5+F$swfn~Ew{|$-p`4YGJ)r|O(_=STiyRC*JpHIcEie;Wae{|EL_!o^Y zZL}9aM+-1WO&IuE1K3fmM5h>B)rR~Yq*ztB}jTY^5uPxPD|KdH`HA>0{~wceAk`FGDm`55w-_TXOF zdPBF#VGFg#3&vXC8&;T_AbAfbVRV!`2Vw3^gil`T7uzu+FFycNpXYEmEMJ6huby0EaJLI&U`e$vJPyMLrkJRzg{iy1HXAEB%dn$Q;E-Ux|h;xKfOx*32+P*k2)DzfCI}c^ev6ll~h$!%Kl&f3my0m D= 'assets/sfx/android.mp3'; String get bumperA => 'assets/sfx/bumper_a.mp3'; String get bumperB => 'assets/sfx/bumper_b.mp3'; + String get cowMoo => 'assets/sfx/cow_moo.mp3'; String get dash => 'assets/sfx/dash.mp3'; String get dino => 'assets/sfx/dino.mp3'; String get gameOverVoiceOver => 'assets/sfx/game_over_voice_over.mp3'; diff --git a/packages/pinball_audio/lib/src/pinball_audio.dart b/packages/pinball_audio/lib/src/pinball_audio.dart index 1756d965..e8b9c8ed 100644 --- a/packages/pinball_audio/lib/src/pinball_audio.dart +++ b/packages/pinball_audio/lib/src/pinball_audio.dart @@ -1,32 +1,36 @@ import 'dart:math'; import 'package:audioplayers/audioplayers.dart'; +import 'package:clock/clock.dart'; import 'package:flame_audio/audio_pool.dart'; import 'package:flame_audio/flame_audio.dart'; import 'package:flutter/material.dart'; import 'package:pinball_audio/gen/assets.gen.dart'; -/// Sounds available for play +/// Sounds available to play. enum PinballAudio { - /// Google + /// Google. google, - /// Bumper + /// Bumper. bumper, - /// Background music + /// Cow moo. + cowMoo, + + /// Background music. backgroundMusic, - /// IO Pinball voice over + /// IO Pinball voice over. ioPinballVoiceOver, - /// Game over + /// Game over. gameOverVoiceOver, - /// Launcher + /// Launcher. launcher, - /// Sparky + /// Sparky. sparky, /// Android @@ -145,8 +149,37 @@ class _BumperAudio extends _Audio { } } +class _ThrottledAudio extends _Audio { + _ThrottledAudio({ + required this.preCacheSingleAudio, + required this.playSingleAudio, + required this.path, + required this.duration, + }); + + final PreCacheSingleAudio preCacheSingleAudio; + final PlaySingleAudio playSingleAudio; + final String path; + final Duration duration; + + DateTime? _lastPlayed; + + @override + Future load() => preCacheSingleAudio(prefixFile(path)); + + @override + void play() { + final now = clock.now(); + if (_lastPlayed == null || + (_lastPlayed != null && now.difference(_lastPlayed!) > duration)) { + _lastPlayed = now; + playSingleAudio(prefixFile(path)); + } + } +} + /// {@template pinball_audio_player} -/// Sound manager for the pinball game +/// Sound manager for the pinball game. /// {@endtemplate} class PinballAudioPlayer { /// {@macro pinball_audio_player} @@ -212,6 +245,12 @@ class PinballAudioPlayer { createAudioPool: _createAudioPool, seed: _seed, ), + PinballAudio.cowMoo: _ThrottledAudio( + preCacheSingleAudio: _preCacheSingleAudio, + playSingleAudio: _playSingleAudio, + path: Assets.sfx.cowMoo, + duration: const Duration(seconds: 2), + ), PinballAudio.backgroundMusic: _LoopAudio( preCacheSingleAudio: _preCacheSingleAudio, loopSingleAudio: _loopSingleAudio, @@ -232,19 +271,19 @@ class PinballAudioPlayer { final Random _seed; - /// Registered audios on the Player + /// Registered audios on the Player. @visibleForTesting // ignore: library_private_types_in_public_api late final Map audios; - /// Loads the sounds effects into the memory + /// Loads the sounds effects into the memory. List> load() { _configureAudioCache(FlameAudio.audioCache); return audios.values.map((a) => a.load()).toList(); } - /// Plays the received audio + /// Plays the received audio. void play(PinballAudio audio) { assert( audios.containsKey(audio), diff --git a/packages/pinball_audio/pubspec.yaml b/packages/pinball_audio/pubspec.yaml index 74713dfa..8c99d1fc 100644 --- a/packages/pinball_audio/pubspec.yaml +++ b/packages/pinball_audio/pubspec.yaml @@ -8,6 +8,7 @@ environment: dependencies: audioplayers: ^0.20.1 + clock: ^1.1.0 flame_audio: ^1.0.1 flutter: sdk: flutter diff --git a/packages/pinball_audio/test/src/pinball_audio_test.dart b/packages/pinball_audio/test/src/pinball_audio_test.dart index 8374e820..d1ff6f06 100644 --- a/packages/pinball_audio/test/src/pinball_audio_test.dart +++ b/packages/pinball_audio/test/src/pinball_audio_test.dart @@ -2,6 +2,7 @@ import 'dart:math'; import 'package:audioplayers/audioplayers.dart'; +import 'package:clock/clock.dart'; import 'package:flame_audio/audio_pool.dart'; import 'package:flame_audio/flame_audio.dart'; import 'package:flutter_test/flutter_test.dart'; @@ -43,6 +44,8 @@ class _MockPreCacheSingleAudio extends Mock implements _PreCacheSingleAudio {} class _MockRandom extends Mock implements Random {} +class _MockClock extends Mock implements Clock {} + void main() { group('PinballAudio', () { late _MockCreateAudioPool createAudioPool; @@ -171,6 +174,10 @@ void main() { () => preCacheSingleAudio .onCall('packages/pinball_audio/assets/sfx/launcher.mp3'), ).called(1); + verify( + () => preCacheSingleAudio + .onCall('packages/pinball_audio/assets/sfx/cow_moo.mp3'), + ).called(1); verify( () => preCacheSingleAudio .onCall('packages/pinball_audio/assets/music/background.mp3'), @@ -227,6 +234,42 @@ void main() { }); }); + group('cow moo', () { + test('plays the correct file', () async { + await Future.wait(audioPlayer.load()); + audioPlayer.play(PinballAudio.cowMoo); + + verify( + () => playSingleAudio + .onCall('packages/pinball_audio/${Assets.sfx.cowMoo}'), + ).called(1); + }); + + test('only plays the sound again after 2 seconds', () async { + final clock = _MockClock(); + await withClock(clock, () async { + when(clock.now).thenReturn(DateTime(2022)); + await Future.wait(audioPlayer.load()); + audioPlayer + ..play(PinballAudio.cowMoo) + ..play(PinballAudio.cowMoo); + + verify( + () => playSingleAudio + .onCall('packages/pinball_audio/${Assets.sfx.cowMoo}'), + ).called(1); + + when(clock.now).thenReturn(DateTime(2022, 1, 1, 1, 2)); + audioPlayer.play(PinballAudio.cowMoo); + + verify( + () => playSingleAudio + .onCall('packages/pinball_audio/${Assets.sfx.cowMoo}'), + ).called(1); + }); + }); + }); + group('google', () { test('plays the correct file', () async { await Future.wait(audioPlayer.load()); diff --git a/test/game/behaviors/bumper_noise_behavior_test.dart b/test/game/behaviors/bumper_noise_behavior_test.dart index 636da6ad..a9581d73 100644 --- a/test/game/behaviors/bumper_noise_behavior_test.dart +++ b/test/game/behaviors/bumper_noise_behavior_test.dart @@ -16,9 +16,7 @@ class _TestGame extends Forge2DGame { return ensureAdd( FlameProvider.value( audioPlayer, - children: [ - child, - ], + children: [child], ), ); } diff --git a/test/game/behaviors/cow_bumper_noise_behavior_test.dart b/test/game/behaviors/cow_bumper_noise_behavior_test.dart new file mode 100644 index 00000000..27a62e0b --- /dev/null +++ b/test/game/behaviors/cow_bumper_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('CowBumperNoiseBehavior', () { + late PinballAudioPlayer audioPlayer; + final flameTester = FlameTester(_TestGame.new); + + setUp(() { + audioPlayer = _MockPinballAudioPlayer(); + }); + flameTester.testGameWidget( + 'plays cow moo sound on contact', + setUp: (game, _) async { + final behavior = CowBumperNoiseBehavior(); + final parent = _TestBodyComponent(); + await game.pump(parent, audioPlayer: audioPlayer); + await parent.ensureAdd(behavior); + behavior.beginContact(Object(), _MockContact()); + }, + verify: (_, __) async { + verify(() => audioPlayer.play(PinballAudio.cowMoo)).called(1); + }, + ); + }); +} diff --git a/test/game/components/android_acres/android_acres_test.dart b/test/game/components/android_acres/android_acres_test.dart index 5bf22da9..6015043f 100644 --- a/test/game/components/android_acres/android_acres_test.dart +++ b/test/game/components/android_acres/android_acres_test.dart @@ -4,7 +4,7 @@ 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:pinball/game/behaviors/bumper_noise_behavior.dart'; +import 'package:pinball/game/behaviors/behaviors.dart'; import 'package:pinball/game/components/android_acres/behaviors/behaviors.dart'; import 'package:pinball/game/game.dart'; import 'package:pinball_components/pinball_components.dart'; @@ -117,16 +117,33 @@ void main() { ); flameTester.test( - 'three AndroidBumpers with BumperNoiseBehavior', + 'two AndroidBumpers with BumperNoiseBehavior', (game) async { await game.pump(AndroidAcres()); final bumpers = game.descendants().whereType(); + var behaviorCount = 0; for (final bumper in bumpers) { - expect( - bumper.firstChild(), - isNotNull, - ); + if (bumper.firstChild() != null) { + behaviorCount++; + } } + + expect(behaviorCount, equals(2)); + }, + ); + + flameTester.test( + 'one AndroidBumper with CowBumperNoiseBehavior', + (game) async { + await game.pump(AndroidAcres()); + final bumpers = game.descendants().whereType(); + + expect( + bumpers.singleWhere( + (bumper) => bumper.firstChild() != null, + ), + isA(), + ); }, ); });