74 lines
2.2 KiB
C#
74 lines
2.2 KiB
C#
using Godot;
|
|
|
|
namespace Mr.BrickAdventures.scripts.components;
|
|
|
|
[GlobalClass]
|
|
public partial class MovingPlatformComponent : AnimatableBody2D
|
|
{
|
|
public enum LoopModeEnum { OneShot, Loop, PingPong }
|
|
|
|
[Export] public Path2D Path { get; set; }
|
|
[Export(PropertyHint.Range, "10, 1000, 1")] public float Speed { get; set; } = 100.0f;
|
|
[Export] public LoopModeEnum LoopMode { get; set; } = LoopModeEnum.PingPong;
|
|
[Export(PropertyHint.Range, "0, 10, 0.1")] public float WaitTime { get; set; } = 1.0f;
|
|
|
|
private PathFollow2D _pathFollower;
|
|
private Tween _tween;
|
|
|
|
public override void _Ready()
|
|
{
|
|
if (Path == null)
|
|
{
|
|
GD.PrintErr("MovingPlatform: Path is not set. The platform will not move.");
|
|
return;
|
|
}
|
|
|
|
_pathFollower = new PathFollow2D
|
|
{
|
|
Loop = false,
|
|
Rotates = false
|
|
};
|
|
Path.AddChild(_pathFollower);
|
|
|
|
StartMovement();
|
|
}
|
|
|
|
public override void _PhysicsProcess(double delta)
|
|
{
|
|
if (_pathFollower == null) return;
|
|
|
|
GlobalPosition = _pathFollower.GlobalPosition;
|
|
}
|
|
|
|
private void StartMovement()
|
|
{
|
|
_tween?.Kill();
|
|
_tween = CreateTween();
|
|
_tween.SetParallel(false);
|
|
|
|
var pathLength =Path.Curve.GetBakedLength();
|
|
var duration = pathLength / Speed;
|
|
|
|
switch (LoopMode)
|
|
{
|
|
case LoopModeEnum.OneShot:
|
|
_tween.TweenProperty(_pathFollower, "progress", pathLength, duration);
|
|
break;
|
|
|
|
case LoopModeEnum.Loop:
|
|
_tween.TweenProperty(_pathFollower, "progress", pathLength, duration);
|
|
_tween.TweenInterval(WaitTime);
|
|
_tween.TweenCallback(Callable.From(() => _pathFollower.Progress = 0));
|
|
_tween.SetLoops();
|
|
break;
|
|
|
|
case LoopModeEnum.PingPong:
|
|
_tween.TweenProperty(_pathFollower, "progress", pathLength, duration);
|
|
_tween.TweenInterval(WaitTime);
|
|
_tween.TweenProperty(_pathFollower, "progress", 0, duration);
|
|
_tween.TweenInterval(WaitTime);
|
|
_tween.SetLoops();
|
|
break;
|
|
}
|
|
}
|
|
} |