Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- public class Coroutine
- {
- private readonly Queue<IEnumerator> _queuedCoroutines = new Queue<IEnumerator>();
- public bool Finished => _queuedCoroutines.Count == 0;
- public WaitForSeconds Awaiting { get; protected set; } = null;
- public string Name { get; set; } = string.Empty;
- public Coroutine(IEnumerator routine, string name)
- {
- Name = name;
- _queuedCoroutines.Enqueue(routine);
- }
- public Coroutine(Func<IEnumerator> routine, string name)
- {
- Name = name;
- _queuedCoroutines.Enqueue(routine.Invoke());
- }
- public Coroutine(Action action, string name)
- {
- Name = name;
- _queuedCoroutines.Enqueue(ActionCoroutine(action));
- }
- public Coroutine ContinueWith(IEnumerator routine)
- {
- _queuedCoroutines.Enqueue(routine);
- return this;
- }
- public Coroutine ContinueWith(Action action)
- {
- _queuedCoroutines.Enqueue(ActionCoroutine(action));
- return this;
- }
- public Coroutine ContinueWith(Func<IEnumerator> routine)
- {
- _queuedCoroutines.Enqueue(routine.Invoke());
- return this;
- }
- private IEnumerator ActionCoroutine(Action action)
- {
- action.Invoke();
- yield return null;
- }
- public void Update(GameTime gametime)
- {
- if(Finished)
- return;
- double finishTimeError = 0;
- if (Awaiting != null)
- {
- Awaiting.Update(gametime);
- if (!Awaiting.Finished)
- return;
- finishTimeError = Awaiting.ElapsedSeconds - Awaiting.Seconds;
- Awaiting = null;
- }
- bool timeCorrectionRequired = false;
- do
- {
- if(_queuedCoroutines.Count == 0)
- break;
- if (_queuedCoroutines.Peek().MoveNext())
- {
- WaitForSeconds seconds = _queuedCoroutines.Peek().Current as WaitForSeconds;
- if (seconds != null)
- {
- Awaiting = seconds;
- Awaiting.ElapsedSeconds += finishTimeError;
- if (Awaiting.Finished)
- {
- finishTimeError = Awaiting.ElapsedSeconds - Awaiting.Seconds;
- timeCorrectionRequired = true;
- }
- else
- {
- timeCorrectionRequired = false;
- }
- }
- else
- {
- timeCorrectionRequired = false;
- }
- }
- else
- {
- _queuedCoroutines.Dequeue();
- timeCorrectionRequired = false;
- }
- } while (timeCorrectionRequired);
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement