refactor: blinking multiball lights

pull/235/head
RuiAlonso 3 years ago
parent d1bbef31f1
commit 1bedef5124

@ -10,7 +10,23 @@ class MultiballsBehavior extends Component
void onMount() { void onMount() {
super.onMount(); super.onMount();
int _previousMultiballBonus = 0;
gameRef.read<GameBloc>().stream.listen((state) { gameRef.read<GameBloc>().stream.listen((state) {
// TODO(ruimiguel): only when state.bonusHistory dashNest has changed
var multiballBonus = state.bonusHistory.fold<int>(
0,
(previousValue, bonus) {
if (bonus == GameBonus.dashNest) {
previousValue++;
}
return previousValue;
},
);
if (_previousMultiballBonus != multiballBonus) {
_previousMultiballBonus = multiballBonus;
final hasMultiball = state.bonusHistory.contains(GameBonus.dashNest); final hasMultiball = state.bonusHistory.contains(GameBonus.dashNest);
if (hasMultiball) { if (hasMultiball) {
@ -18,6 +34,7 @@ class MultiballsBehavior extends Component
multiball.bloc.onAnimate(); multiball.bloc.onAnimate();
}); });
} }
}
}); });
} }
} }

@ -6,50 +6,47 @@ import 'package:pinball_flame/pinball_flame.dart';
/// Makes a [Multiball] blink back to [MultiballLightState.lit] when /// Makes a [Multiball] blink back to [MultiballLightState.lit] when
/// [MultiballLightState.dimmed]. /// [MultiballLightState.dimmed].
/// {@endtemplate} /// {@endtemplate}
class MultiballBlinkingBehavior extends TimerComponent class MultiballBlinkingBehavior extends Component with ParentIsA<Multiball> {
with ParentIsA<Multiball> {
/// {@macro multiball_blinking_behavior} /// {@macro multiball_blinking_behavior}
MultiballBlinkingBehavior() : super(period: 0.5); MultiballBlinkingBehavior() : super();
final _maxBlinks = 5; final _maxBlinks = 10;
int _blinkCounter = 0; bool _isAnimating = false;
void _onNewState(MultiballState state) { void _onNewState(MultiballState state) {
if (state.animationState == MultiballAnimationState.animated) { if (state.animationState == MultiballAnimationState.animated) {
_animate(); _animate();
if (!timer.isRunning()) {
timer
..reset()
..start();
}
} else { } else {
timer.stop(); _stop();
parent.bloc.onStop();
} }
} }
void _animate() { void _animate() async {
if (_blinkCounter <= _maxBlinks) { if (!_isAnimating) {
_blinkCounter++; _isAnimating = true;
print("onBlink"); for (var i = 0; i < 5; i++) {
parent.bloc.onBlink();
await Future<void>.delayed(
const Duration(milliseconds: 100),
);
parent.bloc.onBlink(); parent.bloc.onBlink();
await Future<void>.delayed(
const Duration(milliseconds: 100),
);
}
} else { } else {
print("onStop"); _stop();
parent.bloc.onStop();
} }
} }
void _stop() {
_isAnimating = false;
parent.bloc.onStop();
}
@override @override
Future<void> onLoad() async { Future<void> onLoad() async {
await super.onLoad(); await super.onLoad();
parent.bloc.stream.listen(_onNewState); parent.bloc.stream.listen(_onNewState);
} }
@override
void onTick() {
super.onTick();
timer
..reset()
..start();
}
} }

Loading…
Cancel
Save