オブジェクトの依存関係に悩む
ゲームとなると、あるオブジェクトが一定の状態になったら別のオブジェクトを new して云々 なんてことが当たり前のようにありますがー
さて、クラス A, B, C とあり、それぞれ Compute() / Draw() を備えており、A-B-C の順で Compute() の後、A-B-C の順で Draw() が呼び出されるとします。
ここで、B::Compute が、A と C を new した時……
C は Draw の前に Compute が1回入るのに対して、A は Compute が1回も呼ばれずに Draw が呼ばれることになります。
………なんか、まずいよね。
仮の話、各オブジェクト N フェーズで delete this されるとした場合、オブジェクトは当然のごとくフェーズをカウントする変数を持つことになるかと思います。で、Compute 内部でそのカウンタをインクリメントしていくと。
やっつけコード的にはこんな感じかしらー
class A
{
int m_nPhaseCount;
int Compute()
{
if(++m_nPhase >= N)
delete this;
}
};
class B
{
int m_nPhaseCount;
int Compute()
{
if(m_nPhase == HOGE)
{ // インスタンスを生成
// オブジェクトは各クラス内のチェインに自動登録されるとする。
new A, new C;
}
if(++m_nPhase >= N)
delete this;
}
};
class C
{
int m_nPhaseCount;
int Compute()
{
if(++m_nPhase >= N)
delete this;
}
};
同時に new しているはずなのに、C より A のインスタンスの方が 1フェーズ遅く削除される事に……
コードを書いている側としては*1「同時に new してるんだから、同時に delete されるだろう」とどうしても期待してしまう部分があるかと思うのですが、こんな状況だと非常にマズイ訳です。
…が、これ、具体的にどう対処するべきなんだろう…
オブジェクトの生成順番を全て把握してコーディングするべきなんでしょうか。…いやーでも、それってすげー大変ですよねぇ。
となると、いきなりオブジェクト管理チェインに挿入せずに、とりあえず一時的なバッファに溜め込んで置きつつ、全ての Draw が呼び終わった後にチェインに挿入しなおすコードを書く…べき…?
んー、どうするのが良いんだろう……。
……そもそも何か根本の部分で間違ってたりするのかしら…。^^;
*1:全て自分のコードではあるのですが…