feat: connect dino bonus

pull/301/head
Allison Ryan 3 years ago
parent 8c2982d5a9
commit 09b00a14a1

@ -4,7 +4,7 @@ export 'camera_controller.dart';
export 'controlled_ball.dart'; export 'controlled_ball.dart';
export 'controlled_flipper.dart'; export 'controlled_flipper.dart';
export 'controlled_plunger.dart'; export 'controlled_plunger.dart';
export 'dino_desert.dart'; export 'dino_desert/dino_desert.dart';
export 'drain.dart'; export 'drain.dart';
export 'flutter_forest/flutter_forest.dart'; export 'flutter_forest/flutter_forest.dart';
export 'game_flow_controller.dart'; export 'game_flow_controller.dart';

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

@ -0,0 +1,24 @@
import 'package:flame/components.dart';
import 'package:pinball/game/game.dart';
import 'package:pinball_components/pinball_components.dart';
import 'package:pinball_flame/pinball_flame.dart';
/// Adds a [GameBonus.dinoChomp] when a [Ball] is chomped by the [ChromeDino].
class ChromeDinoBonusBehavior extends Component
with HasGameRef<PinballGame>, ParentIsA<DinoDesert> {
@override
void onMount() {
super.onMount();
final chromeDino = parent.firstChild<ChromeDino>()!;
// TODO(alestiago): Refactor subscription management once the following is
// merged:
// https://github.com/flame-engine/flame/pull/1538
chromeDino.bloc.stream.listen((state) {
final listenWhen = state.status == ChromeDinoStatus.chomping;
if (!listenWhen) return;
gameRef.read<GameBloc>().add(const BonusActivated(GameBonus.dinoChomp));
});
}
}

@ -1,11 +1,13 @@
import 'package:flame/components.dart'; import 'package:flame/components.dart';
import 'package:flame_forge2d/flame_forge2d.dart'; import 'package:flame_forge2d/flame_forge2d.dart';
import 'package:flutter/material.dart';
import 'package:pinball/game/components/dino_desert/behaviors/behaviors.dart';
import 'package:pinball/game/game.dart'; import 'package:pinball/game/game.dart';
import 'package:pinball_components/pinball_components.dart'; import 'package:pinball_components/pinball_components.dart';
/// {@template dino_desert} /// {@template dino_desert}
/// Area located next to the [Launcher] containing the [ChromeDino] and /// Area located next to the [Launcher] containing the [ChromeDino],
/// [DinoWalls]. /// [DinoWalls], and the [Slingshots].
/// {@endtemplate} /// {@endtemplate}
class DinoDesert extends Component { class DinoDesert extends Component {
/// {@macro dino_desert} /// {@macro dino_desert}
@ -21,8 +23,15 @@ class DinoDesert extends Component {
_BarrierBehindDino(), _BarrierBehindDino(),
DinoWalls(), DinoWalls(),
Slingshots(), Slingshots(),
ChromeDinoBonusBehavior(),
], ],
); );
/// Creates [DinoDesert] without any children.
///
/// This can be used for testing [DinoDesert]'s behaviors in isolation.
@visibleForTesting
DinoDesert.test();
} }
class _BarrierBehindDino extends BodyComponent { class _BarrierBehindDino extends BodyComponent {

@ -14,7 +14,9 @@ class ChromeDinoChompingBehavior extends ContactBehavior<ChromeDino> {
super.beginContact(other, contact); super.beginContact(other, contact);
if (other is! Ball) return; if (other is! Ball) return;
if (parent.bloc.state.status != ChromeDinoStatus.chomping) {
other.firstChild<SpriteComponent>()!.setOpacity(0); other.firstChild<SpriteComponent>()!.setOpacity(0);
parent.bloc.onChomp(other); parent.bloc.onChomp(other);
} }
}
} }

@ -26,7 +26,8 @@ void main() {
}); });
flameTester.test( flameTester.test(
'beginContact sets ball sprite to be invisible and calls onChomp', 'beginContact sets ball sprite to be invisible and calls onChomp '
'when status is not chomping',
(game) async { (game) async {
final ball = Ball(baseColor: Colors.red); final ball = Ball(baseColor: Colors.red);
final behavior = ChromeDinoChompingBehavior(); final behavior = ChromeDinoChompingBehavior();

@ -0,0 +1,63 @@
// ignore_for_file: cascade_invocations
import 'package:bloc_test/bloc_test.dart';
import 'package:flame_test/flame_test.dart';
import 'package:flutter_test/flutter_test.dart';
import 'package:mocktail/mocktail.dart';
import 'package:pinball/game/components/dino_desert/behaviors/behaviors.dart';
import 'package:pinball/game/game.dart';
import 'package:pinball_components/pinball_components.dart';
import '../../../../helpers/helpers.dart';
void main() {
TestWidgetsFlutterBinding.ensureInitialized();
final assets = [
Assets.images.dino.animatronic.head.keyName,
Assets.images.dino.animatronic.mouth.keyName,
Assets.images.dino.topWall.keyName,
Assets.images.dino.bottomWall.keyName,
Assets.images.slingshot.upper.keyName,
Assets.images.slingshot.lower.keyName,
];
group('ChromeDinoBonusBehavior', () {
late GameBloc gameBloc;
setUp(() {
gameBloc = MockGameBloc();
whenListen(
gameBloc,
const Stream<GameState>.empty(),
initialState: const GameState.initial(),
);
});
final flameBlocTester = FlameBlocTester<PinballGame, GameBloc>(
gameBuilder: EmptyPinballTestGame.new,
blocBuilder: () => gameBloc,
assets: assets,
);
flameBlocTester.testGameWidget(
'adds GameBonus.dinoChomp to the game '
'when ChromeDinoStatus.chomping is emitted',
setUp: (game, tester) async {
final behavior = ChromeDinoBonusBehavior();
final parent = DinoDesert.test();
final chromeDino = ChromeDino();
await parent.add(chromeDino);
await game.ensureAdd(parent);
await parent.ensureAdd(behavior);
chromeDino.bloc.onChomp(MockBall());
await tester.pump();
verify(
() => gameBloc.add(const BonusActivated(GameBonus.dinoChomp)),
).called(1);
},
);
});
}

@ -2,10 +2,11 @@
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:pinball/game/components/dino_desert/behaviors/behaviors.dart';
import 'package:pinball/game/game.dart'; import 'package:pinball/game/game.dart';
import 'package:pinball_components/pinball_components.dart'; import 'package:pinball_components/pinball_components.dart';
import '../../helpers/helpers.dart'; import '../../../helpers/helpers.dart';
void main() { void main() {
TestWidgetsFlutterBinding.ensureInitialized(); TestWidgetsFlutterBinding.ensureInitialized();
@ -63,8 +64,9 @@ void main() {
); );
}); });
group('adds', () {
flameTester.test( flameTester.test(
'adds ScoringBehavior to ChromeDino', 'ScoringBehavior to ChromeDino',
(game) async { (game) async {
await game.ensureAdd(DinoDesert()); await game.ensureAdd(DinoDesert());
@ -75,5 +77,15 @@ void main() {
); );
}, },
); );
flameTester.test('a ChromeDinoBonusBehavior', (game) async {
final dinoDesert = DinoDesert();
await game.ensureAdd(dinoDesert);
expect(
dinoDesert.children.whereType<ChromeDinoBonusBehavior>().single,
isNotNull,
);
});
});
}); });
} }
Loading…
Cancel
Save