diff --git a/packages/pinball_components/lib/src/components/android_animatronic.dart b/packages/pinball_components/lib/src/components/android_animatronic/android_animatronic.dart similarity index 83% rename from packages/pinball_components/lib/src/components/android_animatronic.dart rename to packages/pinball_components/lib/src/components/android_animatronic/android_animatronic.dart index 772d88c4..c78b387c 100644 --- a/packages/pinball_components/lib/src/components/android_animatronic.dart +++ b/packages/pinball_components/lib/src/components/android_animatronic/android_animatronic.dart @@ -1,6 +1,8 @@ import 'package:flame/components.dart'; import 'package:flame_forge2d/flame_forge2d.dart'; +import 'package:flutter/material.dart'; import 'package:pinball_components/pinball_components.dart'; +import 'package:pinball_components/src/components/android_animatronic/behaviors/behaviors.dart'; import 'package:pinball_flame/pinball_flame.dart'; /// {@template android_animatronic} @@ -13,6 +15,7 @@ class AndroidAnimatronic extends BodyComponent : super( children: [ _AndroidAnimatronicSpriteAnimationComponent(), + AndroidAnimatronicBallContactBehavior(), ...?children, ], renderBody: false, @@ -21,6 +24,13 @@ class AndroidAnimatronic extends BodyComponent zIndex = ZIndexes.androidHead; } + /// Creates an [AndroidAnimatronic] without any children. + /// + /// This can be used for testing [AndroidAnimatronic]'s behaviors in + /// isolation. + @visibleForTesting + AndroidAnimatronic.test(); + @override Body createBody() { final shape = EllipseShape( diff --git a/packages/pinball_components/lib/src/components/android_spaceship/behaviors/android_spaceship_entrance_ball_contact_behavior.dart.dart b/packages/pinball_components/lib/src/components/android_animatronic/behaviors/android_animatronic_ball_contact_behavior.dart.dart similarity index 58% rename from packages/pinball_components/lib/src/components/android_spaceship/behaviors/android_spaceship_entrance_ball_contact_behavior.dart.dart rename to packages/pinball_components/lib/src/components/android_animatronic/behaviors/android_animatronic_ball_contact_behavior.dart.dart index b577b7b3..6c74e21a 100644 --- a/packages/pinball_components/lib/src/components/android_spaceship/behaviors/android_spaceship_entrance_ball_contact_behavior.dart.dart +++ b/packages/pinball_components/lib/src/components/android_animatronic/behaviors/android_animatronic_ball_contact_behavior.dart.dart @@ -1,18 +1,15 @@ // ignore_for_file: public_member_api_docs -import 'package:flame_bloc/flame_bloc.dart'; import 'package:flame_forge2d/flame_forge2d.dart'; import 'package:pinball_components/pinball_components.dart'; import 'package:pinball_flame/pinball_flame.dart'; -class AndroidSpaceshipEntranceBallContactBehavior - extends ContactBehavior - with FlameBlocReader { +class AndroidAnimatronicBallContactBehavior + extends ContactBehavior { @override void beginContact(Object other, Contact contact) { super.beginContact(other, contact); if (other is! Ball) return; - - bloc.onBallEntered(); + readBloc().onBallContacted(); } } diff --git a/packages/pinball_components/lib/src/components/android_animatronic/behaviors/behaviors.dart b/packages/pinball_components/lib/src/components/android_animatronic/behaviors/behaviors.dart new file mode 100644 index 00000000..e85e749f --- /dev/null +++ b/packages/pinball_components/lib/src/components/android_animatronic/behaviors/behaviors.dart @@ -0,0 +1 @@ +export 'android_animatronic_ball_contact_behavior.dart.dart'; diff --git a/packages/pinball_components/lib/src/components/android_spaceship/android_spaceship.dart b/packages/pinball_components/lib/src/components/android_spaceship/android_spaceship.dart index 0fd4628d..d09ff1e4 100644 --- a/packages/pinball_components/lib/src/components/android_spaceship/android_spaceship.dart +++ b/packages/pinball_components/lib/src/components/android_spaceship/android_spaceship.dart @@ -5,7 +5,6 @@ import 'package:flame/components.dart'; import 'package:flame_forge2d/flame_forge2d.dart'; import 'package:flutter/material.dart'; import 'package:pinball_components/pinball_components.dart'; -import 'package:pinball_components/src/components/android_spaceship/behaviors/behaviors.dart'; import 'package:pinball_flame/pinball_flame.dart'; export 'cubit/android_spaceship_cubit.dart'; @@ -17,9 +16,6 @@ class AndroidSpaceship extends Component { _SpaceshipSaucer()..initialPosition = position, _SpaceshipSaucerSpriteAnimationComponent()..position = position, _LightBeamSpriteComponent()..position = position + Vector2(2.5, 5), - AndroidSpaceshipEntrance( - children: [AndroidSpaceshipEntranceBallContactBehavior()], - ), _SpaceshipHole( outsideLayer: Layer.spaceshipExitRail, outsidePriority: ZIndexes.ballOnSpaceshipRail, @@ -134,35 +130,6 @@ class _LightBeamSpriteComponent extends SpriteComponent } } -class AndroidSpaceshipEntrance extends BodyComponent - with ParentIsA, Layered { - AndroidSpaceshipEntrance({Iterable? children}) - : super( - children: children, - renderBody: false, - ) { - layer = Layer.spaceship; - } - - @override - Body createBody() { - final shape = PolygonShape() - ..setAsBox( - 2, - 0.1, - Vector2(-27.4, -37.2), - -0.12, - ); - final fixtureDef = FixtureDef( - shape, - isSensor: true, - ); - final bodyDef = BodyDef(); - - return world.createBody(bodyDef)..createFixture(fixtureDef); - } -} - class _SpaceshipHole extends LayerSensor { _SpaceshipHole({required Layer outsideLayer, required int outsidePriority}) : super( diff --git a/packages/pinball_components/lib/src/components/android_spaceship/behaviors/behaviors.dart b/packages/pinball_components/lib/src/components/android_spaceship/behaviors/behaviors.dart deleted file mode 100644 index cbf54e5d..00000000 --- a/packages/pinball_components/lib/src/components/android_spaceship/behaviors/behaviors.dart +++ /dev/null @@ -1 +0,0 @@ -export 'android_spaceship_entrance_ball_contact_behavior.dart.dart'; diff --git a/packages/pinball_components/lib/src/components/android_spaceship/cubit/android_spaceship_cubit.dart b/packages/pinball_components/lib/src/components/android_spaceship/cubit/android_spaceship_cubit.dart index 334c9cc3..5057d742 100644 --- a/packages/pinball_components/lib/src/components/android_spaceship/cubit/android_spaceship_cubit.dart +++ b/packages/pinball_components/lib/src/components/android_spaceship/cubit/android_spaceship_cubit.dart @@ -5,7 +5,7 @@ part 'android_spaceship_state.dart'; class AndroidSpaceshipCubit extends Cubit { AndroidSpaceshipCubit() : super(AndroidSpaceshipState.withoutBonus); - void onBallEntered() => emit(AndroidSpaceshipState.withBonus); + void onBallContacted() => emit(AndroidSpaceshipState.withBonus); void onBonusAwarded() => emit(AndroidSpaceshipState.withoutBonus); } diff --git a/packages/pinball_components/lib/src/components/components.dart b/packages/pinball_components/lib/src/components/components.dart index 8fd74268..63684921 100644 --- a/packages/pinball_components/lib/src/components/components.dart +++ b/packages/pinball_components/lib/src/components/components.dart @@ -1,4 +1,4 @@ -export 'android_animatronic.dart'; +export 'android_animatronic/android_animatronic.dart'; export 'android_bumper/android_bumper.dart'; export 'android_spaceship/android_spaceship.dart'; export 'arcade_background/arcade_background.dart'; diff --git a/packages/pinball_components/test/src/components/android_spaceship/behaviors/android_spaceship_entrance_ball_contact_behavior_test.dart b/packages/pinball_components/test/src/components/android_animatronic/behaviors/android_animatronic_ball_contact_behavior_test.dart similarity index 69% rename from packages/pinball_components/test/src/components/android_spaceship/behaviors/android_spaceship_entrance_ball_contact_behavior_test.dart rename to packages/pinball_components/test/src/components/android_animatronic/behaviors/android_animatronic_ball_contact_behavior_test.dart index 4b0f16ea..4d8bb675 100644 --- a/packages/pinball_components/test/src/components/android_spaceship/behaviors/android_spaceship_entrance_ball_contact_behavior_test.dart +++ b/packages/pinball_components/test/src/components/android_animatronic/behaviors/android_animatronic_ball_contact_behavior_test.dart @@ -7,7 +7,7 @@ import 'package:flame_test/flame_test.dart'; import 'package:flutter_test/flutter_test.dart'; import 'package:mocktail/mocktail.dart'; import 'package:pinball_components/pinball_components.dart'; -import 'package:pinball_components/src/components/android_spaceship/behaviors/behaviors.dart'; +import 'package:pinball_components/src/components/android_animatronic/behaviors/behaviors.dart'; import '../../../../helpers/helpers.dart'; @@ -23,19 +23,19 @@ void main() { final flameTester = FlameTester(TestGame.new); group( - 'AndroidSpaceshipEntranceBallContactBehavior', + 'AndroidAnimatronicBallContactBehavior', () { test('can be instantiated', () { expect( - AndroidSpaceshipEntranceBallContactBehavior(), - isA(), + AndroidAnimatronicBallContactBehavior(), + isA(), ); }); flameTester.test( - 'beginContact calls onBallEntered when entrance contacts with a ball', + 'beginContact calls onBallContacted when in contact with a ball', (game) async { - final behavior = AndroidSpaceshipEntranceBallContactBehavior(); + final behavior = AndroidAnimatronicBallContactBehavior(); final bloc = _MockAndroidSpaceshipCubit(); whenListen( bloc, @@ -43,20 +43,20 @@ void main() { initialState: AndroidSpaceshipState.withoutBonus, ); - final entrance = AndroidSpaceshipEntrance(); + final animatronic = AndroidAnimatronic.test(); final androidSpaceship = FlameBlocProvider.value( value: bloc, children: [ - AndroidSpaceship.test(children: [entrance]) + AndroidSpaceship.test(children: [animatronic]) ], ); - await entrance.add(behavior); + await animatronic.add(behavior); await game.ensureAdd(androidSpaceship); behavior.beginContact(_MockBall(), _MockContact()); - verify(bloc.onBallEntered).called(1); + verify(bloc.onBallContacted).called(1); }, ); }, diff --git a/packages/pinball_components/test/src/components/android_animatronic_test.dart b/packages/pinball_components/test/src/components/android_animatronic_test.dart index 65114778..55b564fe 100644 --- a/packages/pinball_components/test/src/components/android_animatronic_test.dart +++ b/packages/pinball_components/test/src/components/android_animatronic_test.dart @@ -4,6 +4,7 @@ import 'package:flame/components.dart'; import 'package:flame_test/flame_test.dart'; import 'package:flutter_test/flutter_test.dart'; import 'package:pinball_components/pinball_components.dart'; +import 'package:pinball_components/src/components/android_animatronic/behaviors/behaviors.dart'; import '../../helpers/helpers.dart'; @@ -58,13 +59,26 @@ void main() { }, ); - flameTester.test('adds new children', (game) async { - final component = Component(); - final androidAnimatronic = AndroidAnimatronic( - children: [component], - ); - await game.ensureAdd(androidAnimatronic); - expect(androidAnimatronic.children, contains(component)); + group('adds', () { + flameTester.test('new children', (game) async { + final component = Component(); + final androidAnimatronic = AndroidAnimatronic( + children: [component], + ); + await game.ensureAdd(androidAnimatronic); + expect(androidAnimatronic.children, contains(component)); + }); + + flameTester.test('a AndroidAnimatronicBallContactBehavior', (game) async { + final androidAnimatronic = AndroidAnimatronic(); + await game.ensureAdd(androidAnimatronic); + expect( + androidAnimatronic.children + .whereType() + .single, + isNotNull, + ); + }); }); }); } diff --git a/packages/pinball_components/test/src/components/android_spaceship/android_spaceship_test.dart b/packages/pinball_components/test/src/components/android_spaceship/android_spaceship_test.dart index 70edd32e..a282865c 100644 --- a/packages/pinball_components/test/src/components/android_spaceship/android_spaceship_test.dart +++ b/packages/pinball_components/test/src/components/android_spaceship/android_spaceship_test.dart @@ -6,7 +6,6 @@ import 'package:flame_test/flame_test.dart'; import 'package:flutter_test/flutter_test.dart'; import 'package:mocktail/mocktail.dart'; import 'package:pinball_components/pinball_components.dart'; -import 'package:pinball_components/src/components/android_spaceship/behaviors/behaviors.dart'; import 'package:pinball_flame/pinball_flame.dart'; import '../../../helpers/helpers.dart'; @@ -84,26 +83,5 @@ void main() { ); }, ); - - flameTester.test( - 'AndroidSpaceshipEntrance has an ' - 'AndroidSpaceshipEntranceBallContactBehavior', (game) async { - final androidSpaceship = AndroidSpaceship(position: Vector2.zero()); - final provider = - FlameBlocProvider.value( - value: bloc, - children: [androidSpaceship], - ); - await game.ensureAdd(provider); - - final androidSpaceshipEntrance = - androidSpaceship.firstChild(); - expect( - androidSpaceshipEntrance!.children - .whereType() - .single, - isNotNull, - ); - }); }); } diff --git a/packages/pinball_components/test/src/components/android_spaceship/cubit/android_spaceship_cubit_test.dart b/packages/pinball_components/test/src/components/android_spaceship/cubit/android_spaceship_cubit_test.dart index 47b763af..f7de3674 100644 --- a/packages/pinball_components/test/src/components/android_spaceship/cubit/android_spaceship_cubit_test.dart +++ b/packages/pinball_components/test/src/components/android_spaceship/cubit/android_spaceship_cubit_test.dart @@ -9,7 +9,7 @@ void main() { blocTest( 'onBallEntered emits withBonus', build: AndroidSpaceshipCubit.new, - act: (bloc) => bloc.onBallEntered(), + act: (bloc) => bloc.onBallContacted(), expect: () => [AndroidSpaceshipState.withBonus], );