#define TASK_MAX 200
#define ENM_MAX 100
#define ENM_SHOT_MAX 100
//タスクシステム?
int main() {
Task* task[TASK_MAX];
Enm* enm[ENM_MAX];
EnmShot* enmShot[ENM_SHOT_MAX];
//EnmクラスとEnmShotクラスはTaskクラスを継承したクラス
//初期化
for(int index = 0; index < TASK_MAX; index++) {
task[index] = NULL;
}
for(int index = 0; index < ENM_MAX; index++) {
enm[index] = NULL;
}
for(int index = 0; index < ENM_SHOT_MAX; index++) {
enmShot[index] = NULL;
}
//何らかのきっかけでインスタンスを生成する
for(int index = 0; index < ENM_MAX; index++) {
if(enm[index] == NULL) {
enm[index] = new Enm;
break;
}
}
for(int index = 0; index < ENM_SHOT_MAX; index++) {
if(enmShot[index] == NULL) {
enmShot[index] = new EnmShot;
break;
}
}
//タスクシステムに登録
for(int index = 0; index < ENM_MAX; index++) {
if(enm[index] != NULL) {
for(int index_ = 0; index_ < TASK_MAX; index_++) {
if(task[index_] == NULL) {
task[index_] = enm[index];
break;
}
}
break;
}
}
for(int index = 0; index < ENM_SHOT_MAX; index++) {
if(enmShot[index] != NULL) {
for(int index_ = 0; index_ < ENM_SHOT_MAX; index_++) {
if(task[index_] == NULL) {
task[index_] = enmShot[index];
break;
}
}
break;
}
}
//何らかのきっかけで任意のタスクを削除、インスタンスも破棄する
//インスタンスが登録されたタスクの番号を保持している必要がある
task[インスタンスが登録されている番号] = NULL;
delete enm[破棄したいインスタンスの番号];
enm[破棄したいインスタンスの番号] = NULL;
//タスクの実行
//Calc()とDraw()はオーバーライドされた関数
//この多態性を活かしたいのだと思う
for(int index = 0; index < TASK_MAX; index++) {
if(task[index] != NULL) {
task[index]->Calc();
task[index]->Draw();
}
}
//インスタンスの破棄
for(int index = 0; index < ENM_MAX; index++) {
delete enm[index];
}
for(int index = 0; index < ENM_SHOT_MAX; index++) {
delete enmShot[index];
}
return 0;
}
では、上記のコードの様に固定長のタスクリストはいけないんでしょうか。
そもそも、上記のコードがタスクシステムになっているかどうかが怪しいのですが・・・。
コードが長くなるので説明の簡単のために、Taskクラスのインスタンスを保持してタスクの登録と削除を行うTaskMgrクラスを定義せずに、上記の様にタスクの登録と削除をしています。
また、上記のコードはタスクを削除した後にタスクの整理(タスクの穴が出来ない様に、登録してあるタスクを前に詰める作業)をしていないので、タスクの実行時にタスクの最大登録数分ループしなければなりません。
そうではなく、タスクの整理をして次のタスクがヌルポインタかどうかを判断すれば、必要最小限でループが終了します。
ただ、タスクの最大登録数に依存すると思いますが、タスクの最大登録数分ループする時間とタスクを整理する時間の長さ、一般的にはどちらの処理の時間が短いのでしょうか。