54 lines
1.3 KiB
C#
54 lines
1.3 KiB
C#
using System.Collections.Generic;
|
|
using Godot;
|
|
|
|
namespace Movementtests.systems;
|
|
|
|
public partial class TweenQueueSystem : Node3D
|
|
{
|
|
public record TweenInputs(Vector3 Location, float Duration);
|
|
|
|
private Queue<TweenInputs> _tweenInputs = new Queue<TweenInputs>();
|
|
private Node3D _tweenObject;
|
|
private bool _isTweening = false;
|
|
private Callable _tweenEndedCallback;
|
|
|
|
public void Init(Node3D tweenObject)
|
|
{
|
|
_tweenObject = tweenObject;
|
|
_tweenEndedCallback = new Callable(this, MethodName.EndTween);
|
|
}
|
|
|
|
public void EndTween()
|
|
{
|
|
_isTweening = false;
|
|
}
|
|
|
|
public Tween TweenToLocation(TweenInputs inputs)
|
|
{
|
|
var (location, duration) = inputs;
|
|
|
|
var tween = GetTree().CreateTween();
|
|
tween.SetParallel(true);
|
|
tween.TweenProperty(_tweenObject, "global_position", location, duration);
|
|
tween.TweenCallback(_tweenEndedCallback);
|
|
_isTweening = true;
|
|
return tween;
|
|
}
|
|
|
|
public void QueueTween(TweenInputs inputs)
|
|
{
|
|
_tweenInputs.Enqueue(inputs);
|
|
}
|
|
|
|
public void QueueTween(Vector3 location, float duration)
|
|
{
|
|
QueueTween(new TweenInputs(location, duration));
|
|
}
|
|
|
|
public void ProcessTweens()
|
|
{
|
|
if (_tweenInputs.Count > 0 && !_isTweening)
|
|
TweenToLocation(_tweenInputs.Dequeue());
|
|
}
|
|
|
|
} |