From aa8d49da9eb77c47d252ac3cc46d268eb10a2f20 Mon Sep 17 00:00:00 2001 From: DevKage <33748002+ufrshubham@users.noreply.github.com> Date: Sat, 15 Apr 2023 20:11:44 +0530 Subject: [PATCH] fix: Modify size only if changed while auto-resizing (#2498) Checks the size before modifying and skips if it hasn't changed. --- .../sprite_animation_component.dart | 12 ++++-- .../sprite_animation_group_component.dart | 12 ++++-- .../lib/src/components/sprite_component.dart | 12 ++++-- .../components/sprite_group_component.dart | 12 ++++-- .../sprite_animation_component_test.dart | 30 ++++++++++++++ ...sprite_animation_group_component_test.dart | 39 +++++++++++++++++++ .../components/sprite_component_test.dart | 19 +++++++++ .../sprite_group_component_test.dart | 22 +++++++++++ 8 files changed, 142 insertions(+), 16 deletions(-) diff --git a/packages/flame/lib/src/components/sprite_animation_component.dart b/packages/flame/lib/src/components/sprite_animation_component.dart index 6c10b7df3..276c7b722 100644 --- a/packages/flame/lib/src/components/sprite_animation_component.dart +++ b/packages/flame/lib/src/components/sprite_animation_component.dart @@ -139,11 +139,15 @@ class SpriteAnimationComponent extends PositionComponent void _resizeToSprite() { if (_autoResize) { _isAutoResizing = true; - if (_animation != null) { - size.setFrom(_animation!.getSprite().srcSize); - } else { - size.setZero(); + + final newX = _animation?.getSprite().srcSize.x ?? 0; + final newY = _animation?.getSprite().srcSize.y ?? 0; + + // Modify only if changed. + if (size.x != newX || size.y != newY) { + size.setValues(newX, newY); } + _isAutoResizing = false; } } diff --git a/packages/flame/lib/src/components/sprite_animation_group_component.dart b/packages/flame/lib/src/components/sprite_animation_group_component.dart index 4eda7bd35..8a6db97b1 100644 --- a/packages/flame/lib/src/components/sprite_animation_group_component.dart +++ b/packages/flame/lib/src/components/sprite_animation_group_component.dart @@ -168,11 +168,15 @@ class SpriteAnimationGroupComponent extends PositionComponent void _resizeToSprite() { if (_autoResize) { _isAutoResizing = true; - if (animation != null) { - size.setFrom(animation!.getSprite().srcSize); - } else { - size.setZero(); + + final newX = animation?.getSprite().srcSize.x ?? 0; + final newY = animation?.getSprite().srcSize.y ?? 0; + + // Modify only if changed. + if (size.x != newX || size.y != newY) { + size.setValues(newX, newY); } + _isAutoResizing = false; } } diff --git a/packages/flame/lib/src/components/sprite_component.dart b/packages/flame/lib/src/components/sprite_component.dart index 1e3624ffd..72f935d7f 100644 --- a/packages/flame/lib/src/components/sprite_component.dart +++ b/packages/flame/lib/src/components/sprite_component.dart @@ -128,11 +128,15 @@ class SpriteComponent extends PositionComponent void _resizeToSprite() { if (_autoResize) { _isAutoResizing = true; - if (_sprite != null) { - size.setFrom(_sprite!.srcSize); - } else { - size.setZero(); + + final newX = _sprite?.srcSize.x ?? 0; + final newY = _sprite?.srcSize.y ?? 0; + + // Modify only if changed. + if (size.x != newX || size.y != newY) { + size.setValues(newX, newY); } + _isAutoResizing = false; } } diff --git a/packages/flame/lib/src/components/sprite_group_component.dart b/packages/flame/lib/src/components/sprite_group_component.dart index bd92e8228..ee74da926 100644 --- a/packages/flame/lib/src/components/sprite_group_component.dart +++ b/packages/flame/lib/src/components/sprite_group_component.dart @@ -119,11 +119,15 @@ class SpriteGroupComponent extends PositionComponent void _resizeToSprite() { if (_autoResize) { _isAutoResizing = true; - if (sprite != null) { - size.setFrom(sprite!.srcSize); - } else { - size.setZero(); + + final newX = sprite?.srcSize.x ?? 0; + final newY = sprite?.srcSize.y ?? 0; + + // Modify only if changed. + if (size.x != newX || size.y != newY) { + size.setValues(newX, newY); } + _isAutoResizing = false; } } diff --git a/packages/flame/test/components/sprite_animation_component_test.dart b/packages/flame/test/components/sprite_animation_component_test.dart index 10b11064d..00a7d5886 100644 --- a/packages/flame/test/components/sprite_animation_component_test.dart +++ b/packages/flame/test/components/sprite_animation_component_test.dart @@ -360,5 +360,35 @@ Future main() async { expectDouble(component.size.x, testSize.x); expectDouble(component.size.y, testSize.y); }); + + test('modify size only if changed while auto-resizing', () { + final spriteList = [ + Sprite(image, srcSize: Vector2.all(1)), + Sprite(image, srcSize: Vector2.all(1)), + Sprite(image, srcSize: Vector2(2, 1)), + ]; + final animation = SpriteAnimation.spriteList(spriteList, stepTime: 1); + final component = SpriteAnimationComponent(animation: animation); + + var sizeChangeCounter = 0; + component.size.addListener(() => ++sizeChangeCounter); + + component.update(1); + expect(sizeChangeCounter, equals(0)); + + component.update(0.5); + expect(sizeChangeCounter, equals(0)); + + component.update(0.5); + expect(sizeChangeCounter, equals(1)); + + component.update(1); + expect(sizeChangeCounter, equals(2)); + + for (var i = 0; i < 15; ++i) { + component.update(1); + } + expect(sizeChangeCounter, equals(12)); + }); }); } diff --git a/packages/flame/test/components/sprite_animation_group_component_test.dart b/packages/flame/test/components/sprite_animation_group_component_test.dart index 6c04121cf..050aa8da8 100644 --- a/packages/flame/test/components/sprite_animation_group_component_test.dart +++ b/packages/flame/test/components/sprite_animation_group_component_test.dart @@ -308,5 +308,44 @@ Future main() async { expectDouble(component.size.x, testSize.x); expectDouble(component.size.y, testSize.y); }); + + test('modify size only if changed while auto-resizing', () { + final sprite1 = Sprite(image, srcSize: Vector2.all(76)); + final sprite2 = Sprite(image, srcSize: Vector2.all(15)); + final animation1 = SpriteAnimation.spriteList( + List.filled(5, sprite1), + stepTime: 1, + loop: false, + ); + final animation2 = SpriteAnimation.spriteList( + [sprite2, sprite1], + stepTime: 1, + ); + final animationsMap = { + _AnimationState.idle: animation1, + _AnimationState.running: animation2, + }; + final component = SpriteAnimationGroupComponent<_AnimationState>( + animations: animationsMap, + ); + + var sizeChangeCounter = 0; + component.size.addListener(() => ++sizeChangeCounter); + + component.current = _AnimationState.running; + expect(sizeChangeCounter, equals(1)); + + component.current = _AnimationState.idle; + expect(sizeChangeCounter, equals(2)); + + component.update(1); + expect(sizeChangeCounter, equals(2)); + + component.current = _AnimationState.running; + expect(sizeChangeCounter, equals(3)); + + component.update(1); + expect(sizeChangeCounter, equals(4)); + }); }); } diff --git a/packages/flame/test/components/sprite_component_test.dart b/packages/flame/test/components/sprite_component_test.dart index e9557b955..3b438de8e 100644 --- a/packages/flame/test/components/sprite_component_test.dart +++ b/packages/flame/test/components/sprite_component_test.dart @@ -94,5 +94,24 @@ Future main() async { expectDouble(component.size.x, testSize.x); expectDouble(component.size.y, testSize.y); }); + + test('modify size only if changed while auto-resizing', () { + final sprite1 = Sprite(image, srcSize: Vector2.all(13)); + final sprite2 = Sprite(image, srcSize: Vector2.all(13)); + final sprite3 = Sprite(image, srcSize: Vector2(13, 14)); + final component = SpriteComponent(); + + var sizeChangeCounter = 0; + component.size.addListener(() => ++sizeChangeCounter); + + component.sprite = sprite1; + expect(sizeChangeCounter, equals(1)); + + component.sprite = sprite2; + expect(sizeChangeCounter, equals(1)); + + component.sprite = sprite3; + expect(sizeChangeCounter, equals(2)); + }); }); } diff --git a/packages/flame/test/components/sprite_group_component_test.dart b/packages/flame/test/components/sprite_group_component_test.dart index 6b246782e..8a2432838 100644 --- a/packages/flame/test/components/sprite_group_component_test.dart +++ b/packages/flame/test/components/sprite_group_component_test.dart @@ -5,6 +5,7 @@ import 'package:flutter_test/flutter_test.dart'; enum _SpriteState { idle, running, + flying, } Future main() async { @@ -109,5 +110,26 @@ Future main() async { expectDouble(component.size.x, testSize.x); expectDouble(component.size.y, testSize.y); }); + + test('modify size only if changed while auto-resizing', () { + final spritesMap = { + _SpriteState.idle: Sprite(image, srcSize: Vector2.all(15)), + _SpriteState.running: Sprite(image, srcSize: Vector2.all(15)), + _SpriteState.flying: Sprite(image, srcSize: Vector2(15, 12)), + }; + final component = SpriteGroupComponent<_SpriteState>(sprites: spritesMap); + + var sizeChangeCounter = 0; + component.size.addListener(() => ++sizeChangeCounter); + + component.current = _SpriteState.running; + expect(sizeChangeCounter, equals(1)); + + component.current = _SpriteState.idle; + expect(sizeChangeCounter, equals(1)); + + component.current = _SpriteState.flying; + expect(sizeChangeCounter, equals(2)); + }); }); }