调整弹药显示动画时长

This commit is contained in:
Light_Quanta 2025-03-22 03:41:39 +08:00
parent f28d5525bf
commit 69c263fe39
No known key found for this signature in database
GPG key ID: 11A39A1B8C890959
2 changed files with 49 additions and 23 deletions

View file

@ -212,10 +212,10 @@ public class AmmoBarOverlay {
} }
} }
private static final AnimationTimer ammoInfoTimer = new AnimationTimer(1500) private static final AnimationTimer ammoInfoTimer = new AnimationTimer(500, 2000)
.forwardAnimation(AnimationCurves.EASE_OUT_EXPO) .forwardAnimation(AnimationCurves.EASE_OUT_EXPO)
.backwardAnimation(AnimationCurves.EASE_IN_EXPO); .backwardAnimation(AnimationCurves.EASE_IN_EXPO);
private static final AnimationTimer ammoBoxTimer = new AnimationTimer(1500) private static final AnimationTimer ammoBoxTimer = new AnimationTimer(500)
.forwardAnimation(AnimationCurves.EASE_OUT_EXPO) .forwardAnimation(AnimationCurves.EASE_OUT_EXPO)
.backwardAnimation(AnimationCurves.EASE_IN_EXPO); .backwardAnimation(AnimationCurves.EASE_IN_EXPO);

View file

@ -9,9 +9,10 @@ import java.util.function.Function;
*/ */
public class AnimationTimer { public class AnimationTimer {
private final long duration; private final long forwardDuration;
private final long backwardDuration;
private long startTime; private long startTime;
private boolean reversed; private boolean isForward = true;
private boolean initialized; private boolean initialized;
// 未初始化状态下动画进度是否从0开始 // 未初始化状态下动画进度是否从0开始
@ -26,7 +27,19 @@ public class AnimationTimer {
* @param duration 动画持续时间单位为毫秒 * @param duration 动画持续时间单位为毫秒
*/ */
public AnimationTimer(long duration) { public AnimationTimer(long duration) {
this.duration = duration; this.forwardDuration = duration;
this.backwardDuration = duration;
}
/**
* 创建一个动画计时器
*
* @param forwardDuration 正向动画持续时间单位为毫秒
* @param backwardDuration 反向动画持续时间单位为毫秒
*/
public AnimationTimer(long forwardDuration, long backwardDuration) {
this.forwardDuration = forwardDuration;
this.backwardDuration = backwardDuration;
} }
/** /**
@ -82,10 +95,23 @@ public class AnimationTimer {
* @param backwardAnimationCurve 反向动画曲线函数 * @param backwardAnimationCurve 反向动画曲线函数
*/ */
public static AnimationTimer[] createTimers(int size, long duration, Function<Double, Double> forwardAnimationCurve, Function<Double, Double> backwardAnimationCurve) { public static AnimationTimer[] createTimers(int size, long duration, Function<Double, Double> forwardAnimationCurve, Function<Double, Double> backwardAnimationCurve) {
return createTimers(size, duration, duration, forwardAnimationCurve, backwardAnimationCurve);
}
/**
* 创建多个动画计时器
*
* @param size 计时器数量
* @param forwardDuration 正向动画持续时间单位为毫秒
* @param backwardDuration 反向动画持续时间单位为毫秒
* @param forwardAnimationCurve 正向动画曲线函数
* @param backwardAnimationCurve 反向动画曲线函数
*/
public static AnimationTimer[] createTimers(int size, long forwardDuration, long backwardDuration, Function<Double, Double> forwardAnimationCurve, Function<Double, Double> backwardAnimationCurve) {
var timers = new AnimationTimer[size]; var timers = new AnimationTimer[size];
var currentTime = System.currentTimeMillis(); var currentTime = System.currentTimeMillis();
for (int i = 0; i < size; i++) { for (int i = 0; i < size; i++) {
timers[i] = new AnimationTimer(duration).forwardAnimation(forwardAnimationCurve).backwardAnimation(backwardAnimationCurve); timers[i] = new AnimationTimer(forwardDuration, backwardDuration).forwardAnimation(forwardAnimationCurve).backwardAnimation(backwardAnimationCurve);
timers[i].endBackward(currentTime); timers[i].endBackward(currentTime);
} }
return timers; return timers;
@ -95,7 +121,7 @@ public class AnimationTimer {
* 当前计时方向是否为正向 * 当前计时方向是否为正向
*/ */
public boolean isForward() { public boolean isForward() {
return !reversed; return isForward;
} }
/** /**
@ -104,20 +130,20 @@ public class AnimationTimer {
* @return 进度值范围在0到1之间 * @return 进度值范围在0到1之间
*/ */
public float getProgress(long currentTime) { public float getProgress(long currentTime) {
if (reversed) { if (isForward) {
return 1 - backwardAnimationCurve.apply(Mth.clamp(1 - getElapsedTime(currentTime) / (double) duration, 0, 1)).floatValue(); return forwardAnimationCurve.apply(Mth.clamp(getElapsedTime(currentTime) / (double) forwardDuration, 0, 1)).floatValue();
} else { } else {
return forwardAnimationCurve.apply(Mth.clamp(getElapsedTime(currentTime) / (double) duration, 0, 1)).floatValue(); return 1 - backwardAnimationCurve.apply(Mth.clamp(1 - getElapsedTime(currentTime) / (double) backwardDuration, 0, 1)).floatValue();
} }
} }
private long getElapsedTime(long currentTime) { private long getElapsedTime(long currentTime) {
if (!initialized) return playFromStart ? 0 : duration; if (!initialized) return playFromStart ? 0 : (isForward() ? forwardDuration : backwardDuration);
if (reversed) { if (isForward) {
return Math.min(duration, Math.max(0, startTime - currentTime)); return Math.min(forwardDuration, currentTime - startTime);
} else { } else {
return Math.min(duration, currentTime - startTime); return Math.min(backwardDuration, Math.max(0, startTime - currentTime));
} }
} }
@ -125,7 +151,7 @@ public class AnimationTimer {
* 当前动画是否已经结束 * 当前动画是否已经结束
*/ */
public boolean finished(long currentTime) { public boolean finished(long currentTime) {
return getElapsedTime(currentTime) >= duration; return getElapsedTime(currentTime) >= (isForward ? forwardDuration : backwardDuration);
} }
/** /**
@ -150,11 +176,11 @@ public class AnimationTimer {
public void forward(long currentTime) { public void forward(long currentTime) {
if (!initialized) { if (!initialized) {
initialized = true; initialized = true;
startTime = currentTime + (playFromStart ? 0 : duration); startTime = currentTime + (playFromStart ? 0 : forwardDuration);
} else if (reversed) { } else if (!isForward) {
startTime = currentTime - getElapsedTime(currentTime); startTime = (long) (currentTime - ((double) getElapsedTime(currentTime) / backwardDuration * forwardDuration));
} }
reversed = false; isForward = true;
} }
/** /**
@ -179,11 +205,11 @@ public class AnimationTimer {
public void backward(long currentTime) { public void backward(long currentTime) {
if (!initialized) { if (!initialized) {
initialized = true; initialized = true;
startTime = currentTime + (playFromStart ? duration : 0); startTime = currentTime + (playFromStart ? backwardDuration : 0);
} else if (!reversed) { } else if (isForward) {
startTime = currentTime + getElapsedTime(currentTime); startTime = (long) (currentTime + ((double) getElapsedTime(currentTime) / forwardDuration * backwardDuration));
} }
reversed = true; isForward = false;
} }
/** /**