diff --git a/examples/lib/stories/rendering/isometric_tile_map_example.dart b/examples/lib/stories/rendering/isometric_tile_map_example.dart index 26c2538b9..92223a502 100644 --- a/examples/lib/stories/rendering/isometric_tile_map_example.dart +++ b/examples/lib/stories/rendering/isometric_tile_map_example.dart @@ -32,6 +32,7 @@ class IsometricTileMapExample extends FlameGame with MouseMovementDetector { @override Future onLoad() async { + debugMode = true; final tilesetImage = await images.load('tile_maps/tiles$suffix.png'); final tileset = SpriteSheet( image: tilesetImage, diff --git a/packages/flame/lib/src/extensions/vector2.dart b/packages/flame/lib/src/extensions/vector2.dart index 0a153c883..ce5237e42 100644 --- a/packages/flame/lib/src/extensions/vector2.dart +++ b/packages/flame/lib/src/extensions/vector2.dart @@ -80,6 +80,21 @@ extension Vector2Extension on Vector2 { } } + /// Clamps the [length] of this vector. + /// + /// This means that if the length is less than [min] the length will be set to + /// [min] and if the length is larger than [max], the length will be set to + /// [max]. If the length is in between [min] and [max], no changes will be + /// made. + void clampLength(double min, double max) { + final lengthSquared = length2; + if (lengthSquared > max * max) { + scaleTo(max); + } else if (lengthSquared < min * min) { + scaleTo(min); + } + } + /// Project this onto [other]. /// /// [other] needs to have a length > 0; diff --git a/packages/flame/test/extensions/vector2_test.dart b/packages/flame/test/extensions/vector2_test.dart index a60d238ca..5cba3ea1b 100644 --- a/packages/flame/test/extensions/vector2_test.dart +++ b/packages/flame/test/extensions/vector2_test.dart @@ -213,6 +213,28 @@ void main() { }); }); + group('clampLength', () { + test('clamp length min', () { + final v = Vector2(1, 0)..clampLength(2.0, 3.0); + expect(v.length, 2.0); + }); + + test('clamp length max', () { + final v = Vector2(1, 0)..clampLength(0.5, 0.8); + expect(v.length, 0.8); + }); + + test('clamp negative vector', () { + final v = Vector2(-1, -1)..clampLength(0.5, 0.8); + expect(v.length, 0.8); + }); + + test('no effect on vector in range', () { + final v = Vector2(1, 0)..clampLength(0.5, 2.0); + expect(v.length, 1.0); + }); + }); + group('projection', () { test('Project onto longer vector', () { final u = Vector2(5, 2);