From c3960df31a8061cd1686a594238913492f5b736d Mon Sep 17 00:00:00 2001 From: pgirald <79157806+pgirald@users.noreply.github.com> Date: Sat, 19 Nov 2022 16:12:05 -0500 Subject: [PATCH 1/2] fix: SpeedController advance() should execute after it's effect onStart() --- packages/flame/lib/src/effects/effect.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/flame/lib/src/effects/effect.dart b/packages/flame/lib/src/effects/effect.dart index 7d349f71764..645c0499bea 100644 --- a/packages/flame/lib/src/effects/effect.dart +++ b/packages/flame/lib/src/effects/effect.dart @@ -130,11 +130,11 @@ abstract class Effect extends Component { /// similar to `EffectController.advance`. @internal double advance(double dt) { - final remainingDt = controller.advance(dt); if (!_started && controller.started) { _started = true; onStart(); } + final remainingDt = controller.advance(dt); if (_started) { final progress = controller.progress; apply(progress); From eca9f64e92e1b245e4dd7c039854a420bd6bc056 Mon Sep 17 00:00:00 2001 From: Lukas Klingsbo Date: Tue, 22 Nov 2022 22:52:26 +0100 Subject: [PATCH 2/2] Add test --- .../test/effects/sequence_effect_test.dart | 39 +++++++++++-------- 1 file changed, 23 insertions(+), 16 deletions(-) diff --git a/packages/flame/test/effects/sequence_effect_test.dart b/packages/flame/test/effects/sequence_effect_test.dart index 61d5f598f2c..5d1aabfa1cf 100644 --- a/packages/flame/test/effects/sequence_effect_test.dart +++ b/packages/flame/test/effects/sequence_effect_test.dart @@ -2,16 +2,12 @@ import 'dart:math'; import 'package:flame/components.dart'; import 'package:flame/effects.dart'; -import 'package:flame/game.dart'; import 'package:flame_test/flame_test.dart'; import 'package:flutter_test/flutter_test.dart'; void main() { group('SequenceEffect', () { group('properties', () { - final game = FlameGame()..onGameResize(Vector2.all(1000)); - assert(game.isMounted); - test('simple', () { final effect = SequenceEffect([ MoveEffect.to(Vector2(10, 10), EffectController(duration: 3)), @@ -89,8 +85,7 @@ void main() { }); group('sequence progression', () { - test('simple sequence', () async { - final game = FlameGame()..onGameResize(Vector2.all(1000)); + testWithFlameGame('simple sequence', (game) async { final effect = SequenceEffect([ MoveEffect.by(Vector2(10, 0), EffectController(duration: 1)), MoveEffect.by(Vector2(0, 10), EffectController(duration: 2)), @@ -115,8 +110,7 @@ void main() { } }); - test('large step', () async { - final game = FlameGame()..onGameResize(Vector2.all(1000)); + testWithFlameGame('large step', (game) async { final effect = SequenceEffect([ MoveEffect.by(Vector2(10, 0), EffectController(duration: 1)), MoveEffect.by(Vector2(0, 10), EffectController(duration: 2)), @@ -131,8 +125,7 @@ void main() { expect(component.position, closeToVector(Vector2(30, 40))); }); - test('k-step sequence', () async { - final game = FlameGame()..onGameResize(Vector2.all(1000)); + testWithFlameGame('k-step sequence', (game) async { final effect = SequenceEffect( [ MoveEffect.by(Vector2(10, 0), EffectController(duration: 1)), @@ -157,8 +150,7 @@ void main() { expect(component.position, closeToVector(Vector2(50, 50))); }); - test('alternating sequence', () async { - final game = FlameGame()..onGameResize(Vector2.all(1000)); + testWithFlameGame('alternating sequence', (game) async { final effect = SequenceEffect( [ MoveEffect.by(Vector2(10, 0), EffectController(duration: 1)), @@ -186,10 +178,9 @@ void main() { expect(effect.controller.completed, true); }); - test('sequence of alternates', () async { + testWithFlameGame('sequence of alternates', (game) async { EffectController controller() => EffectController(duration: 1, alternate: true); - final game = FlameGame()..onGameResize(Vector2.all(1000)); final effect = SequenceEffect( [ MoveEffect.by(Vector2(1, 0), controller()), @@ -222,7 +213,24 @@ void main() { expect(effect.controller.completed, true); }); - test('sequence in sequence', () async { + testWithFlameGame('with SpeedEffectController', (game) async { + final effect = SequenceEffect([ + MoveEffect.to( + Vector2(10, 0), + EffectController(speed: 10.0), + ), + MoveEffect.by( + Vector2(10, 0), + EffectController(duration: 1.0), + ), + ]); + await game.ensureAdd(PositionComponent(children: [effect])); + game.update(0); + expect(effect.controller.duration, 2.0); + expect(effect.controller.completed, false); + }); + + testWithFlameGame('sequence in sequence', (game) async { EffectController duration(double t) => EffectController(duration: t); const dt = 0.01; const x0 = 0.0, y0 = 0.0; @@ -232,7 +240,6 @@ void main() { const x4 = 10.0, y4 = 30.0; const dx5 = 1.6, dy5 = 0.9; - final game = FlameGame()..onGameResize(Vector2.all(1000)); final effect = SequenceEffect( [ MoveEffect.by(Vector2(x1 - x0, y1 - y0), duration(1)),