using System.Collections.Generic; using Godot; namespace Movementtests.systems; public partial class TweenQueueSystem : Node3D { public record TweenInputs(Vector3 Location, float Duration); private Queue _tweenInputs = new Queue(); 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()); } }