タスクシステム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日前ほどに知りましたが…(えーー!
(終わり)