fix: android bonus animation (#442)

pull/445/head
Allison Ryan 2 years ago committed by GitHub
parent 0d52fcd72a
commit 032618020e
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

@ -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(

@ -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<AndroidSpaceshipEntrance>
with FlameBlocReader<AndroidSpaceshipCubit, AndroidSpaceshipState> {
class AndroidAnimatronicBallContactBehavior
extends ContactBehavior<AndroidAnimatronic> {
@override
void beginContact(Object other, Contact contact) {
super.beginContact(other, contact);
if (other is! Ball) return;
bloc.onBallEntered();
readBloc<AndroidSpaceshipCubit, AndroidSpaceshipState>().onBallContacted();
}
}

@ -0,0 +1 @@
export 'android_animatronic_ball_contact_behavior.dart.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<AndroidSpaceship>, Layered {
AndroidSpaceshipEntrance({Iterable<Component>? 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(

@ -1 +0,0 @@
export 'android_spaceship_entrance_ball_contact_behavior.dart.dart';

@ -5,7 +5,7 @@ part 'android_spaceship_state.dart';
class AndroidSpaceshipCubit extends Cubit<AndroidSpaceshipState> {
AndroidSpaceshipCubit() : super(AndroidSpaceshipState.withoutBonus);
void onBallEntered() => emit(AndroidSpaceshipState.withBonus);
void onBallContacted() => emit(AndroidSpaceshipState.withBonus);
void onBonusAwarded() => emit(AndroidSpaceshipState.withoutBonus);
}

@ -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';

@ -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<AndroidSpaceshipEntranceBallContactBehavior>(),
AndroidAnimatronicBallContactBehavior(),
isA<AndroidAnimatronicBallContactBehavior>(),
);
});
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<AndroidSpaceshipCubit,
AndroidSpaceshipState>.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);
},
);
},

@ -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<AndroidAnimatronicBallContactBehavior>()
.single,
isNotNull,
);
});
});
});
}

@ -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<AndroidSpaceshipCubit, AndroidSpaceshipState>.value(
value: bloc,
children: [androidSpaceship],
);
await game.ensureAdd(provider);
final androidSpaceshipEntrance =
androidSpaceship.firstChild<AndroidSpaceshipEntrance>();
expect(
androidSpaceshipEntrance!.children
.whereType<AndroidSpaceshipEntranceBallContactBehavior>()
.single,
isNotNull,
);
});
});
}

@ -9,7 +9,7 @@ void main() {
blocTest<AndroidSpaceshipCubit, AndroidSpaceshipState>(
'onBallEntered emits withBonus',
build: AndroidSpaceshipCubit.new,
act: (bloc) => bloc.onBallEntered(),
act: (bloc) => bloc.onBallContacted(),
expect: () => [AndroidSpaceshipState.withBonus],
);

Loading…
Cancel
Save