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: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<Ball> _balls = HashSet();
int _previousHits = 0;
@override
void onMount() {
super.onMount();
final sensors = parent.children.whereType<RampSensor>();
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) {
parent.bloc.stream.listen((state) {
if (state.status == SpaceshipRampStatus.withBonus) {
gameRef.read<GameBloc>().add(Scored(points: _points.value));
gameRef.add(
ScoreComponent(
points: _points,
position: _getRandomPosition,
position: _scorePosition,
),
);
}
}
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:pinball/game/game.dart';
import 'package:pinball_components/pinball_components.dart';
@ -23,42 +20,12 @@ class RampShotBehavior extends Component
final Points _points;
final Vector2 _scorePosition;
final Set<Ball> _balls = HashSet();
@override
void onMount() {
super.onMount();
final sensors = parent.children.whereType<RampSensor>();
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.bloc.stream.listen((state) {
if (state.shot) {
parent.progress();
gameRef.read<GameBloc>()
@ -67,17 +34,10 @@ class RampShotBehavior extends Component
gameRef.add(
ScoreComponent(
points: _points,
position: _getRandomPosition,
position: _scorePosition,
),
);
}
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;
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;
}
}

@ -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<RampSensorState>.empty(),
initialState: RampSensorState(
type: RampSensorType.door,
ball: ball,
),
const Stream<SpaceshipRampState>.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<RampSensorState>.empty(),
initialState: RampSensorState(
type: RampSensorType.inside,
ball: ball,
),
const Stream<SpaceshipRampState>.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);
},

Loading…
Cancel
Save