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 25f0b9b6..61b30815 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,15 +6,20 @@ import 'package:pinball_flame/pinball_flame.dart'; /// Makes a [Multiball] blink back to [MultiballLightState.lit] when /// [MultiballLightState.dimmed]. /// {@endtemplate} -class MultiballBlinkingBehavior extends Component with ParentIsA { +class MultiballBlinkingBehavior extends TimerComponent + with ParentIsA { /// {@macro multiball_blinking_behavior} - MultiballBlinkingBehavior() : super(); + MultiballBlinkingBehavior() : super(period: 0.01); final _maxBlinks = 10; + int _blinksCounter = 0; bool _isAnimating = false; void _onNewState(MultiballState state) { - if (state.animationState == MultiballAnimationState.animated) { + final animationEnabled = + state.animationState == MultiballAnimationState.animated; + final canBlink = _blinksCounter < _maxBlinks; + if (animationEnabled && canBlink) { _animate(); } else { _stop(); @@ -24,28 +29,36 @@ class MultiballBlinkingBehavior extends Component with ParentIsA { Future _animate() async { if (!_isAnimating) { _isAnimating = true; - for (var i = 0; i < _maxBlinks; i++) { - parent.bloc.onBlink(); - await Future.delayed( - const Duration(milliseconds: 100), - ); - parent.bloc.onBlink(); - await Future.delayed( - const Duration(milliseconds: 100), - ); - } - _stop(); + parent.bloc.onBlink(); + _blinksCounter++; } } void _stop() { - _isAnimating = false; - parent.bloc.onStop(); + if (_isAnimating) { + _isAnimating = false; + timer.stop(); + _blinksCounter = 0; + parent.bloc.onStop(); + } } @override Future onLoad() async { await super.onLoad(); + timer.stop(); parent.bloc.stream.listen(_onNewState); } + + @override + void onTick() { + super.onTick(); + if (_isAnimating) { + timer + ..reset() + ..start(); + } else { + timer.stop(); + } + } } diff --git a/packages/pinball_components/test/src/components/multiball/behaviors/multiball_blinking_behavior_test.dart b/packages/pinball_components/test/src/components/multiball/behaviors/multiball_blinking_behavior_test.dart index e40b4655..9d09658b 100644 --- a/packages/pinball_components/test/src/components/multiball/behaviors/multiball_blinking_behavior_test.dart +++ b/packages/pinball_components/test/src/components/multiball/behaviors/multiball_blinking_behavior_test.dart @@ -86,37 +86,6 @@ void main() { verify(bloc.onStop).called(1); }, ); - - flameTester.testGameWidget( - 'stops animation after 2 seconds', - setUp: (game, tester) async { - final behavior = MultiballBlinkingBehavior(); - final bloc = MockMultiballCubit(); - final streamController = StreamController(); - whenListen( - bloc, - streamController.stream, - initialState: MultiballState.initial(), - ); - when(bloc.onBlink).thenAnswer((_) async {}); - - final multiball = Multiball.test(bloc: bloc); - await multiball.add(behavior); - await game.ensureAdd(multiball); - - streamController.add( - MultiballState( - animationState: MultiballAnimationState.animated, - lightState: MultiballLightState.lit, - ), - ); - await tester.pump(); - game.update(2); - - await streamController.close(); - verify(bloc.onStop).called(1); - }, - ); }, ); }