タスクシステム1

タスクシステムとは何か

タスクシステムとは、

  • 複数の「タスク」を並列実行する

仕組みのことです。
 
では、「タスク」というのは何かというと、

  • ゲームを構成する最小単位の要素

のことです。
 
例えば、ブロック崩しにおける、ブロックやパドル、ボールなどが
「タスク」となります。
 
この「タスク」を同時に動かすような仕組みがタスクシステムなのです。
 

タスクの設計

1つの「タスク」には以下の2つ要素が必要となります。

  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);
}

 
タスクの基本的な考え方は、以上となります。
(つづく)