refactor: modified ramp behaviors

pull/296/head
RuiAlonso 3 years ago
parent 96cc57b233
commit 02f4dee3c6

@ -1,6 +1,3 @@
import 'dart:collection';
import 'dart:math';
import 'package:flame/components.dart'; import 'package:flame/components.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';
@ -19,65 +16,23 @@ class RampBonusBehavior extends Component
_scorePosition = scorePosition, _scorePosition = scorePosition,
super(); super();
final int _oneMillionPointsTimes = 10;
final Points _points; final Points _points;
final Vector2 _scorePosition; final Vector2 _scorePosition;
final Set<Ball> _balls = HashSet();
int _previousHits = 0;
@override @override
void onMount() { void onMount() {
super.onMount(); super.onMount();
final sensors = parent.children.whereType<RampSensor>(); parent.bloc.stream.listen((state) {
if (state.status == SpaceshipRampStatus.withBonus) {
for (final sensor in sensors) { gameRef.read<GameBloc>().add(Scored(points: _points.value));
sensor.bloc.stream.listen((state) { gameRef.add(
switch (state.type) { ScoreComponent(
case RampSensorType.door: points: _points,
return _handleOnDoor(state.ball!); position: _scorePosition,
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<GameBloc>().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());
} }
} }

@ -1,6 +1,3 @@
import 'dart:collection';
import 'dart:math';
import 'package:flame/components.dart'; import 'package:flame/components.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';
@ -23,61 +20,24 @@ class RampShotBehavior extends Component
final Points _points; final Points _points;
final Vector2 _scorePosition; final Vector2 _scorePosition;
final Set<Ball> _balls = HashSet();
@override @override
void onMount() { void onMount() {
super.onMount(); super.onMount();
final sensors = parent.children.whereType<RampSensor>(); parent.bloc.stream.listen((state) {
if (state.shot) {
for (final sensor in sensors) { parent.progress();
sensor.bloc.stream.listen((state) {
switch (state.type) { gameRef.read<GameBloc>()
case RampSensorType.door: ..add(const MultiplierIncreased())
_handleOnDoor(state.ball!); ..add(Scored(points: _points.value));
break; gameRef.add(
case RampSensorType.inside: ScoreComponent(
_handleOnInside(state.ball!); points: _points,
break; position: _scorePosition,
} ),
}); );
} }
} });
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<GameBloc>()
..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());
} }
} }

@ -18,10 +18,10 @@ class RampContactBehavior extends ContactBehavior<RampSensor> {
if (other is! Ball) return; if (other is! Ball) return;
switch (parent.type) { switch (parent.type) {
case RampSensorType.door: case RampSensorType.door:
parent.bloc.onDoor(other); parent.parent.bloc.onDoor(other);
break; break;
case RampSensorType.inside: case RampSensorType.inside:
parent.bloc.onInside(other); parent.parent.bloc.onInside(other);
break; break;
} }
} }

@ -11,9 +11,9 @@ import 'package:pinball_components/src/components/spaceship_ramp/behavior/behavi
import '../../../../helpers/helpers.dart'; 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() { void main() {
TestWidgetsFlutterBinding.ensureInitialized(); TestWidgetsFlutterBinding.ensureInitialized();
@ -47,27 +47,25 @@ void main() {
(game) async { (game) async {
final ball = Ball(baseColor: Colors.red); final ball = Ball(baseColor: Colors.red);
final behavior = RampContactBehavior(); final behavior = RampContactBehavior();
final bloc = MockRampSensorCubit(); final bloc = _MockSpaceshipRampCubit();
whenListen( whenListen(
bloc, bloc,
const Stream<RampSensorState>.empty(), const Stream<SpaceshipRampState>.empty(),
initialState: RampSensorState( initialState: SpaceshipRampState.initial(),
type: RampSensorType.door,
ball: ball,
),
); );
final rampSensor = RampSensor.test( final rampSensor = RampSensor.test(
type: RampSensorType.door, type: RampSensorType.door,
);
final spaceshipRamp = SpaceshipRamp.test(
bloc: bloc, bloc: bloc,
); );
final spaceshipRamp = SpaceshipRamp();
await spaceshipRamp.add(rampSensor); await spaceshipRamp.add(rampSensor);
await game.ensureAddAll([spaceshipRamp, ball]); await game.ensureAddAll([spaceshipRamp, ball]);
await rampSensor.add(behavior); await rampSensor.add(behavior);
behavior.beginContact(ball, MockContact()); behavior.beginContact(ball, _MockContact());
verify(() => bloc.onDoor(ball)).called(1); verify(() => bloc.onDoor(ball)).called(1);
}, },
@ -78,27 +76,25 @@ void main() {
(game) async { (game) async {
final ball = Ball(baseColor: Colors.red); final ball = Ball(baseColor: Colors.red);
final behavior = RampContactBehavior(); final behavior = RampContactBehavior();
final bloc = MockRampSensorCubit(); final bloc = _MockSpaceshipRampCubit();
whenListen( whenListen(
bloc, bloc,
const Stream<RampSensorState>.empty(), const Stream<SpaceshipRampState>.empty(),
initialState: RampSensorState( initialState: SpaceshipRampState.initial(),
type: RampSensorType.inside,
ball: ball,
),
); );
final rampSensor = RampSensor.test( final rampSensor = RampSensor.test(
type: RampSensorType.inside, type: RampSensorType.inside,
);
final spaceshipRamp = SpaceshipRamp.test(
bloc: bloc, bloc: bloc,
); );
final spaceshipRamp = SpaceshipRamp();
await spaceshipRamp.add(rampSensor); await spaceshipRamp.add(rampSensor);
await game.ensureAddAll([spaceshipRamp, ball]); await game.ensureAddAll([spaceshipRamp, ball]);
await rampSensor.add(behavior); await rampSensor.add(behavior);
behavior.beginContact(ball, MockContact()); behavior.beginContact(ball, _MockContact());
verify(() => bloc.onInside(ball)).called(1); verify(() => bloc.onInside(ball)).called(1);
}, },

Loading…
Cancel
Save