私はゲームに取り組んでいます。私は現在、入力を処理する部分に取り組んでいます。ここには3つのクラスがあり、レベルを開始するProjectInstance
クラスがあり、入力を処理するGameController
と、GameController
によって決定されるコントロールの影響を受けるPlayerEntity
があります。レベルを開始すると、ProjectInstanceはGameController
を作成し、ステップメソッドでEvaluateControls
メソッドを呼び出します。これはゲームループ内で呼び出されます。 EvaluateControls
方法は、ビットのようになります。ポインタが不思議にNULLにリセットされる
void CGameController::EvaluateControls(CInputBindings *pib) {
// if no player yet
if (gc_ppePlayer == NULL) {
// create it
Handle<CPlayerEntityProperties> hep = memNew(CPlayerEntityProperties);
gc_ppePlayer = (CPlayerEntity *)hep->SpawnEntity();
memDelete((CPlayerEntityProperties *)hep);
ASSERT(gc_ppePlayer != NULL);
return;
}
// handles controls here
}
この関数正しく呼び出さとアサートがトリガされることはありません。ただし、この関数が呼び出されるたびに、gc_ppePlayer
はNULLに設定されます。ご覧のとおり、範囲外のローカル変数ではありません。 gc_ppePlayer
がNULLに設定できる唯一の場所は、EvaluateControls
の呼び出しの間に呼び出されていないコンストラクタまたは場合によってはデストラクタにあります。デバッグするとき、gc_ppePlayer
は戻り値の前に正しい値と期待値を受け取ります。もう一度F10キーを押してカーソルを閉じブレースに合わせると、値は0xffffffffに変わります。私はここに迷っています、どうすればこのことが起こりますか?誰でも?
+1最初の部分については、ちょうど私が言うつもりだったが、シングルトンは、私の本の中のパターン)単純なインスタンス化と参照/ポインタはよりモジュール化されています。 –
@ロバート - シングルトンは誤用されるとアンチパターンになる可能性があります。これはよくあるケースです。オブジェクトが本当にシステム内の単一のオブジェクトであり、合法的に1つ以上のものが存在することは決してありませんが、シングルトンパターンは使用するのに最適ですか?生のポインタ/リファレンスよりも優れています。 – LeopardSkinPillBoxHat
..IMHO、少なくともあなたはそれへのアクセスを追跡することができます。 – LeopardSkinPillBoxHat