mirror of
https://github.com/flame-engine/flame.git
synced 2025-11-04 04:47:13 +08:00
Duration can not be zero
This commit is contained in:
@ -29,7 +29,7 @@ class MyGame extends BaseGame with TapDetector {
|
|||||||
speed: 250.0,
|
speed: 250.0,
|
||||||
curve: Curves.bounceInOut,
|
curve: Curves.bounceInOut,
|
||||||
isRelative: false,
|
isRelative: false,
|
||||||
isInfinite: true,
|
isInfinite: false,
|
||||||
isAlternating: true,
|
isAlternating: true,
|
||||||
));
|
));
|
||||||
}
|
}
|
||||||
|
|||||||
@ -1,5 +1,3 @@
|
|||||||
import 'dart:math';
|
|
||||||
|
|
||||||
import 'package:flutter/foundation.dart';
|
import 'package:flutter/foundation.dart';
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
|
|
||||||
@ -60,7 +58,7 @@ abstract class ComponentEffect<T extends Component> {
|
|||||||
}
|
}
|
||||||
if (!hasFinished()) {
|
if (!hasFinished()) {
|
||||||
currentTime += (dt + driftTime) * curveDirection;
|
currentTime += (dt + driftTime) * curveDirection;
|
||||||
currentTime = (currentTime * 10000000).round() / 10000000;
|
currentTime = (currentTime * 10000000).floor() / 10000000;
|
||||||
percentage = (currentTime / peakTime).clamp(0.0, 1.0).toDouble();
|
percentage = (currentTime / peakTime).clamp(0.0, 1.0).toDouble();
|
||||||
curveProgress = curve.transform(percentage);
|
curveProgress = curve.transform(percentage);
|
||||||
_updateDriftTime();
|
_updateDriftTime();
|
||||||
|
|||||||
@ -41,8 +41,6 @@ void effectTest(
|
|||||||
game.update(stepDelta);
|
game.update(stepDelta);
|
||||||
timeLeft -= stepDelta;
|
timeLeft -= stepDelta;
|
||||||
}
|
}
|
||||||
expect(effect.hasFinished(), shouldFinish, reason: "Effect shouldFinish");
|
|
||||||
expect(callback.isCalled, shouldFinish, reason: "Callback was treated wrong");
|
|
||||||
if (!shouldFinish) {
|
if (!shouldFinish) {
|
||||||
const double floatRange = 0.001;
|
const double floatRange = 0.001;
|
||||||
bool acceptableVector(Vector2 vector, Vector2 expectedVector) {
|
bool acceptableVector(Vector2 vector, Vector2 expectedVector) {
|
||||||
@ -56,18 +54,18 @@ void effectTest(
|
|||||||
(expectedAngle - component.angle).abs() < floatRange;
|
(expectedAngle - component.angle).abs() < floatRange;
|
||||||
assert(
|
assert(
|
||||||
acceptablePosition,
|
acceptablePosition,
|
||||||
"Position is not correct (${component.position} vs $expectedPosition)",
|
"Position is not correct (had: ${component.position} should be $expectedPosition)",
|
||||||
);
|
);
|
||||||
assert(
|
assert(
|
||||||
acceptableAngle,
|
acceptableAngle,
|
||||||
"Angle is not correct (${component.angle} vs $expectedAngle)",
|
"Angle is not correct (had: ${component.angle} should be: $expectedAngle)",
|
||||||
);
|
);
|
||||||
assert(
|
assert(
|
||||||
acceptableSize,
|
acceptableSize,
|
||||||
"Size is not correct (${component.size} vs $expectedSize)",
|
"Size is not correct (had: ${component.size} should be: $expectedSize)",
|
||||||
);
|
);
|
||||||
} else {
|
} else {
|
||||||
//game.update(0.1);
|
game.update(0.1);
|
||||||
expect(
|
expect(
|
||||||
component.position,
|
component.position,
|
||||||
expectedPosition,
|
expectedPosition,
|
||||||
@ -84,12 +82,14 @@ void effectTest(
|
|||||||
reason: "Size is not exactly correct",
|
reason: "Size is not exactly correct",
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
expect(effect.hasFinished(), shouldFinish, reason: "Effect shouldFinish");
|
||||||
|
expect(callback.isCalled, shouldFinish, reason: "Callback was treated wrong");
|
||||||
game.update(0.0); // Since effects are removed before they are updated
|
game.update(0.0); // Since effects are removed before they are updated
|
||||||
expect(component.effects.isEmpty, shouldFinish);
|
expect(component.effects.isEmpty, shouldFinish);
|
||||||
}
|
}
|
||||||
|
|
||||||
class Square extends PositionComponent {
|
class TestComponent extends PositionComponent {
|
||||||
Square({
|
TestComponent({
|
||||||
Vector2 position,
|
Vector2 position,
|
||||||
Vector2 size,
|
Vector2 size,
|
||||||
double angle,
|
double angle,
|
||||||
|
|||||||
@ -11,23 +11,22 @@ void main() {
|
|||||||
final Random random = Random();
|
final Random random = Random();
|
||||||
Vector2 randomVector2() => (Vector2.random(random) * 100)..round();
|
Vector2 randomVector2() => (Vector2.random(random) * 100)..round();
|
||||||
final List<Vector2> path = List.generate(3, (i) => randomVector2());
|
final List<Vector2> path = List.generate(3, (i) => randomVector2());
|
||||||
Square component() => Square(position: randomVector2());
|
TestComponent component() => TestComponent(position: randomVector2());
|
||||||
|
|
||||||
MoveEffect effect(bool isInfinite, bool isAlternating) {
|
MoveEffect effect(bool isInfinite, bool isAlternating) {
|
||||||
return MoveEffect(
|
return MoveEffect(
|
||||||
path: path,
|
path: path,
|
||||||
duration: random.nextInt(100).toDouble(),
|
duration: 1 + random.nextInt(100).toDouble(),
|
||||||
isInfinite: isInfinite,
|
isInfinite: isInfinite,
|
||||||
isAlternating: isAlternating,
|
isAlternating: isAlternating,
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
testWidgets('MoveEffect can move', (WidgetTester tester) async {
|
testWidgets('MoveEffect can move', (WidgetTester tester) async {
|
||||||
final MoveEffect moveEffect = effect(false, false);
|
|
||||||
effectTest(
|
effectTest(
|
||||||
tester,
|
tester,
|
||||||
component(),
|
component(),
|
||||||
moveEffect,
|
effect(false, false),
|
||||||
expectedPosition: path.last,
|
expectedPosition: path.last,
|
||||||
);
|
);
|
||||||
});
|
});
|
||||||
@ -35,11 +34,10 @@ void main() {
|
|||||||
testWidgets(
|
testWidgets(
|
||||||
'MoveEffect will stop moving after it is done',
|
'MoveEffect will stop moving after it is done',
|
||||||
(WidgetTester tester) async {
|
(WidgetTester tester) async {
|
||||||
final MoveEffect moveEffect = effect(false, false);
|
|
||||||
effectTest(
|
effectTest(
|
||||||
tester,
|
tester,
|
||||||
component(),
|
component(),
|
||||||
moveEffect,
|
effect(false, false),
|
||||||
expectedPosition: path.last,
|
expectedPosition: path.last,
|
||||||
iterations: 1.5,
|
iterations: 1.5,
|
||||||
);
|
);
|
||||||
@ -47,12 +45,11 @@ void main() {
|
|||||||
);
|
);
|
||||||
|
|
||||||
testWidgets('MoveEffect can alternate', (WidgetTester tester) async {
|
testWidgets('MoveEffect can alternate', (WidgetTester tester) async {
|
||||||
final MoveEffect moveEffect = effect(false, true);
|
|
||||||
final PositionComponent positionComponent = component();
|
final PositionComponent positionComponent = component();
|
||||||
effectTest(
|
effectTest(
|
||||||
tester,
|
tester,
|
||||||
positionComponent,
|
positionComponent,
|
||||||
moveEffect,
|
effect(false, true),
|
||||||
expectedPosition: positionComponent.position.clone(),
|
expectedPosition: positionComponent.position.clone(),
|
||||||
);
|
);
|
||||||
});
|
});
|
||||||
@ -60,12 +57,11 @@ void main() {
|
|||||||
testWidgets(
|
testWidgets(
|
||||||
'MoveEffect can alternate and be infinite',
|
'MoveEffect can alternate and be infinite',
|
||||||
(WidgetTester tester) async {
|
(WidgetTester tester) async {
|
||||||
final MoveEffect moveEffect = effect(true, true);
|
|
||||||
final PositionComponent positionComponent = component();
|
final PositionComponent positionComponent = component();
|
||||||
effectTest(
|
effectTest(
|
||||||
tester,
|
tester,
|
||||||
positionComponent,
|
positionComponent,
|
||||||
moveEffect,
|
effect(true, true),
|
||||||
expectedPosition: positionComponent.position.clone(),
|
expectedPosition: positionComponent.position.clone(),
|
||||||
iterations: 1.0,
|
iterations: 1.0,
|
||||||
shouldFinish: false,
|
shouldFinish: false,
|
||||||
@ -74,12 +70,11 @@ void main() {
|
|||||||
);
|
);
|
||||||
|
|
||||||
testWidgets('MoveEffect alternation can peak', (WidgetTester tester) async {
|
testWidgets('MoveEffect alternation can peak', (WidgetTester tester) async {
|
||||||
final MoveEffect moveEffect = effect(false, true);
|
|
||||||
final PositionComponent positionComponent = component();
|
final PositionComponent positionComponent = component();
|
||||||
effectTest(
|
effectTest(
|
||||||
tester,
|
tester,
|
||||||
positionComponent,
|
positionComponent,
|
||||||
moveEffect,
|
effect(false, true),
|
||||||
expectedPosition: path.last,
|
expectedPosition: path.last,
|
||||||
shouldFinish: false,
|
shouldFinish: false,
|
||||||
iterations: 0.5,
|
iterations: 0.5,
|
||||||
@ -87,12 +82,11 @@ void main() {
|
|||||||
});
|
});
|
||||||
|
|
||||||
testWidgets('MoveEffect can be infinite', (WidgetTester tester) async {
|
testWidgets('MoveEffect can be infinite', (WidgetTester tester) async {
|
||||||
final MoveEffect moveEffect = effect(true, false);
|
|
||||||
final PositionComponent positionComponent = component();
|
final PositionComponent positionComponent = component();
|
||||||
effectTest(
|
effectTest(
|
||||||
tester,
|
tester,
|
||||||
positionComponent,
|
positionComponent,
|
||||||
moveEffect,
|
effect(true, false),
|
||||||
expectedPosition: path.last,
|
expectedPosition: path.last,
|
||||||
iterations: 3.0,
|
iterations: 3.0,
|
||||||
shouldFinish: false,
|
shouldFinish: false,
|
||||||
|
|||||||
@ -7,32 +7,23 @@ import 'package:flutter_test/flutter_test.dart';
|
|||||||
import 'effect_test_utils.dart';
|
import 'effect_test_utils.dart';
|
||||||
|
|
||||||
void main() {
|
void main() {
|
||||||
final Random random = Random();
|
const double angleArgument = 6.0;
|
||||||
double roundDouble(double value, int places) {
|
TestComponent component() => TestComponent(angle: 0.5);
|
||||||
final double mod = pow(10.0, places).toDouble();
|
|
||||||
return (value * mod).round().toDouble() / mod;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Max three rotations
|
|
||||||
double randomAngle() => roundDouble(random.nextDouble() * 6 * pi, 2);
|
|
||||||
final double angleArgument = randomAngle();
|
|
||||||
Square component() => Square(angle: randomAngle());
|
|
||||||
|
|
||||||
RotateEffect effect(bool isInfinite, bool isAlternating) {
|
RotateEffect effect(bool isInfinite, bool isAlternating) {
|
||||||
return RotateEffect(
|
return RotateEffect(
|
||||||
angle: angleArgument,
|
angle: angleArgument,
|
||||||
duration: random.nextInt(100).toDouble(),
|
duration: 1 + random.nextInt(100).toDouble(),
|
||||||
isInfinite: isInfinite,
|
isInfinite: isInfinite,
|
||||||
isAlternating: isAlternating,
|
isAlternating: isAlternating,
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
testWidgets('RotateEffect can rotate', (WidgetTester tester) async {
|
testWidgets('RotateEffect can rotate', (WidgetTester tester) async {
|
||||||
final RotateEffect rotateEffect = effect(false, false);
|
|
||||||
effectTest(
|
effectTest(
|
||||||
tester,
|
tester,
|
||||||
component(),
|
component(),
|
||||||
rotateEffect,
|
effect(false, false),
|
||||||
expectedAngle: angleArgument,
|
expectedAngle: angleArgument,
|
||||||
);
|
);
|
||||||
});
|
});
|
||||||
@ -40,11 +31,10 @@ void main() {
|
|||||||
testWidgets(
|
testWidgets(
|
||||||
'RotateEffect will stop rotating after it is done',
|
'RotateEffect will stop rotating after it is done',
|
||||||
(WidgetTester tester) async {
|
(WidgetTester tester) async {
|
||||||
final RotateEffect rotateEffect = effect(false, false);
|
|
||||||
effectTest(
|
effectTest(
|
||||||
tester,
|
tester,
|
||||||
component(),
|
component(),
|
||||||
rotateEffect,
|
effect(false, false),
|
||||||
expectedAngle: angleArgument,
|
expectedAngle: angleArgument,
|
||||||
iterations: 1.5,
|
iterations: 1.5,
|
||||||
);
|
);
|
||||||
@ -52,12 +42,11 @@ void main() {
|
|||||||
);
|
);
|
||||||
|
|
||||||
testWidgets('RotateEffect can alternate', (WidgetTester tester) async {
|
testWidgets('RotateEffect can alternate', (WidgetTester tester) async {
|
||||||
final RotateEffect rotateEffect = effect(false, true);
|
|
||||||
final PositionComponent positionComponent = component();
|
final PositionComponent positionComponent = component();
|
||||||
effectTest(
|
effectTest(
|
||||||
tester,
|
tester,
|
||||||
positionComponent,
|
positionComponent,
|
||||||
rotateEffect,
|
effect(false, true),
|
||||||
expectedAngle: positionComponent.angle,
|
expectedAngle: positionComponent.angle,
|
||||||
);
|
);
|
||||||
});
|
});
|
||||||
@ -65,12 +54,11 @@ void main() {
|
|||||||
testWidgets(
|
testWidgets(
|
||||||
'RotateEffect can alternate and be infinite',
|
'RotateEffect can alternate and be infinite',
|
||||||
(WidgetTester tester) async {
|
(WidgetTester tester) async {
|
||||||
final RotateEffect rotateEffect = effect(true, true);
|
|
||||||
final PositionComponent positionComponent = component();
|
final PositionComponent positionComponent = component();
|
||||||
effectTest(
|
effectTest(
|
||||||
tester,
|
tester,
|
||||||
positionComponent,
|
positionComponent,
|
||||||
rotateEffect,
|
effect(true, true),
|
||||||
expectedAngle: positionComponent.angle,
|
expectedAngle: positionComponent.angle,
|
||||||
iterations: 1.0,
|
iterations: 1.0,
|
||||||
shouldFinish: false,
|
shouldFinish: false,
|
||||||
@ -79,12 +67,11 @@ void main() {
|
|||||||
);
|
);
|
||||||
|
|
||||||
testWidgets('RotateEffect alternation can peak', (WidgetTester tester) async {
|
testWidgets('RotateEffect alternation can peak', (WidgetTester tester) async {
|
||||||
final RotateEffect rotateEffect = effect(false, true);
|
|
||||||
final PositionComponent positionComponent = component();
|
final PositionComponent positionComponent = component();
|
||||||
effectTest(
|
effectTest(
|
||||||
tester,
|
tester,
|
||||||
positionComponent,
|
positionComponent,
|
||||||
rotateEffect,
|
effect(false, true),
|
||||||
expectedAngle: angleArgument,
|
expectedAngle: angleArgument,
|
||||||
shouldFinish: false,
|
shouldFinish: false,
|
||||||
iterations: 0.5,
|
iterations: 0.5,
|
||||||
@ -92,12 +79,11 @@ void main() {
|
|||||||
});
|
});
|
||||||
|
|
||||||
testWidgets('RotateEffect can be infinite', (WidgetTester tester) async {
|
testWidgets('RotateEffect can be infinite', (WidgetTester tester) async {
|
||||||
final RotateEffect rotateEffect = effect(true, false);
|
|
||||||
final PositionComponent positionComponent = component();
|
final PositionComponent positionComponent = component();
|
||||||
effectTest(
|
effectTest(
|
||||||
tester,
|
tester,
|
||||||
positionComponent,
|
positionComponent,
|
||||||
rotateEffect,
|
effect(true, false),
|
||||||
expectedAngle: angleArgument,
|
expectedAngle: angleArgument,
|
||||||
iterations: 3.0,
|
iterations: 3.0,
|
||||||
shouldFinish: false,
|
shouldFinish: false,
|
||||||
|
|||||||
@ -11,23 +11,22 @@ void main() {
|
|||||||
final Random random = Random();
|
final Random random = Random();
|
||||||
Vector2 randomVector2() => (Vector2.random(random) * 100)..round();
|
Vector2 randomVector2() => (Vector2.random(random) * 100)..round();
|
||||||
final Vector2 argumentSize = randomVector2();
|
final Vector2 argumentSize = randomVector2();
|
||||||
Square component() => Square(size: randomVector2());
|
TestComponent component() => TestComponent(size: randomVector2());
|
||||||
|
|
||||||
ScaleEffect effect(bool isInfinite, bool isAlternating) {
|
ScaleEffect effect(bool isInfinite, bool isAlternating) {
|
||||||
return ScaleEffect(
|
return ScaleEffect(
|
||||||
size: argumentSize,
|
size: argumentSize,
|
||||||
duration: random.nextInt(100).toDouble(),
|
duration: 1 + random.nextInt(100).toDouble(),
|
||||||
isInfinite: isInfinite,
|
isInfinite: isInfinite,
|
||||||
isAlternating: isAlternating,
|
isAlternating: isAlternating,
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
testWidgets('ScaleEffect can scale', (WidgetTester tester) async {
|
testWidgets('ScaleEffect can scale', (WidgetTester tester) async {
|
||||||
final ScaleEffect scaleEffect = effect(false, false);
|
|
||||||
effectTest(
|
effectTest(
|
||||||
tester,
|
tester,
|
||||||
component(),
|
component(),
|
||||||
scaleEffect,
|
effect(false, false),
|
||||||
expectedSize: argumentSize,
|
expectedSize: argumentSize,
|
||||||
);
|
);
|
||||||
});
|
});
|
||||||
@ -35,11 +34,10 @@ void main() {
|
|||||||
testWidgets(
|
testWidgets(
|
||||||
'ScaleEffect will stop scaling after it is done',
|
'ScaleEffect will stop scaling after it is done',
|
||||||
(WidgetTester tester) async {
|
(WidgetTester tester) async {
|
||||||
final ScaleEffect scaleEffect = effect(false, false);
|
|
||||||
effectTest(
|
effectTest(
|
||||||
tester,
|
tester,
|
||||||
component(),
|
component(),
|
||||||
scaleEffect,
|
effect(false, false),
|
||||||
expectedSize: argumentSize,
|
expectedSize: argumentSize,
|
||||||
iterations: 1.5,
|
iterations: 1.5,
|
||||||
);
|
);
|
||||||
@ -47,12 +45,11 @@ void main() {
|
|||||||
);
|
);
|
||||||
|
|
||||||
testWidgets('ScaleEffect can alternate', (WidgetTester tester) async {
|
testWidgets('ScaleEffect can alternate', (WidgetTester tester) async {
|
||||||
final ScaleEffect scaleEffect = effect(false, true);
|
|
||||||
final PositionComponent positionComponent = component();
|
final PositionComponent positionComponent = component();
|
||||||
effectTest(
|
effectTest(
|
||||||
tester,
|
tester,
|
||||||
positionComponent,
|
positionComponent,
|
||||||
scaleEffect,
|
effect(false, true),
|
||||||
expectedSize: positionComponent.size.clone(),
|
expectedSize: positionComponent.size.clone(),
|
||||||
);
|
);
|
||||||
});
|
});
|
||||||
@ -60,12 +57,11 @@ void main() {
|
|||||||
testWidgets(
|
testWidgets(
|
||||||
'ScaleEffect can alternate and be infinite',
|
'ScaleEffect can alternate and be infinite',
|
||||||
(WidgetTester tester) async {
|
(WidgetTester tester) async {
|
||||||
final ScaleEffect scaleEffect = effect(true, true);
|
|
||||||
final PositionComponent positionComponent = component();
|
final PositionComponent positionComponent = component();
|
||||||
effectTest(
|
effectTest(
|
||||||
tester,
|
tester,
|
||||||
positionComponent,
|
positionComponent,
|
||||||
scaleEffect,
|
effect(true, true),
|
||||||
expectedSize: positionComponent.size.clone(),
|
expectedSize: positionComponent.size.clone(),
|
||||||
iterations: 1.0,
|
iterations: 1.0,
|
||||||
shouldFinish: false,
|
shouldFinish: false,
|
||||||
@ -74,12 +70,11 @@ void main() {
|
|||||||
);
|
);
|
||||||
|
|
||||||
testWidgets('ScaleEffect alternation can peak', (WidgetTester tester) async {
|
testWidgets('ScaleEffect alternation can peak', (WidgetTester tester) async {
|
||||||
final ScaleEffect scaleEffect = effect(false, true);
|
|
||||||
final PositionComponent positionComponent = component();
|
final PositionComponent positionComponent = component();
|
||||||
effectTest(
|
effectTest(
|
||||||
tester,
|
tester,
|
||||||
positionComponent,
|
positionComponent,
|
||||||
scaleEffect,
|
effect(false, true),
|
||||||
expectedSize: argumentSize,
|
expectedSize: argumentSize,
|
||||||
shouldFinish: false,
|
shouldFinish: false,
|
||||||
iterations: 0.5,
|
iterations: 0.5,
|
||||||
@ -87,12 +82,11 @@ void main() {
|
|||||||
});
|
});
|
||||||
|
|
||||||
testWidgets('ScaleEffect can be infinite', (WidgetTester tester) async {
|
testWidgets('ScaleEffect can be infinite', (WidgetTester tester) async {
|
||||||
final ScaleEffect scaleEffect = effect(true, false);
|
|
||||||
final PositionComponent positionComponent = component();
|
final PositionComponent positionComponent = component();
|
||||||
effectTest(
|
effectTest(
|
||||||
tester,
|
tester,
|
||||||
positionComponent,
|
positionComponent,
|
||||||
scaleEffect,
|
effect(true, false),
|
||||||
expectedSize: argumentSize,
|
expectedSize: argumentSize,
|
||||||
iterations: 3.0,
|
iterations: 3.0,
|
||||||
shouldFinish: false,
|
shouldFinish: false,
|
||||||
|
|||||||
Reference in New Issue
Block a user