public override _Ready()
{
_cancellationTokenSource = new CancellationTokenSource();
Task.Run(() => ProcessFloatingTextQueue(_cancellationTokenSource.Token));
}
private async Task ProcessFloatingTextQueue(CancellationToken cancellationToken)
{
while (!cancellationToken.IsCancellationRequested)
{
if (_floatingTextQueue.Count > 0 && !_isFloatingTextBeingDisplayed)
{
var (text, color, type) = _floatingTextQueue.Dequeue();
var floatingText = (FloatingText)_floatingTextScene.Instantiate();
var startPosition = new Vector2(_floatingTextSpawner.GlobalPosition.X, _floatingTextSpawner.GlobalPosition.Y - ModuleController.Owner.Sprite.GetRect().Size.Y / 2);
AddChild(floatingText);
floatingText.Initialize(text, color, startPosition, type);
_isFloatingTextBeingDisplayed = true;
float duration = floatingText.GetAnimationDuration();
await ToSignal(GetTree().CreateTimer(duration), "timeout");
_isFloatingTextBeingDisplayed = false;
}
else
{
await ToSignal(GetTree().CreateTimer(0.1f), "timeout");
}
}
}
private void ShowFloatingText(string text, Color color, FloatingTextType type = FloatingTextType.Pop)
{
_floatingTextQueue.Enqueue((text, color, type));
// Uncomment the following line if you want to start processing immediately,
// otherwise, the background task will pick up the queue in the next iteration.
// ProcessFloatingTextQueue(_cancellationTokenSource.Token);
}