diff --git a/doc/examples/effects/sequence_effect/lib/main.dart b/doc/examples/effects/sequence_effect/lib/main.dart index 58d4baa14..f1e5f9af1 100644 --- a/doc/examples/effects/sequence_effect/lib/main.dart +++ b/doc/examples/effects/sequence_effect/lib/main.dart @@ -73,14 +73,14 @@ class MyGame extends BaseGame with TapDetector { final combination = CombinedEffect( effects: [move2, rotate], isAlternating: false, - isInfinite: true, + isInfinite: false, ); final sequence = SequenceEffect( effects: [move1, scale, combination], - isInfinite: true, - isAlternating: false, + isInfinite: false, + isAlternating: true, ); - greenSquare.addEffect(combination); + greenSquare.addEffect(sequence); } } diff --git a/lib/effects/combined_effect.dart b/lib/effects/combined_effect.dart index c55d1e6bf..9913e5d53 100644 --- a/lib/effects/combined_effect.dart +++ b/lib/effects/combined_effect.dart @@ -96,6 +96,11 @@ class CombinedEffect extends PositionComponentEffect { } } + @override + bool hasFinished() { + return super.hasFinished() && effects.every((e) => e.hasFinished()); + } + void _maybeReverse(PositionComponentEffect effect) { if (isAlternating && !effect.isAlternating && effect.isMax()) { // Make the effect go in reverse diff --git a/lib/effects/effects.dart b/lib/effects/effects.dart index 2fc620a91..f7aae6497 100644 --- a/lib/effects/effects.dart +++ b/lib/effects/effects.dart @@ -51,7 +51,7 @@ abstract class ComponentEffect { if (isAlternating) { curveDirection = isMax() ? -1 : (isMin() ? 1 : curveDirection); } else if (isInfinite && isMax()) { - currentTime = 0.0; + reset(); } final driftMultiplier = (isAlternating && isMax() ? 2 : 1) * curveDirection; if (!hasFinished()) { diff --git a/lib/effects/sequence_effect.dart b/lib/effects/sequence_effect.dart index 66ed7c43a..4fa2ee247 100644 --- a/lib/effects/sequence_effect.dart +++ b/lib/effects/sequence_effect.dart @@ -20,6 +20,10 @@ class SequenceEffect extends PositionComponentEffect { effects.every((effect) => effect.component == null), "No effects can be added to components from the start", ); + assert( + effects.every((effect) => !effect.isInfinite), + "No effects added to the sequence can be infinite", + ); } @override @@ -63,9 +67,9 @@ class SequenceEffect extends PositionComponentEffect { _driftModifier = currentEffect.driftTime; _currentIndex++; final iterationSize = isAlternating ? effects.length * 2 : effects.length; - if (_currentIndex != 0 - && _currentIndex == iterationSize - && (currentEffect.isAlternating || + if (_currentIndex != 0 && + _currentIndex == iterationSize && + (currentEffect.isAlternating || currentEffect.isAlternating == isAlternating)) { isInfinite ? reset() : dispose(); return; @@ -92,10 +96,12 @@ class SequenceEffect extends PositionComponentEffect { @override void reset() { super.reset(); - component.position = originalPosition; - component.angle = originalAngle; - component.size = originalSize; - initialize(component); - //effects.forEach((e) => e.reset()); + effects.forEach((e) => e.reset()); + if (component != null) { + component.position = originalPosition; + component.angle = originalAngle; + component.size = originalSize; + initialize(component); + } } }