Advertisement
cheprogrammer

Coroutine.cs

Sep 3rd, 2019
103
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 3.17 KB | None | 0 0
  1. public class Coroutine
  2.     {
  3.         private readonly Queue<IEnumerator> _queuedCoroutines = new Queue<IEnumerator>();
  4.  
  5.         public bool Finished => _queuedCoroutines.Count == 0;
  6.  
  7.         public WaitForSeconds Awaiting { get; protected set; } = null;
  8.  
  9.         public string Name { get; set; } = string.Empty;
  10.  
  11.         public Coroutine(IEnumerator routine, string name)
  12.         {
  13.             Name = name;
  14.             _queuedCoroutines.Enqueue(routine);
  15.         }
  16.  
  17.         public Coroutine(Func<IEnumerator> routine, string name)
  18.         {
  19.             Name = name;
  20.             _queuedCoroutines.Enqueue(routine.Invoke());
  21.         }
  22.  
  23.         public Coroutine(Action action, string name)
  24.         {
  25.             Name = name;
  26.             _queuedCoroutines.Enqueue(ActionCoroutine(action));
  27.         }
  28.  
  29.         public Coroutine ContinueWith(IEnumerator routine)
  30.         {
  31.             _queuedCoroutines.Enqueue(routine);
  32.             return this;
  33.         }
  34.  
  35.         public Coroutine ContinueWith(Action action)
  36.         {
  37.             _queuedCoroutines.Enqueue(ActionCoroutine(action));
  38.             return this;
  39.         }
  40.  
  41.         public Coroutine ContinueWith(Func<IEnumerator> routine)
  42.         {
  43.             _queuedCoroutines.Enqueue(routine.Invoke());
  44.             return this;
  45.         }
  46.  
  47.         private IEnumerator ActionCoroutine(Action action)
  48.         {
  49.             action.Invoke();
  50.             yield return null;
  51.         }
  52.  
  53.         public void Update(GameTime gametime)
  54.         {
  55.             if(Finished)
  56.                 return;
  57.  
  58.             double finishTimeError = 0;
  59.  
  60.             if (Awaiting != null)
  61.             {
  62.                 Awaiting.Update(gametime);
  63.  
  64.                 if (!Awaiting.Finished)
  65.                     return;
  66.  
  67.                 finishTimeError = Awaiting.ElapsedSeconds - Awaiting.Seconds;
  68.  
  69.                 Awaiting = null;
  70.             }
  71.  
  72.             bool timeCorrectionRequired = false;
  73.  
  74.             do
  75.             {
  76.                 if(_queuedCoroutines.Count == 0)
  77.                     break;
  78.  
  79.                 if (_queuedCoroutines.Peek().MoveNext())
  80.                 {
  81.                     WaitForSeconds seconds = _queuedCoroutines.Peek().Current as WaitForSeconds;
  82.  
  83.                     if (seconds != null)
  84.                     {
  85.                         Awaiting = seconds;
  86.                         Awaiting.ElapsedSeconds += finishTimeError;
  87.  
  88.                         if (Awaiting.Finished)
  89.                         {
  90.                             finishTimeError = Awaiting.ElapsedSeconds - Awaiting.Seconds;
  91.                             timeCorrectionRequired = true;
  92.                         }
  93.                         else
  94.                         {
  95.                             timeCorrectionRequired = false;
  96.                         }
  97.                     }
  98.                     else
  99.                     {
  100.                         timeCorrectionRequired = false;
  101.                     }
  102.                 }
  103.                 else
  104.                 {
  105.                     _queuedCoroutines.Dequeue();
  106.                     timeCorrectionRequired = false;
  107.                 }
  108.  
  109.             } while (timeCorrectionRequired);
  110.         }
  111.     }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement