From 9615d6105fd58efcf1517ec9d01483df69b8fd01 Mon Sep 17 00:00:00 2001 From: Alejandro Santiago Date: Thu, 21 Apr 2022 14:45:16 +0100 Subject: [PATCH] feat: spawned ScoreText on Ball's position (#210) --- lib/game/components/components.dart | 1 - .../components/score_effect_controller.dart | 45 -------- lib/game/components/score_points.dart | 11 +- lib/game/pinball_game.dart | 1 - .../score_effect_controller_test.dart | 105 ------------------ test/game/components/score_points_test.dart | 29 ++++- 6 files changed, 37 insertions(+), 155 deletions(-) delete mode 100644 lib/game/components/score_effect_controller.dart delete mode 100644 test/game/components/score_effect_controller_test.dart diff --git a/lib/game/components/components.dart b/lib/game/components/components.dart index e05f9f00..fc914ebf 100644 --- a/lib/game/components/components.dart +++ b/lib/game/components/components.dart @@ -9,7 +9,6 @@ export 'flutter_forest.dart'; export 'game_flow_controller.dart'; export 'google_word.dart'; export 'launcher.dart'; -export 'score_effect_controller.dart'; export 'score_points.dart'; export 'sparky_fire_zone.dart'; export 'wall.dart'; diff --git a/lib/game/components/score_effect_controller.dart b/lib/game/components/score_effect_controller.dart deleted file mode 100644 index f4a185e1..00000000 --- a/lib/game/components/score_effect_controller.dart +++ /dev/null @@ -1,45 +0,0 @@ -import 'dart:math'; - -import 'package:flame/components.dart'; -import 'package:flame_bloc/flame_bloc.dart'; -import 'package:pinball/game/game.dart'; -import 'package:pinball_components/pinball_components.dart'; -import 'package:pinball_flame/pinball_flame.dart'; - -/// {@template score_effect_controller} -/// A [ComponentController] responsible for adding [ScoreText]s -/// on the game screen when the user earns points. -/// {@endtemplate} -class ScoreEffectController extends ComponentController - with BlocComponent { - /// {@macro score_effect_controller} - ScoreEffectController(PinballGame component) : super(component); - - int _lastScore = 0; - final _random = Random(); - - double _noise() { - return _random.nextDouble() * 5 * (_random.nextBool() ? -1 : 1); - } - - @override - bool listenWhen(GameState? previousState, GameState newState) { - return previousState?.score != newState.score; - } - - @override - void onNewState(GameState state) { - final newScore = state.score - _lastScore; - _lastScore = state.score; - - component.add( - ScoreText( - text: newScore.toString(), - position: Vector2( - _noise(), - _noise() + (BoardDimensions.bounds.topCenter.dy + 10), - ), - ), - ); - } -} diff --git a/lib/game/components/score_points.dart b/lib/game/components/score_points.dart index f0d6ec3a..8a76680d 100644 --- a/lib/game/components/score_points.dart +++ b/lib/game/components/score_points.dart @@ -30,11 +30,18 @@ class BallScorePointsCallback extends ContactCallback { @override void begin( - Ball _, + Ball ball, ScorePoints scorePoints, - Contact __, + Contact _, ) { _gameRef.read().add(Scored(points: scorePoints.points)); _gameRef.audio.score(); + + _gameRef.add( + ScoreText( + text: scorePoints.points.toString(), + position: ball.body.position, + ), + ); } } diff --git a/lib/game/pinball_game.dart b/lib/game/pinball_game.dart index f28a0bf6..7034cfe5 100644 --- a/lib/game/pinball_game.dart +++ b/lib/game/pinball_game.dart @@ -42,7 +42,6 @@ class PinballGame extends Forge2DGame Future onLoad() async { _addContactCallbacks(); - unawaited(add(ScoreEffectController(this))); unawaited(add(gameFlowController = GameFlowController(this))); unawaited(add(CameraController(this))); unawaited(add(Backboard.waiting(position: Vector2(0, -88)))); diff --git a/test/game/components/score_effect_controller_test.dart b/test/game/components/score_effect_controller_test.dart deleted file mode 100644 index b5c76dc6..00000000 --- a/test/game/components/score_effect_controller_test.dart +++ /dev/null @@ -1,105 +0,0 @@ -// ignore_for_file: cascade_invocations - -import 'package:flame/components.dart'; -import 'package:flutter_test/flutter_test.dart'; -import 'package:mocktail/mocktail.dart'; -import 'package:pinball/game/game.dart'; -import 'package:pinball_components/pinball_components.dart'; - -import '../../helpers/helpers.dart'; - -void main() { - group('ScoreEffectController', () { - late ScoreEffectController controller; - late PinballGame game; - - setUpAll(() { - registerFallbackValue(Component()); - }); - - setUp(() { - game = MockPinballGame(); - when(() => game.add(any())).thenAnswer((_) async {}); - - controller = ScoreEffectController(game); - }); - - group('listenWhen', () { - test('returns true when the user has earned points', () { - const previous = GameState.initial(); - const current = GameState( - score: 10, - balls: 3, - bonusHistory: [], - ); - expect(controller.listenWhen(previous, current), isTrue); - }); - - test( - 'returns true when the user has earned points and there was no ' - 'previous state', - () { - const current = GameState( - score: 10, - balls: 3, - bonusHistory: [], - ); - expect(controller.listenWhen(null, current), isTrue); - }, - ); - - test( - 'returns false when no points were earned', - () { - const current = GameState.initial(); - const previous = GameState.initial(); - expect(controller.listenWhen(previous, current), isFalse); - }, - ); - }); - - group('onNewState', () { - test( - 'adds a ScoreText with the correct score for the ' - 'first time', - () { - const state = GameState( - score: 10, - balls: 3, - bonusHistory: [], - ); - - controller.onNewState(state); - - final effect = - verify(() => game.add(captureAny())).captured.first as ScoreText; - - expect(effect.text, equals('10')); - }, - ); - - test('adds a ScoreTextEffect with the correct score', () { - controller.onNewState( - const GameState( - score: 10, - balls: 3, - bonusHistory: [], - ), - ); - - controller.onNewState( - const GameState( - score: 14, - balls: 3, - bonusHistory: [], - ), - ); - - final effect = - verify(() => game.add(captureAny())).captured.last as ScoreText; - - expect(effect.text, equals('4')); - }); - }); - }); -} diff --git a/test/game/components/score_points_test.dart b/test/game/components/score_points_test.dart index 8317f20c..dcd0ad82 100644 --- a/test/game/components/score_points_test.dart +++ b/test/game/components/score_points_test.dart @@ -28,9 +28,13 @@ void main() { setUp(() { game = MockPinballGame(); bloc = MockGameBloc(); - ball = MockBall(); audio = MockPinballAudio(); fakeScorePoints = FakeScorePoints(); + + ball = MockBall(); + final ballBody = MockBody(); + when(() => ball.body).thenReturn(ballBody); + when(() => ballBody.position).thenReturn(Vector2.all(4)); }); setUpAll(() { @@ -73,6 +77,29 @@ void main() { verify(audio.score).called(1); }, ); + + test( + "adds a ScoreText component at Ball's position", + () { + when(game.read).thenReturn(bloc); + when(() => game.audio).thenReturn(audio); + + BallScorePointsCallback(game).begin( + ball, + fakeScorePoints, + FakeContact(), + ); + + verify( + () => game.add( + ScoreText( + text: fakeScorePoints.points.toString(), + position: ball.body.position, + ), + ), + ).called(1); + }, + ); }); }); }