Add anim.iteration, anim.direction, and anim.delay properties.

This commit is contained in:
2023-03-03 15:10:52 +08:00
parent 03fd7f6d01
commit 6d74685cb7

View File

@@ -1,11 +1,16 @@
using Cryville.Common;
using System;
namespace Cryville.Crtr.Components {
public class SkinAnimation : SkinComponent {
public SkinAnimation() {
SubmitProperty("name", new PropOp.Identifier(v => Name = v));
SubmitProperty("duration", new PropOp.Float(v => Duration = v));
SubmitProperty("iteration", new PropOp.Float(v => Iteration = v));
SubmitProperty("direction", new PropOp.Enum<AnimationDirection>(v => Direction = v, v => (AnimationDirection)v));
SubmitProperty("delay", new PropOp.Float(v => Delay = v));
_rtimeSrc = new PropSrc.Float(() => _rtime);
Iteration = 1;
}
SkinContext _skinContext;
@@ -32,6 +37,9 @@ namespace Cryville.Crtr.Components {
}
}
public float Duration { get; private set; }
public float Iteration { get; private set; }
public AnimationDirection Direction { get; private set; }
public float Delay { get; private set; }
double _startTime;
float _rtime;
@@ -44,7 +52,28 @@ namespace Cryville.Crtr.Components {
_startTime = time;
}
public override void Tick(SkinContainer c, double time) {
_rtime = (float)(time - _startTime) / Duration;
_rtime = (float)(time - _startTime - Delay) / Duration;
if (_rtime < 0) _rtime = 0;
else if (_rtime > Iteration) {
if (Direction.HasFlag(AnimationDirection.alternate)) {
_rtime = Iteration % 2;
if (_rtime > 1) _rtime = 2 - _rtime;
}
else {
_rtime = Iteration % 1;
if (_rtime == 0) _rtime = 1;
}
}
else {
if (Direction.HasFlag(AnimationDirection.alternate)) {
_rtime %= 2;
if (_rtime > 1) _rtime = 2 - _rtime;
}
else {
_rtime %= 1;
}
}
if (Direction.HasFlag(AnimationDirection.reverse)) _rtime = 1 - _rtime;
_rtimeSrc.Invalidate();
ChartPlayer.etor.ContextSelfValue = _rtimeSrc;
if (_anim != null) c.MatchAnimation(_anim, _rtime, new RuntimeSkinContext(_skinContext));
@@ -52,4 +81,10 @@ namespace Cryville.Crtr.Components {
}
protected override void OnDestroy() { }
}
[Flags]
public enum AnimationDirection {
normal = 0,
reverse = 1,
alternate = 2,
}
}