タスクシステム1
タスクシステムとは何か
タスクシステムとは、
- 複数の「タスク」を並列実行する
仕組みのことです。
では、「タスク」というのは何かというと、
- ゲームを構成する最小単位の要素
のことです。
例えば、ブロック崩しにおける、ブロックやパドル、ボールなどが
「タスク」となります。
この「タスク」を同時に動かすような仕組みがタスクシステムなのです。
タスクの設計
1つの「タスク」には以下の2つ要素が必要となります。
- ワークエリア
- タスク実行関数ポインタ
「ワークエリア」とは「タスク」の位置やステータスなどの情報を格納する領域です。
「タスク実行関数ポインタ」には、そのタスクの振る舞いを設定します。
さらに「タスクシステム」として機能させるには、以下の要素が必要となります。
- 前のタスクへのポインタ
- 次のタスクへのポインタ
つまり、タスクの全てを「双方向リスト」としてしまうわけです。
タスクの実行
タスクを使うと、実行が簡単になります。
サンプルは、以下のようになります。
#include <iostream> //#define NULL 0 using namespace std; // タスク領域 struct TCB { string work; // ワークエリア void (*Execute)(TCB *tcb); // タスク実行関数ポインタ TCB *prev; // 前のタスク TCB *next; // 次のタスク }; // タスク実行 void Run(TCB *tcb) { while(tcb != NULL) { (*tcb->Execute)(tcb); tcb = tcb->next; } } // タスク実行関数の実装 void Exec1(TCB *tcb) {cout << "1つ目実行:" << tcb->work.c_str() << endl;} void Exec2(TCB *tcb) {cout << "2つ目実行:" << tcb->work.c_str() << endl;} void Exec3(TCB *tcb) {cout << "3つ目実行:" << tcb->work.c_str() << endl;} void main() { // タスクの設定 TCB tcb1; TCB tcb2; TCB tcb3; tcb1.work = "ほげ"; tcb1.Execute = Exec1; tcb1.prev = NULL; tcb1.next = &tcb2; tcb2.work = "ぴよ"; tcb2.Execute = Exec2; tcb2.prev = &tcb1; tcb2.next = &tcb3; tcb3.work = "もも"; tcb3.Execute = Exec3; tcb3.prev = &tcb2; tcb3.next = NULL; // タスク実行 Run(&tcb1); }
タスクの基本的な考え方は、以上となります。
(つづく)