<戻る

STGつくろー!
その8 CShootingCharacterクラスのリファクタリング

 「その7」で弾を管理するCBulletManagerクラスを作成し、弾に関する基本機能をこのクラスに委譲しました。よって、これまでのクラスで弾を独自に生成してきた部分をこのクラスに入れ替える必要があります。


@ CShootingCharacterの弾生成機構の改正

 弾を扱っていたクラスとして、まずCShootingCharacterをリファクタリングします。

 変更は5箇所、

  ・クラスの中にCBulletManagerオブジェクトのスマートポインタ保持(コンポジション)
  ・Shoot関数での弾オブジェクトの生成をCBulletManagerオブジェクトに委譲
  ・GoNext関数でCBulletManagerクラスのGoNext関数も呼ぶ
  ・CCharacterクラスのGoNext関数を仮想関数にする
  ・Clash関数の引数をポインタからスマートポインタへ変更

4番目は忘れやすい所です。

CShootingCharacter.h
// コンストラクタ
CShootnigCharacter::CShootingCharacter()
{
  // デフォルトの弾管理者
   m_spBulletManager.SetPtr(new CBulletManager);
}


// 弾管理人設定
void CShootingCharacter::SetBulletManager(sp<CBulletManager> mng)
{
   m_spBulletManager = mng;
}



// 弾を打つ
sp<CBullet> CShootingCharacter::Shoot()
{
   // CBulletオブジェクトを生成
   sp<CBullet> tmpBullet = m_pBulletManager->Create(0);

   // 弾の初期位置を決定
      tmpBullet->SetPosition(
                           GetPosition().x,
                           GetPosition().y,
                           GetPosition().z
                           );

   return tmpBullet;
}


void CShootingCharacter::GoNext()
{
   CCharacter::GoNext();   // 自分自身を移動
   m_pBulletManager->GoNext();   // 弾を移動
}

Clash関数の引数はこれまでCBullet*型でしたが、これをsp<CBullet>に変更します。
 これらの変更によって、これまで作ってきたテストコードも再びコンパイルエラーが出るようになります。CBulletを直接作って関数に渡しているためです。今後は、CBulletをスマートポインタとして動的に作成して渡すようにします。