feat: flipper sfx

pull/449/head
Erick Zanardo 3 years ago
parent 5e8ac20d37
commit 6d0ea6c7fc

@ -20,6 +20,7 @@ class $AssetsSfxGen {
String get cowMoo => 'assets/sfx/cow_moo.mp3'; String get cowMoo => 'assets/sfx/cow_moo.mp3';
String get dash => 'assets/sfx/dash.mp3'; String get dash => 'assets/sfx/dash.mp3';
String get dino => 'assets/sfx/dino.mp3'; String get dino => 'assets/sfx/dino.mp3';
String get flipper => 'assets/sfx/flipper.mp3';
String get gameOverVoiceOver => 'assets/sfx/game_over_voice_over.mp3'; String get gameOverVoiceOver => 'assets/sfx/game_over_voice_over.mp3';
String get google => 'assets/sfx/google.mp3'; String get google => 'assets/sfx/google.mp3';
String get ioPinballVoiceOver => 'assets/sfx/io_pinball_voice_over.mp3'; String get ioPinballVoiceOver => 'assets/sfx/io_pinball_voice_over.mp3';

@ -39,14 +39,17 @@ enum PinballAudio {
/// Sparky. /// Sparky.
sparky, sparky,
/// Android /// Android.
android, android,
/// Dino /// Dino.
dino, dino,
/// Dash /// Dash.
dash, dash,
/// Flipper.
flipper,
} }
/// Defines the contract of the creation of an [AudioPool]. /// Defines the contract of the creation of an [AudioPool].
@ -147,6 +150,33 @@ class _SingleLoopAudio extends _LoopAudio {
} }
} }
class _SingleAudioPoll extends _Audio {
_SingleAudioPoll({
required this.path,
required this.createAudioPool,
required this.maxPlayers,
});
final String path;
final CreateAudioPool createAudioPool;
final int maxPlayers;
late AudioPool pool;
@override
Future<void> load() async {
pool = await createAudioPool(
prefixFile(path),
maxPlayers: maxPlayers,
prefix: '',
);
}
@override
void play() {
pool.start();
}
}
class _RandomABAudio extends _Audio { class _RandomABAudio extends _Audio {
_RandomABAudio({ _RandomABAudio({
required this.createAudioPool, required this.createAudioPool,
@ -277,6 +307,11 @@ class PinballAudioPlayer {
path: Assets.sfx.rollover, path: Assets.sfx.rollover,
volume: 0.3, volume: 0.3,
), ),
PinballAudio.flipper: _SingleAudioPoll(
path: Assets.sfx.flipper,
createAudioPool: _createAudioPool,
maxPlayers: 2,
),
PinballAudio.ioPinballVoiceOver: _SimplePlayAudio( PinballAudio.ioPinballVoiceOver: _SimplePlayAudio(
preCacheSingleAudio: _preCacheSingleAudio, preCacheSingleAudio: _preCacheSingleAudio,
playSingleAudio: _playSingleAudio, playSingleAudio: _playSingleAudio,

@ -145,6 +145,20 @@ void main() {
).called(1); ).called(1);
}); });
test('creates the flipper pool', () async {
await Future.wait(
audioPlayer.load().map((loadableBuilder) => loadableBuilder()),
);
verify(
() => createAudioPool.onCall(
'packages/pinball_audio/${Assets.sfx.flipper}',
maxPlayers: 2,
prefix: '',
),
).called(1);
});
test('configures the audio cache instance', () async { test('configures the audio cache instance', () async {
await Future.wait( await Future.wait(
audioPlayer.load().map((loadableBuilder) => loadableBuilder()), audioPlayer.load().map((loadableBuilder) => loadableBuilder()),
@ -327,6 +341,33 @@ void main() {
}); });
}); });
group('flipper', () {
late AudioPool pool;
setUp(() {
pool = _MockAudioPool();
when(() => pool.start(volume: any(named: 'volume')))
.thenAnswer((_) async => () {});
when(
() => createAudioPool.onCall(
'packages/pinball_audio/${Assets.sfx.flipper}',
maxPlayers: any(named: 'maxPlayers'),
prefix: any(named: 'prefix'),
),
).thenAnswer((_) async => pool);
});
test('plays the bumper A sound pool', () async {
when(seed.nextBool).thenReturn(true);
await Future.wait(
audioPlayer.load().map((loadableBuilder) => loadableBuilder()),
);
audioPlayer.play(PinballAudio.flipper);
verify(() => pool.start()).called(1);
});
});
group('cow moo', () { group('cow moo', () {
test('plays the correct file', () async { test('plays the correct file', () async {
await Future.wait( await Future.wait(

@ -1,6 +1,8 @@
import 'package:flame/components.dart'; import 'package:flame/components.dart';
import 'package:flame_bloc/flame_bloc.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_components/pinball_components.dart';
import 'package:pinball_flame/pinball_flame.dart';
class FlipperMovingBehavior extends Component class FlipperMovingBehavior extends Component
with with
@ -15,7 +17,9 @@ class FlipperMovingBehavior extends Component
late final Flipper _flipper; late final Flipper _flipper;
void _moveUp() => _flipper.body.linearVelocity = Vector2(0, -_strength); void _moveUp() {
_flipper.body.linearVelocity = Vector2(0, -_strength);
}
void _moveDown() => _flipper.body.linearVelocity = Vector2(0, _strength); void _moveDown() => _flipper.body.linearVelocity = Vector2(0, _strength);
@ -23,6 +27,9 @@ class FlipperMovingBehavior extends Component
void onNewState(FlipperState state) { void onNewState(FlipperState state) {
super.onNewState(state); super.onNewState(state);
if (bloc.state.isMovingDown) _moveDown(); if (bloc.state.isMovingDown) _moveDown();
if (bloc.state.isMovingUp) {
readProvider<PinballAudioPlayer>().play(PinballAudio.flipper);
}
} }
@override @override

@ -8,15 +8,25 @@ import 'package:flame_forge2d/flame_forge2d.dart';
import 'package:flame_test/flame_test.dart'; import 'package:flame_test/flame_test.dart';
import 'package:flutter_test/flutter_test.dart'; import 'package:flutter_test/flutter_test.dart';
import 'package:mocktail/mocktail.dart'; import 'package:mocktail/mocktail.dart';
import 'package:pinball_audio/pinball_audio.dart';
import 'package:pinball_components/pinball_components.dart'; import 'package:pinball_components/pinball_components.dart';
import 'package:pinball_flame/pinball_flame.dart';
class _TestGame extends Forge2DGame { class _TestGame extends Forge2DGame {
Future<void> pump( Future<void> pump(
FlipperMovingBehavior behavior, { FlipperMovingBehavior behavior, {
FlipperCubit? flipperBloc, FlipperCubit? flipperBloc,
PinballAudioPlayer? audioPlayer,
}) async { }) async {
final flipper = Flipper.test(side: BoardSide.left); final flipper = Flipper.test(side: BoardSide.left);
await ensureAdd(flipper); await ensureAdd(
FlameProvider<PinballAudioPlayer>.value(
audioPlayer ?? _MockPinballAudioPlayer(),
children: [
flipper,
],
),
);
await flipper.ensureAdd( await flipper.ensureAdd(
FlameBlocProvider<FlipperCubit, FlipperState>.value( FlameBlocProvider<FlipperCubit, FlipperState>.value(
value: flipperBloc ?? FlipperCubit(), value: flipperBloc ?? FlipperCubit(),
@ -26,6 +36,8 @@ class _TestGame extends Forge2DGame {
} }
} }
class _MockPinballAudioPlayer extends Mock implements PinballAudioPlayer {}
class _MockFlipperCubit extends Mock implements FlipperCubit {} class _MockFlipperCubit extends Mock implements FlipperCubit {}
void main() { void main() {
@ -97,5 +109,30 @@ void main() {
expect(flipper.body.linearVelocity.y, -strength); expect(flipper.body.linearVelocity.y, -strength);
}, },
); );
flameTester.test(
'play 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);
},
);
}); });
} }

Loading…
Cancel
Save