From df7408728e0be2fe48e411bf3086462d0c695fa7 Mon Sep 17 00:00:00 2001 From: Erick Date: Thu, 5 May 2022 18:16:08 -0300 Subject: [PATCH] feat: adding `Plunger` sound effects (#324) * feat: adding launcher sfx * Apply suggestions from code review Co-authored-by: Alejandro Santiago * fix test Co-authored-by: Alejandro Santiago --- lib/game/components/controlled_plunger.dart | 24 ++++++ .../pinball_audio/assets/sfx/launcher.mp3 | Bin 0 -> 19726 bytes .../pinball_audio/lib/gen/assets.gen.dart | 2 + .../pinball_audio/lib/src/pinball_audio.dart | 8 ++ .../test/src/pinball_audio_test.dart | 16 ++++ .../components/controlled_plunger_test.dart | 77 ++++++++++++++---- 6 files changed, 113 insertions(+), 14 deletions(-) create mode 100644 packages/pinball_audio/assets/sfx/launcher.mp3 diff --git a/lib/game/components/controlled_plunger.dart b/lib/game/components/controlled_plunger.dart index 999fae5e..ac9cc19d 100644 --- a/lib/game/components/controlled_plunger.dart +++ b/lib/game/components/controlled_plunger.dart @@ -2,6 +2,7 @@ import 'package:flame/components.dart'; import 'package:flame_bloc/flame_bloc.dart'; import 'package:flutter/services.dart'; import 'package:pinball/game/game.dart'; +import 'package:pinball_audio/pinball_audio.dart'; import 'package:pinball_components/pinball_components.dart'; import 'package:pinball_flame/pinball_flame.dart'; @@ -14,6 +15,29 @@ class ControlledPlunger extends Plunger with Controls { : super(compressionDistance: compressionDistance) { controller = PlungerController(this); } + + @override + void release() { + super.release(); + + add(PlungerNoisyBehavior()); + } +} + +/// A behavior attached to the plunger when it launches the ball +/// which plays the related sound effects. +class PlungerNoisyBehavior extends Component with HasGameRef { + @override + Future onLoad() async { + await super.onLoad(); + gameRef.player.play(PinballAudio.launcher); + } + + @override + void update(double dt) { + super.update(dt); + removeFromParent(); + } } /// {@template plunger_controller} diff --git a/packages/pinball_audio/assets/sfx/launcher.mp3 b/packages/pinball_audio/assets/sfx/launcher.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..fde95720759eaf02bf4d8f30b2dbc8cb2b476d95 GIT binary patch literal 19726 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 a_LnP`Nn1h%HA7dy=OGZ&?xU>X9s&ULC0RBA 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 2bace523..916906c4 100644 --- a/packages/pinball_audio/lib/gen/assets.gen.dart +++ b/packages/pinball_audio/lib/gen/assets.gen.dart @@ -14,11 +14,13 @@ class $AssetsMusicGen { class $AssetsSfxGen { const $AssetsSfxGen(); + String get afterLaunch => 'assets/sfx/after_launch.mp3'; String get bumperA => 'assets/sfx/bumper_a.mp3'; String get bumperB => 'assets/sfx/bumper_b.mp3'; String get gameOverVoiceOver => 'assets/sfx/game_over_voice_over.mp3'; String get google => 'assets/sfx/google.mp3'; String get ioPinballVoiceOver => 'assets/sfx/io_pinball_voice_over.mp3'; + String get launcher => 'assets/sfx/launcher.mp3'; } class Assets { diff --git a/packages/pinball_audio/lib/src/pinball_audio.dart b/packages/pinball_audio/lib/src/pinball_audio.dart index dd3e8242..56289417 100644 --- a/packages/pinball_audio/lib/src/pinball_audio.dart +++ b/packages/pinball_audio/lib/src/pinball_audio.dart @@ -22,6 +22,9 @@ enum PinballAudio { /// Game over gameOverVoiceOver, + + /// Launcher + launcher, } /// Defines the contract of the creation of an [AudioPool]. @@ -158,6 +161,11 @@ class PinballPlayer { playSingleAudio: _playSingleAudio, path: Assets.sfx.google, ), + PinballAudio.launcher: _SimplePlayAudio( + preCacheSingleAudio: _preCacheSingleAudio, + playSingleAudio: _playSingleAudio, + path: Assets.sfx.launcher, + ), 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 b7760aa5..fdcd661b 100644 --- a/packages/pinball_audio/test/src/pinball_audio_test.dart +++ b/packages/pinball_audio/test/src/pinball_audio_test.dart @@ -151,6 +151,10 @@ void main() { 'packages/pinball_audio/assets/sfx/game_over_voice_over.mp3', ), ).called(1); + verify( + () => preCacheSingleAudio + .onCall('packages/pinball_audio/assets/sfx/launcher.mp3'), + ).called(1); verify( () => preCacheSingleAudio .onCall('packages/pinball_audio/assets/music/background.mp3'), @@ -219,6 +223,18 @@ void main() { }); }); + group('launcher', () { + test('plays the correct file', () async { + await Future.wait(player.load()); + player.play(PinballAudio.launcher); + + verify( + () => playSingleAudio + .onCall('packages/pinball_audio/${Assets.sfx.launcher}'), + ).called(1); + }); + }); + group('ioPinballVoiceOver', () { test('plays the correct file', () async { await Future.wait(player.load()); diff --git a/test/game/components/controlled_plunger_test.dart b/test/game/components/controlled_plunger_test.dart index f91b0c37..211cf82f 100644 --- a/test/game/components/controlled_plunger_test.dart +++ b/test/game/components/controlled_plunger_test.dart @@ -1,18 +1,25 @@ +// ignore_for_file: cascade_invocations + import 'dart:collection'; import 'package:bloc_test/bloc_test.dart'; -import 'package:flame_forge2d/flame_forge2d.dart'; +import 'package:flame/components.dart'; import 'package:flame_test/flame_test.dart'; import 'package:flutter/services.dart'; import 'package:flutter_test/flutter_test.dart'; import 'package:mocktail/mocktail.dart'; import 'package:pinball/game/game.dart'; +import 'package:pinball_audio/pinball_audio.dart'; import 'package:pinball_components/pinball_components.dart'; import '../../helpers/helpers.dart'; class _MockGameBloc extends Mock implements GameBloc {} +class _MockPinballPlayer extends Mock implements PinballPlayer {} + +class _MockPinballGame extends Mock implements PinballGame {} + void main() { TestWidgetsFlutterBinding.ensureInitialized(); final flameTester = FlameTester(EmptyPinballTestGame.new); @@ -20,15 +27,21 @@ void main() { group('PlungerController', () { late GameBloc gameBloc; - setUp(() { - gameBloc = _MockGameBloc(); - }); - final flameBlocTester = FlameBlocTester( gameBuilder: EmptyPinballTestGame.new, blocBuilder: () => gameBloc, ); + late Plunger plunger; + late PlungerController controller; + + setUp(() { + gameBloc = _MockGameBloc(); + plunger = ControlledPlunger(compressionDistance: 10); + controller = PlungerController(plunger); + plunger.add(controller); + }); + group('onKeyEvent', () { final downKeys = UnmodifiableListView([ LogicalKeyboardKey.arrowDown, @@ -36,15 +49,6 @@ void main() { LogicalKeyboardKey.keyS, ]); - late Plunger plunger; - late PlungerController controller; - - setUp(() { - plunger = Plunger(compressionDistance: 10); - controller = PlungerController(plunger); - plunger.add(controller); - }); - testRawKeyDownEvents(downKeys, (event) { flameTester.test( 'moves down ' @@ -129,5 +133,50 @@ void main() { ); }); }); + + flameTester.test( + 'adds the PlungerNoisyBehavior plunger is released', + (game) async { + await game.ensureAdd(plunger); + plunger.body.setTransform(Vector2(0, 1), 0); + plunger.release(); + + await game.ready(); + final count = + game.descendants().whereType().length; + expect(count, equals(1)); + }, + ); + }); + + group('PlungerNoisyBehavior', () { + late PinballGame game; + late PinballPlayer player; + late PlungerNoisyBehavior behavior; + + setUp(() { + game = _MockPinballGame(); + player = _MockPinballPlayer(); + + when(() => game.player).thenReturn(player); + behavior = PlungerNoisyBehavior(); + behavior.mockGameRef(game); + }); + + test('plays the correct sound on load', () async { + await behavior.onLoad(); + + verify(() => player.play(PinballAudio.launcher)).called(1); + }); + + test('is removed on the first update', () { + final parent = Component(); + parent.add(behavior); + parent.update(0); // Run a tick to ensure it is added + + behavior.update(0); // Run its own update where the removal happens + + expect(behavior.shouldRemove, isTrue); + }); }); }