From 02f4dee3c6e549604188796ab85a9ae9abd175f2 Mon Sep 17 00:00:00 2001 From: RuiAlonso Date: Tue, 3 May 2022 19:19:42 +0200 Subject: [PATCH] refactor: modified ramp behaviors --- .../behaviors/ramp_bonus_behavior.dart | 67 +++--------------- .../behaviors/ramp_shot_behavior.dart | 70 ++++--------------- .../behavior/ramp_contact_behavior.dart | 4 +- .../behavior/ramp_contact_behavior_test.dart | 32 ++++----- 4 files changed, 42 insertions(+), 131 deletions(-) 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 ff049246..f81ed73a 100644 --- a/lib/game/components/android_acres/behaviors/ramp_bonus_behavior.dart +++ b/lib/game/components/android_acres/behaviors/ramp_bonus_behavior.dart @@ -1,6 +1,3 @@ -import 'dart:collection'; -import 'dart:math'; - import 'package:flame/components.dart'; import 'package:pinball/game/game.dart'; import 'package:pinball_components/pinball_components.dart'; @@ -19,65 +16,23 @@ class RampBonusBehavior extends Component _scorePosition = scorePosition, super(); - final int _oneMillionPointsTimes = 10; final Points _points; final Vector2 _scorePosition; - final Set _balls = HashSet(); - int _previousHits = 0; - @override void onMount() { super.onMount(); - final sensors = parent.children.whereType(); - - for (final sensor in sensors) { - sensor.bloc.stream.listen((state) { - switch (state.type) { - case RampSensorType.door: - return _handleOnDoor(state.ball!); - case RampSensorType.inside: - return _handleOnInside(state.ball!); - } - }); - } - } - - void _handleOnDoor(Ball ball) { - if (!_balls.contains(ball)) { - _balls.add(ball); - } - } - - void _handleOnInside(Ball ball) { - if (_balls.contains(ball)) { - _balls.remove(ball); - _previousHits++; - _shot(_previousHits); - } - } - - /// When a [Ball] shot the [SpaceshipRamp] it achieve improvements for the - /// current game, like multipliers or score. - void _shot(int currentHits) { - if (currentHits % _oneMillionPointsTimes == 0) { - gameRef.read().add(Scored(points: _points.value)); - gameRef.add( - ScoreComponent( - points: _points, - position: _getRandomPosition, - ), - ); - } - } - - Vector2 get _getRandomPosition { - final randomX = Random().nextInt(2); - final randomY = Random().nextInt(2); - final sign = randomX + randomY % 2; - - return _scorePosition + - Vector2(sign * randomX.toDouble(), sign * randomY.toDouble()); + parent.bloc.stream.listen((state) { + if (state.status == SpaceshipRampStatus.withBonus) { + gameRef.read().add(Scored(points: _points.value)); + gameRef.add( + ScoreComponent( + points: _points, + position: _scorePosition, + ), + ); + } + }); } } 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 faa61f12..8be7ddca 100644 --- a/lib/game/components/android_acres/behaviors/ramp_shot_behavior.dart +++ b/lib/game/components/android_acres/behaviors/ramp_shot_behavior.dart @@ -1,6 +1,3 @@ -import 'dart:collection'; -import 'dart:math'; - import 'package:flame/components.dart'; import 'package:pinball/game/game.dart'; import 'package:pinball_components/pinball_components.dart'; @@ -23,61 +20,24 @@ class RampShotBehavior extends Component final Points _points; final Vector2 _scorePosition; - final Set _balls = HashSet(); - @override void onMount() { super.onMount(); - final sensors = parent.children.whereType(); - - for (final sensor in sensors) { - sensor.bloc.stream.listen((state) { - switch (state.type) { - case RampSensorType.door: - _handleOnDoor(state.ball!); - break; - case RampSensorType.inside: - _handleOnInside(state.ball!); - break; - } - }); - } - } - - void _handleOnDoor(Ball ball) { - if (!_balls.contains(ball)) { - _balls.add(ball); - } - } - - void _handleOnInside(Ball ball) { - if (_balls.contains(ball)) { - _balls.remove(ball); - _shot(); - } - } - - void _shot() { - parent.progress(); - - gameRef.read() - ..add(const MultiplierIncreased()) - ..add(Scored(points: _points.value)); - gameRef.add( - ScoreComponent( - points: _points, - position: _getRandomPosition, - ), - ); - } - - Vector2 get _getRandomPosition { - final randomX = Random().nextInt(3); - final randomY = Random().nextInt(3); - final sign = randomX + randomY % 2; - - return _scorePosition + - Vector2(sign * randomX.toDouble(), sign * randomY.toDouble()); + parent.bloc.stream.listen((state) { + if (state.shot) { + parent.progress(); + + gameRef.read() + ..add(const MultiplierIncreased()) + ..add(Scored(points: _points.value)); + gameRef.add( + ScoreComponent( + points: _points, + position: _scorePosition, + ), + ); + } + }); } } diff --git a/packages/pinball_components/lib/src/components/spaceship_ramp/behavior/ramp_contact_behavior.dart b/packages/pinball_components/lib/src/components/spaceship_ramp/behavior/ramp_contact_behavior.dart index e7630de8..13c3de35 100644 --- a/packages/pinball_components/lib/src/components/spaceship_ramp/behavior/ramp_contact_behavior.dart +++ b/packages/pinball_components/lib/src/components/spaceship_ramp/behavior/ramp_contact_behavior.dart @@ -18,10 +18,10 @@ class RampContactBehavior extends ContactBehavior { if (other is! Ball) return; switch (parent.type) { case RampSensorType.door: - parent.bloc.onDoor(other); + parent.parent.bloc.onDoor(other); break; case RampSensorType.inside: - parent.bloc.onInside(other); + parent.parent.bloc.onInside(other); break; } } diff --git a/packages/pinball_components/test/src/components/spaceship_ramp/behavior/ramp_contact_behavior_test.dart b/packages/pinball_components/test/src/components/spaceship_ramp/behavior/ramp_contact_behavior_test.dart index edc7160f..3c3013ef 100644 --- a/packages/pinball_components/test/src/components/spaceship_ramp/behavior/ramp_contact_behavior_test.dart +++ b/packages/pinball_components/test/src/components/spaceship_ramp/behavior/ramp_contact_behavior_test.dart @@ -11,9 +11,9 @@ import 'package:pinball_components/src/components/spaceship_ramp/behavior/behavi import '../../../../helpers/helpers.dart'; -class MockContact extends Mock implements Contact {} +class _MockSpaceshipRampCubit extends Mock implements SpaceshipRampCubit {} -class MockRampSensorCubit extends Mock implements RampSensorCubit {} +class _MockContact extends Mock implements Contact {} void main() { TestWidgetsFlutterBinding.ensureInitialized(); @@ -47,27 +47,25 @@ void main() { (game) async { final ball = Ball(baseColor: Colors.red); final behavior = RampContactBehavior(); - final bloc = MockRampSensorCubit(); + final bloc = _MockSpaceshipRampCubit(); whenListen( bloc, - const Stream.empty(), - initialState: RampSensorState( - type: RampSensorType.door, - ball: ball, - ), + const Stream.empty(), + initialState: SpaceshipRampState.initial(), ); final rampSensor = RampSensor.test( type: RampSensorType.door, + ); + final spaceshipRamp = SpaceshipRamp.test( bloc: bloc, ); - final spaceshipRamp = SpaceshipRamp(); await spaceshipRamp.add(rampSensor); await game.ensureAddAll([spaceshipRamp, ball]); await rampSensor.add(behavior); - behavior.beginContact(ball, MockContact()); + behavior.beginContact(ball, _MockContact()); verify(() => bloc.onDoor(ball)).called(1); }, @@ -78,27 +76,25 @@ void main() { (game) async { final ball = Ball(baseColor: Colors.red); final behavior = RampContactBehavior(); - final bloc = MockRampSensorCubit(); + final bloc = _MockSpaceshipRampCubit(); whenListen( bloc, - const Stream.empty(), - initialState: RampSensorState( - type: RampSensorType.inside, - ball: ball, - ), + const Stream.empty(), + initialState: SpaceshipRampState.initial(), ); final rampSensor = RampSensor.test( type: RampSensorType.inside, + ); + final spaceshipRamp = SpaceshipRamp.test( bloc: bloc, ); - final spaceshipRamp = SpaceshipRamp(); await spaceshipRamp.add(rampSensor); await game.ensureAddAll([spaceshipRamp, ball]); await rampSensor.add(behavior); - behavior.beginContact(ball, MockContact()); + behavior.beginContact(ball, _MockContact()); verify(() => bloc.onInside(ball)).called(1); },