「敵をポインタで操作する敵」、例えばビットを周りに浮かべている敵を作ろうとしていて躓いています。
ゲーム中に出現するオブジェクトをすべてTaskから派生させて
Task内でnew演算子をオーバーロードして new(0.5f) Object(); のように使って
オブジェクトをnewで作るときに自動的にタスクリストにnewの後の括弧内(0.5f)の数字で若い順に組み込まれるようになっています。
(deleteもオーバーロードしてdeleteで開放すると自動的にリストのポインタがつながるようになっています)
そして、以下のようなコードで「敵をポインタで操作する敵」を作ろうとしているのですが
どうもうまくいきません。具体的になんと言えばいいか、まったく問題なく動くときもあれば、いきなり強制終了するときもあるのです。
//部分部分で省略しています
//teki.h
class Enemy : public TaskEx
{
protected:
public:
Enemy( float x, float y ); //コンストラクタ
virtual ~Enemy(); //デストラクタ
};
class Teki_option : public Enemy
{
protected:
public:
Teki_option( float x, float y ); //コンストラクタ
~Teki_option(); //デストラクタ
void run(void);
void draw(void);
void xy_set( float x, float y ); //外部からxy軸セット
};
class Teki : public Enemy
{
protected:
Teki_option *option[5]; //オプション
public:
Teki( float x, float y ); //コンストラクタ
~Teki(); //デストラクタ
void run(void);
void draw(void);
};
//teki.cpp
Enemy::Enemy( float x, float y )
{
m_cx = x;
m_cy = y;
}
Teki_option::Teki_option( float x, float y ) : Enemy( x, y )
{
//いろいろ初期化
}
void Teki_option::run()
{
//いろいろ処理実行
}
void Teki_option::draw()
{
//描画処理
}
Teki::Teki( float x, float y ) : Enemy( x, y )
{
int i;
for ( i = 0; i < 4; ++ i )
option[i] = new(0.3f) Teki_05_option( 160 - 30 + i * 20, 120 ); //オプションの生成
}
Teki::~Teki()
{
int i;
for ( i = 0; i < 4; ++ i )
if ( option[i] != NULL ) option[i]->die(); //オプションの死亡フラグを立てる
}
void Teki::run()
{
int i;
for ( i = 0; i < 4; ++ i )
{
if ( option[i] != NULL )
{
if ( option[i]->death == TRUE)
option[i] = NULL;
else
option[i]->set( m_log_x[1] - 30 + i * 20, m_log_y[1] + 40 );
}
}
}
void Teki::draw()
{
//描画処理
}
全タスクリスト->run();
全タスクリスト->draw();
死亡フラグがたっているタスクを delete;
という順番で処理すれば、Tekiクラス側はメンバのTeki_optionクラスがdeleteされる前にリンクを切れるので
思い通りに実行できると思うのですが前述のとおり上手くいくときもあれば強制終了するときもあります。
このコードのどこかに間違いがあるのだと思うのですが自分ではわかりません(´・ω・`)
どなたか何かお気づきでしたらご教授お願いいたします。