From 1bedef5124d019f6a22fcdeb92337d0daa7676e7 Mon Sep 17 00:00:00 2001 From: RuiAlonso Date: Fri, 29 Apr 2022 11:15:02 +0200 Subject: [PATCH] refactor: blinking multiball lights --- .../behaviors/multiballs_behavior.dart | 27 ++++++++-- .../multiball_blinking_behavior.dart | 51 +++++++++---------- 2 files changed, 46 insertions(+), 32 deletions(-) diff --git a/lib/game/components/multiballs/behaviors/multiballs_behavior.dart b/lib/game/components/multiballs/behaviors/multiballs_behavior.dart index 3dac5496..f68f4bbd 100644 --- a/lib/game/components/multiballs/behaviors/multiballs_behavior.dart +++ b/lib/game/components/multiballs/behaviors/multiballs_behavior.dart @@ -10,13 +10,30 @@ class MultiballsBehavior extends Component void onMount() { super.onMount(); + int _previousMultiballBonus = 0; + gameRef.read().stream.listen((state) { - final hasMultiball = state.bonusHistory.contains(GameBonus.dashNest); + // TODO(ruimiguel): only when state.bonusHistory dashNest has changed + var multiballBonus = state.bonusHistory.fold( + 0, + (previousValue, bonus) { + if (bonus == GameBonus.dashNest) { + previousValue++; + } + return previousValue; + }, + ); + + if (_previousMultiballBonus != multiballBonus) { + _previousMultiballBonus = multiballBonus; + + final hasMultiball = state.bonusHistory.contains(GameBonus.dashNest); - if (hasMultiball) { - parent.children.whereType().forEach((multiball) { - multiball.bloc.onAnimate(); - }); + if (hasMultiball) { + parent.children.whereType().forEach((multiball) { + multiball.bloc.onAnimate(); + }); + } } }); } diff --git a/packages/pinball_components/lib/src/components/multiball/behaviors/multiball_blinking_behavior.dart b/packages/pinball_components/lib/src/components/multiball/behaviors/multiball_blinking_behavior.dart index 5adcff35..e32c04f9 100644 --- a/packages/pinball_components/lib/src/components/multiball/behaviors/multiball_blinking_behavior.dart +++ b/packages/pinball_components/lib/src/components/multiball/behaviors/multiball_blinking_behavior.dart @@ -6,50 +6,47 @@ import 'package:pinball_flame/pinball_flame.dart'; /// Makes a [Multiball] blink back to [MultiballLightState.lit] when /// [MultiballLightState.dimmed]. /// {@endtemplate} -class MultiballBlinkingBehavior extends TimerComponent - with ParentIsA { +class MultiballBlinkingBehavior extends Component with ParentIsA { /// {@macro multiball_blinking_behavior} - MultiballBlinkingBehavior() : super(period: 0.5); + MultiballBlinkingBehavior() : super(); - final _maxBlinks = 5; - int _blinkCounter = 0; + final _maxBlinks = 10; + bool _isAnimating = false; void _onNewState(MultiballState state) { if (state.animationState == MultiballAnimationState.animated) { _animate(); - if (!timer.isRunning()) { - timer - ..reset() - ..start(); - } } else { - timer.stop(); - parent.bloc.onStop(); + _stop(); } } - void _animate() { - if (_blinkCounter <= _maxBlinks) { - _blinkCounter++; - print("onBlink"); - parent.bloc.onBlink(); + void _animate() async { + if (!_isAnimating) { + _isAnimating = true; + for (var i = 0; i < 5; i++) { + parent.bloc.onBlink(); + await Future.delayed( + const Duration(milliseconds: 100), + ); + parent.bloc.onBlink(); + await Future.delayed( + const Duration(milliseconds: 100), + ); + } } else { - print("onStop"); - parent.bloc.onStop(); + _stop(); } } + void _stop() { + _isAnimating = false; + parent.bloc.onStop(); + } + @override Future onLoad() async { await super.onLoad(); parent.bloc.stream.listen(_onNewState); } - - @override - void onTick() { - super.onTick(); - timer - ..reset() - ..start(); - } }