mirror of
https://github.com/flame-engine/flame.git
synced 2025-10-30 08:27:36 +08:00
feat: clampLength for Vector2 extension (#2190)
With this method you can clamp the length of a vector, instead fitting it in a box like clamp and clampScalar does.
This commit is contained in:
@ -32,6 +32,7 @@ class IsometricTileMapExample extends FlameGame with MouseMovementDetector {
|
||||
|
||||
@override
|
||||
Future<void> onLoad() async {
|
||||
debugMode = true;
|
||||
final tilesetImage = await images.load('tile_maps/tiles$suffix.png');
|
||||
final tileset = SpriteSheet(
|
||||
image: tilesetImage,
|
||||
|
||||
@ -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;
|
||||
|
||||
@ -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);
|
||||
|
||||
Reference in New Issue
Block a user