mirror of
https://github.com/flame-engine/flame.git
synced 2025-11-01 19:12:31 +08:00
42 lines
1.2 KiB
Dart
42 lines
1.2 KiB
Dart
import 'dart:math';
|
|
import '../components/component.dart';
|
|
|
|
export './move_effect.dart';
|
|
export './scale_effect.dart';
|
|
|
|
abstract class PositionComponentEffect {
|
|
bool _isDisposed = false;
|
|
bool get isDisposed => _isDisposed;
|
|
|
|
/// If the animation should first follow the initial curve and then follow the
|
|
/// curve backwards
|
|
bool isAlternating;
|
|
bool isInfinite;
|
|
double percentage;
|
|
double travelTime;
|
|
double _curveTime = 0.0;
|
|
int _curveDirection = 1;
|
|
|
|
PositionComponentEffect(this.isInfinite, this.isAlternating);
|
|
|
|
void update(double dt) {
|
|
_curveTime += dt * _curveDirection;
|
|
if (isAlternating) {
|
|
_curveDirection = isMax() ? -1 : (isMin() ? 1 : _curveDirection);
|
|
} else if (isInfinite && isMax()){
|
|
percentage = 0.0;
|
|
}
|
|
percentage = min(1.0, max(0.0, _curveTime / travelTime));
|
|
}
|
|
|
|
void dispose() => _isDisposed = true;
|
|
|
|
PositionComponent component;
|
|
|
|
bool hasFinished() =>
|
|
(!isInfinite && !isAlternating && isMax()) ||
|
|
(!isInfinite && isAlternating && isMin()) || isDisposed;
|
|
bool isMax() => percentage == null ? false : percentage == 1.0;
|
|
bool isMin() => percentage == null ? false : percentage == 0.0;
|
|
}
|