なんちゃってコルーチン
描画が止まるようなこととかはなかったので最低限の目標は果たした。
タスク
using System; using System.Collections; using System.Collections.Generic; using System.Linq; using System.Text; namespace WindowsPhoneGame1.Task { class CTask { Func<IEnumerable> m_Task; public CTask(Func<IEnumerable> task) { m_Task = task; } public void Exec() { m_Task().GetEnumerator().MoveNext(); } } }
タスク管理
using System; using System.Collections; using System.Collections.Generic; using System.Linq; using System.Text; namespace WindowsPhoneGame1.Task { class CTaskManager { List<CTask> m_TaskList; public CTaskManager() { m_TaskList = new List<CTask>(); } public void makeTask(CTask task) { m_TaskList.Add(task); } public void deleteTask(CTask task) { m_TaskList.Remove(task); } public void Exec() { foreach (CTask task in m_TaskList) { task.Exec(); } } } }
サンプル
シーンの終了とかでループを抜けるとかにするとシーンの遷移が容易になるかも。
ループに入る前と後が明確なので処理の切り分けが楽かも。初期化処理と終了処理とか。
using System; using System.Collections; using System.Collections.Generic; using System.Linq; using System.Text; using Microsoft.Xna.Framework.Input; using WindowsPhoneGame1.Task; namespace WindowsPhoneGame1.Game { class GameManager { int counter; CTaskManager taskManager; /// <summary> /// ゲーム管理 /// </summary> public GameManager() { counter = 0; taskManager = new CTaskManager(); CTask task = new CTask(Test1); taskManager.makeTask(task); } public void ExecModule() { taskManager.Exec(); } IEnumerable Test1() { while (true) { if (counter > 1000) { break; } System.Diagnostics.Debug.WriteLine("task {0}", counter); ++counter; yield return null; } } } }