From 081a22f69a10800f9a68e8b3e9fc722520e4b05d Mon Sep 17 00:00:00 2001 From: RuiAlonso Date: Mon, 2 May 2022 17:49:32 +0200 Subject: [PATCH] refactor: move ramp sensor to spaceship ramp children --- .../android_acres/android_acres.dart | 27 ++++++------ .../behaviors/ramp_bonus_behavior.dart | 19 ++++----- .../behaviors/ramp_shot_behavior.dart | 21 ++++------ .../spaceship_ramp/spaceship_ramp.dart | 12 +++++- .../behaviors/ramp_bonus_behavior_test.dart | 40 +++++++----------- .../behaviors/ramp_shot_behavior_test.dart | 41 ++++++++----------- 6 files changed, 68 insertions(+), 92 deletions(-) diff --git a/lib/game/components/android_acres/android_acres.dart b/lib/game/components/android_acres/android_acres.dart index d0dba30e..c056b28b 100644 --- a/lib/game/components/android_acres/android_acres.dart +++ b/lib/game/components/android_acres/android_acres.dart @@ -15,7 +15,18 @@ class AndroidAcres extends Component { AndroidAcres() : super( children: [ - SpaceshipRamp(), + SpaceshipRamp( + children: [ + RampShotBehavior( + points: Points.fiveThousand, + scorePosition: Vector2(0, -45), + ), + RampBonusBehavior( + points: Points.oneMillion, + scorePosition: Vector2(0, -60), + ), + ], + ), SpaceshipRail(), AndroidSpaceship(position: Vector2(-26.5, -28.5)), AndroidBumper.a( @@ -33,20 +44,6 @@ class AndroidAcres extends Component { ScoringBehavior(points: Points.twentyThousand), ], )..initialPosition = Vector2(-20.5, -13.8), - RampShotBehavior( - points: 5000, - scorePosition: Vector2(0, -45), - ), - RampBonusBehavior( - points: 1000000, - scorePosition: Vector2(0, -60), - ), ], ); - - /// Creates a [AndroidAcres] without any children. - /// - /// This can be used for testing [AndroidAcres]'s behaviors in isolation. - @visibleForTesting - AndroidAcres.test(); } diff --git a/lib/game/components/android_acres/behaviors/ramp_bonus_behavior.dart b/lib/game/components/android_acres/behaviors/ramp_bonus_behavior.dart index ffe49a85..2acb3c76 100644 --- a/lib/game/components/android_acres/behaviors/ramp_bonus_behavior.dart +++ b/lib/game/components/android_acres/behaviors/ramp_bonus_behavior.dart @@ -10,17 +10,17 @@ import 'package:pinball_flame/pinball_flame.dart'; /// When a [Ball] shot inside the [SpaceshipRamp] 10 times increases score. /// {@endtemplate} class RampBonusBehavior extends Component - with ParentIsA, HasGameRef { + with ParentIsA, HasGameRef { /// {@macro ramp_bonus_behavior} RampBonusBehavior({ - required int points, + required Points points, required Vector2 scorePosition, }) : _points = points, _scorePosition = scorePosition, super(); final int _oneMillionPointsTimes = 10; - final int _points; + final Points _points; final Vector2 _scorePosition; final Set _balls = HashSet(); @@ -30,12 +30,7 @@ class RampBonusBehavior extends Component void onMount() { super.onMount(); - final sensors = parent - .descendants() - .whereType() - .first - .descendants() - .whereType(); + final sensors = parent.descendants().whereType(); for (final sensor in sensors) { sensor.bloc.stream.listen((state) { @@ -69,10 +64,10 @@ class RampBonusBehavior extends Component /// current game, like multipliers or score. void _shot(int currentHits) { if (currentHits % _oneMillionPointsTimes == 0) { - gameRef.read().add(Scored(points: _points)); + gameRef.read().add(Scored(points: _points.value)); gameRef.add( - ScoreText( - text: _points.toString(), + ScoreComponent( + points: _points, position: _getRandomPosition, ), ); diff --git a/lib/game/components/android_acres/behaviors/ramp_shot_behavior.dart b/lib/game/components/android_acres/behaviors/ramp_shot_behavior.dart index 90f917ed..fc166caa 100644 --- a/lib/game/components/android_acres/behaviors/ramp_shot_behavior.dart +++ b/lib/game/components/android_acres/behaviors/ramp_shot_behavior.dart @@ -11,16 +11,16 @@ import 'package:pinball_flame/pinball_flame.dart'; /// the current game, like multipliers or score. /// {@endtemplate} class RampShotBehavior extends Component - with ParentIsA, HasGameRef { + with ParentIsA, HasGameRef { /// {@macro ramp_shot_behavior} RampShotBehavior({ - required int points, + required Points points, required Vector2 scorePosition, }) : _points = points, _scorePosition = scorePosition, super(); - final int _points; + final Points _points; final Vector2 _scorePosition; final Set _balls = HashSet(); @@ -29,12 +29,7 @@ class RampShotBehavior extends Component void onMount() { super.onMount(); - final sensors = parent - .descendants() - .whereType() - .first - .descendants() - .whereType(); + final sensors = parent.descendants().whereType(); for (final sensor in sensors) { sensor.bloc.stream.listen((state) { @@ -64,14 +59,14 @@ class RampShotBehavior extends Component } void _shot() { - parent.descendants().whereType().first.progress(); + parent.progress(); gameRef.read() ..add(const MultiplierIncreased()) - ..add(Scored(points: _points)); + ..add(Scored(points: _points.value)); gameRef.add( - ScoreText( - text: _points.toString(), + ScoreComponent( + points: _points, position: _getRandomPosition, ), ); diff --git a/packages/pinball_components/lib/src/components/spaceship_ramp/spaceship_ramp.dart b/packages/pinball_components/lib/src/components/spaceship_ramp/spaceship_ramp.dart index da419938..c64efae6 100644 --- a/packages/pinball_components/lib/src/components/spaceship_ramp/spaceship_ramp.dart +++ b/packages/pinball_components/lib/src/components/spaceship_ramp/spaceship_ramp.dart @@ -15,8 +15,9 @@ export 'cubit/ramp_sensor_cubit.dart'; /// {@endtemplate} class SpaceshipRamp extends Component { /// {@macro spaceship_ramp} - SpaceshipRamp() - : super( + SpaceshipRamp({ + Iterable? children, + }) : super( children: [ // TODO(ruimiguel): refactor RampSensor and RampOpening to be in // only one sensor. @@ -44,9 +45,16 @@ class SpaceshipRamp extends Component { _SpaceshipRampBase()..initialPosition = Vector2(1.7, -20), _SpaceshipRampBackgroundRailingSpriteComponent(), _SpaceshipRampArrowSpriteComponent(), + ...?children, ], ); + /// Creates a [SpaceshipRamp] without any children. + /// + /// This can be used for testing [SpaceshipRamp]'s behaviors in isolation. + @visibleForTesting + SpaceshipRamp.test(); + /// Forwards the sprite to the next [SpaceshipRampArrowSpriteState]. /// /// If the current state is the last one it cycles back to the initial state. diff --git a/test/game/components/android_acres/behaviors/ramp_bonus_behavior_test.dart b/test/game/components/android_acres/behaviors/ramp_bonus_behavior_test.dart index 750aa354..0a701257 100644 --- a/test/game/components/android_acres/behaviors/ramp_bonus_behavior_test.dart +++ b/test/game/components/android_acres/behaviors/ramp_bonus_behavior_test.dart @@ -7,7 +7,7 @@ import 'package:flame/components.dart'; import 'package:flame_test/flame_test.dart'; import 'package:flutter/material.dart'; import 'package:flutter_test/flutter_test.dart'; -import 'package:mockingjay/mockingjay.dart'; +import 'package:mocktail/mocktail.dart'; import 'package:pinball/game/components/android_acres/behaviors/behaviors.dart'; import 'package:pinball/game/game.dart'; import 'package:pinball_components/pinball_components.dart'; @@ -17,9 +17,6 @@ import '../../../../helpers/helpers.dart'; void main() { TestWidgetsFlutterBinding.ensureInitialized(); final assets = [ - Assets.images.android.spaceship.saucer.keyName, - Assets.images.android.spaceship.animatronic.keyName, - Assets.images.android.spaceship.lightBeam.keyName, Assets.images.android.ramp.boardOpening.keyName, Assets.images.android.ramp.railingForeground.keyName, Assets.images.android.ramp.railingBackground.keyName, @@ -32,16 +29,11 @@ void main() { Assets.images.android.ramp.arrow.active5.keyName, Assets.images.android.rail.main.keyName, Assets.images.android.rail.exit.keyName, - Assets.images.android.bumper.a.lit.keyName, - Assets.images.android.bumper.a.dimmed.keyName, - Assets.images.android.bumper.b.lit.keyName, - Assets.images.android.bumper.b.dimmed.keyName, - Assets.images.android.bumper.cow.lit.keyName, - Assets.images.android.bumper.cow.dimmed.keyName, + Assets.images.score.oneMillion.keyName, ]; group('RampBonusBehavior', () { - const bonusPoints = 1000000; + const bonusPoints = Points.oneMillion; late GameBloc gameBloc; @@ -68,7 +60,7 @@ void main() { points: bonusPoints, scorePosition: Vector2.zero(), ); - final parent = AndroidAcres.test(); + final parent = SpaceshipRamp.test(); final sensors = [ RampSensor.test( type: RampSensorType.door, @@ -85,10 +77,10 @@ void main() { } await tester.pump(); - final scores = game.descendants().whereType(); + final scores = game.descendants().whereType(); await game.ready(); - verifyNever(() => gameBloc.add(Scored(points: bonusPoints))); + verifyNever(() => gameBloc.add(Scored(points: bonusPoints.value))); expect(scores.length, 0); }, ); @@ -103,7 +95,7 @@ void main() { points: bonusPoints, scorePosition: Vector2.zero(), ); - final parent = AndroidAcres.test(); + final parent = SpaceshipRamp.test(); final doorSensor = RampSensor.test( type: RampSensorType.door, bloc: RampSensorCubit(), @@ -121,10 +113,10 @@ void main() { await tester.pump(); - final scores = game.descendants().whereType(); + final scores = game.descendants().whereType(); await game.ready(); - verifyNever(() => gameBloc.add(Scored(points: bonusPoints))); + verifyNever(() => gameBloc.add(Scored(points: bonusPoints.value))); expect(scores.length, 0); }, ); @@ -134,12 +126,11 @@ void main() { "less than 10 times doesn't add any score neither shows score points", setUp: (game, tester) async { final ball = Ball(baseColor: Colors.red); - const bonusPoints = 1000000; final behavior = RampBonusBehavior( points: bonusPoints, scorePosition: Vector2.zero(), ); - final parent = AndroidAcres.test(); + final parent = SpaceshipRamp.test(); final doorSensor = RampSensor.test( type: RampSensorType.door, bloc: RampSensorCubit(), @@ -158,10 +149,10 @@ void main() { await tester.pump(); - final scores = game.descendants().whereType(); + final scores = game.descendants().whereType(); await game.ready(); - verifyNever(() => gameBloc.add(Scored(points: bonusPoints))); + verifyNever(() => gameBloc.add(Scored(points: bonusPoints.value))); expect(scores.length, 0); }, ); @@ -171,12 +162,11 @@ void main() { '10 times add score and show score point', setUp: (game, tester) async { final ball = Ball(baseColor: Colors.red); - const bonusPoints = 1000000; final behavior = RampBonusBehavior( points: bonusPoints, scorePosition: Vector2.zero(), ); - final parent = AndroidAcres.test(); + final parent = SpaceshipRamp.test(); final doorSensor = RampSensor.test( type: RampSensorType.door, bloc: RampSensorCubit(), @@ -197,10 +187,10 @@ void main() { await tester.pump(); - final scores = game.descendants().whereType(); + final scores = game.descendants().whereType(); await game.ready(); - verify(() => gameBloc.add(Scored(points: bonusPoints))).called(1); + verify(() => gameBloc.add(Scored(points: bonusPoints.value))).called(1); expect(scores.length, 1); }, ); diff --git a/test/game/components/android_acres/behaviors/ramp_shot_behavior_test.dart b/test/game/components/android_acres/behaviors/ramp_shot_behavior_test.dart index 626fb3dd..55336264 100644 --- a/test/game/components/android_acres/behaviors/ramp_shot_behavior_test.dart +++ b/test/game/components/android_acres/behaviors/ramp_shot_behavior_test.dart @@ -7,7 +7,7 @@ import 'package:flame/components.dart'; import 'package:flame_test/flame_test.dart'; import 'package:flutter/material.dart'; import 'package:flutter_test/flutter_test.dart'; -import 'package:mockingjay/mockingjay.dart'; +import 'package:mocktail/mocktail.dart'; import 'package:pinball/game/components/android_acres/behaviors/behaviors.dart'; import 'package:pinball/game/game.dart'; import 'package:pinball_components/pinball_components.dart'; @@ -17,9 +17,6 @@ import '../../../../helpers/helpers.dart'; void main() { TestWidgetsFlutterBinding.ensureInitialized(); final assets = [ - Assets.images.android.spaceship.saucer.keyName, - Assets.images.android.spaceship.animatronic.keyName, - Assets.images.android.spaceship.lightBeam.keyName, Assets.images.android.ramp.boardOpening.keyName, Assets.images.android.ramp.railingForeground.keyName, Assets.images.android.ramp.railingBackground.keyName, @@ -32,15 +29,12 @@ void main() { Assets.images.android.ramp.arrow.active5.keyName, Assets.images.android.rail.main.keyName, Assets.images.android.rail.exit.keyName, - Assets.images.android.bumper.a.lit.keyName, - Assets.images.android.bumper.a.dimmed.keyName, - Assets.images.android.bumper.b.lit.keyName, - Assets.images.android.bumper.b.dimmed.keyName, - Assets.images.android.bumper.cow.lit.keyName, - Assets.images.android.bumper.cow.dimmed.keyName, + Assets.images.score.fiveThousand.keyName, ]; group('RampShotBehavior', () { + const shotPoints = Points.fiveThousand; + late GameBloc gameBloc; setUp(() { @@ -63,12 +57,11 @@ void main() { 'neither add any score or show any score points', setUp: (game, tester) async { final ball = Ball(baseColor: Colors.red); - const shotPoints = 5000; final behavior = RampShotBehavior( points: shotPoints, scorePosition: Vector2.zero(), ); - final parent = AndroidAcres.test(); + final parent = SpaceshipRamp.test(); final sensors = [ RampSensor.test( type: RampSensorType.door, @@ -85,11 +78,11 @@ void main() { } await tester.pump(); - final scores = game.descendants().whereType(); + final scores = game.descendants().whereType(); await game.ready(); verifyNever(() => gameBloc.add(MultiplierIncreased())); - verifyNever(() => gameBloc.add(Scored(points: shotPoints))); + verifyNever(() => gameBloc.add(Scored(points: shotPoints.value))); expect(scores.length, 0); }, ); @@ -99,12 +92,11 @@ void main() { "doesn't increase multiplier neither add any score or shows score points", setUp: (game, tester) async { final ball = Ball(baseColor: Colors.red); - const shotPoints = 5000; final behavior = RampShotBehavior( points: shotPoints, scorePosition: Vector2.zero(), ); - final parent = AndroidAcres.test(); + final parent = SpaceshipRamp.test(); final doorSensor = RampSensor.test( type: RampSensorType.door, bloc: RampSensorCubit(), @@ -122,11 +114,11 @@ void main() { await tester.pump(); - final scores = game.descendants().whereType(); + final scores = game.descendants().whereType(); await game.ready(); verifyNever(() => gameBloc.add(MultiplierIncreased())); - verifyNever(() => gameBloc.add(Scored(points: shotPoints))); + verifyNever(() => gameBloc.add(Scored(points: shotPoints.value))); expect(scores.length, 0); }, ); @@ -136,12 +128,11 @@ void main() { 'increase multiplier', setUp: (game, tester) async { final ball = Ball(baseColor: Colors.red); - const shotPoints = 5000; final behavior = RampShotBehavior( points: shotPoints, scorePosition: Vector2.zero(), ); - final parent = AndroidAcres.test(); + final parent = SpaceshipRamp.test(); final doorSensor = RampSensor.test( type: RampSensorType.door, bloc: RampSensorCubit(), @@ -155,10 +146,11 @@ void main() { await game.ensureAdd(parent); await parent.ensureAdd(behavior); - doorSensor.bloc.onDoor(ball); + insideSensor.bloc.onDoor(ball); insideSensor.bloc.onInside(ball); await tester.pump(); + await game.ready(); verify(() => gameBloc.add(MultiplierIncreased())).called(1); }, @@ -169,12 +161,11 @@ void main() { 'add score and show score points', setUp: (game, tester) async { final ball = Ball(baseColor: Colors.red); - const shotPoints = 5000; final behavior = RampShotBehavior( points: shotPoints, scorePosition: Vector2.zero(), ); - final parent = AndroidAcres.test(); + final parent = SpaceshipRamp.test(); final doorSensor = RampSensor.test( type: RampSensorType.door, bloc: RampSensorCubit(), @@ -193,10 +184,10 @@ void main() { await tester.pump(); - final scores = game.descendants().whereType(); + final scores = game.descendants().whereType(); await game.ready(); - verify(() => gameBloc.add(Scored(points: shotPoints))).called(1); + verify(() => gameBloc.add(Scored(points: shotPoints.value))).called(1); expect(scores.length, 1); }, );