タスクシステム5

いよいよ最終回です(ようやく?)
今回はタスクシステムを発展させてみます。

C++におけるタスクシステム

これまでは、タスクを「構造体」で定義していました。
 
ですが、せっかくC++を使っているので、
 
「クラス」で実装できないか?

ということを考えてみます。
 
まず、私が考えたレベルでは、

  • タスクリストをSTLのlistで実装する
  • タスクリストを管理するクラスを作る

というところまでは思いついたのですが、

  • タスクのクラス化

というところで、つまづいてしまいました…。
 
キモは「実行関数ポインタ」なのですよね。
 
・・・これの入れ替えをどうやっておこなうべきか…。
 
 
・・・そもそも定義をどうするか…?
 
 
・・・thisポインタを渡すとか、、。それだと構造体と同じか…。
 
 
・・・ストラテジーパターンで実装すべきか…?
 
 
・・・いや、それだとインスタンスの管理が面倒だし、、。
 
 
・・・
 
 
などと、半日悩んでも答えが出なかったので、
Cマガジンの2004/12を見たら、

という方法がのっていたので、引用しておきます。

typedef void (CTask::*EXEC)();
class CTask
{
	・
	・
	EXEC Exec; // 処理関数ポインタ
	void Appear(); // 出現
	void Attack(); // 攻撃
};
// 敵の出現
void CTask::Appear()
{
	・
	・
	Exec = (EXEC)&CTask::Attack; // 攻撃に入れ替え
}

(念のため、、、ホントはCTaskは継承して使います)
あと、タスクの生成・削除については、
CTaskのnew/delete演算子オーバーロードして、
その中でタスクリストに追加・削除を行う、という方法も
紹介されていました。
 
うーん、素晴しい。
 
という感じで、タスクシステムは終了です。
 
タスクシステムを知らなくても、全然ゲームは作れてしまうのですが、
知っておくと、スッキリした処理がかけるようになると思います。
(っていうか、私は5日前ほどに知りましたが…(えーー!
 
(終わり)