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; public void Init(Node3D tweenObject) { _tweenObject = tweenObject; } public void EndTween() { _isTweening = false; } private void TweenToLocation(TweenInputs inputs) { var (location, duration) = inputs; var tween = GetTree().CreateTween(); var callback = new Callable(this, MethodName.EndTween); tween.TweenProperty(_tweenObject, "position", location, duration); tween.TweenCallback(callback); _isTweening = true; tween.Play(); } 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()); } }