From 03e1f33d3de1e0d6a16b1f11a7fe503ece9f5d24 Mon Sep 17 00:00:00 2001 From: Lukas Klingsbo Date: Tue, 25 Oct 2022 00:26:10 +0200 Subject: [PATCH] fix: RemoveEffect should work within SequenceEffect (#2110) Since the RemoveEffect was removing its parent and not its target it couldn't work within a SequenceEffect since it was just removing that effect instead. --- .../flame/lib/src/effects/remove_effect.dart | 7 +++---- .../test/effects/remove_effect_test.dart | 21 ++++++++++++++++++- 2 files changed, 23 insertions(+), 5 deletions(-) diff --git a/packages/flame/lib/src/effects/remove_effect.dart b/packages/flame/lib/src/effects/remove_effect.dart index 9ef166628..e455b5356 100644 --- a/packages/flame/lib/src/effects/remove_effect.dart +++ b/packages/flame/lib/src/effects/remove_effect.dart @@ -1,9 +1,8 @@ -import 'package:flame/src/effects/controllers/linear_effect_controller.dart'; -import 'package:flame/src/effects/effect.dart'; +import 'package:flame/effects.dart'; /// This simple effect, when attached to a component, will cause that component /// to be removed from the game tree after `delay` seconds. -class RemoveEffect extends Effect { +class RemoveEffect extends ComponentEffect { RemoveEffect({ double delay = 0.0, void Function()? onComplete, @@ -15,7 +14,7 @@ class RemoveEffect extends Effect { @override void apply(double progress) { if (progress == 1) { - parent?.removeFromParent(); + target.removeFromParent(); } } } diff --git a/packages/flame/test/effects/remove_effect_test.dart b/packages/flame/test/effects/remove_effect_test.dart index 33a55f733..e878a1978 100644 --- a/packages/flame/test/effects/remove_effect_test.dart +++ b/packages/flame/test/effects/remove_effect_test.dart @@ -1,6 +1,7 @@ import 'package:flame/components.dart'; +import 'package:flame/effects.dart'; import 'package:flame/game.dart'; -import 'package:flame/src/effects/remove_effect.dart'; +import 'package:flame_test/flame_test.dart'; import 'package:flutter_test/flutter_test.dart'; void main() { @@ -41,5 +42,23 @@ void main() { game.update(0); expect(game.children.length, 0); }); + + testWithFlameGame('as a part of a sequence', (game) async { + final component = PositionComponent(); + await game.ensureAdd(component); + component.add( + SequenceEffect([ + MoveByEffect(Vector2.all(10), EffectController(duration: 1)), + RemoveEffect(), + ]), + ); + game.update(0); + expect(game.children.length, 1); + game.update(0.5); + expect(game.children.length, 1); + game.update(1.0); // This completes the move effect + game.update(0); // This runs the remove effect + expect(game.children.length, 0); + }); }); }