ゲーム開発13:キャラクタ管理クラス作成

キャラクタクラスCCharaを作ろうと思いましたが、その前にキャラクタ管理クラスCCharaManageを作成します。

キャラクタ管理クラスとは、CCharaをまとめて処理するクラスといった感じでしょうか。キャラクタの移動や描画はひとつひとつ別個に処理させず、この管理クラスに全部やってもらいます。

キャラクタの最大数MAX_CHARA分だけCCharaポインタを持ち、CreateChara()にて空いているCCharaポインタがあったら、そこに任意のキャラクタを生成します。キャラクタの種類kindを引数に持ち、ベタですがswitch~caseで生成キャラを選択します。ちなみに

Chara[i]= new CMyChara(i, x, y);
Chara[i]= new CEnemy01(i, x, y);

としているのは、CMyCharaCEnemy01がCCharaを継承したクラスだから可能にしている芸当です。キャラクタを増やす際、CEnemy02:public CCharaみたいに継承クラスを作って追加するだけで、中身が敵だろうとアイテムだろうと関係なく、汎用的に使いまわすことができます。

あとはMove()で移動、Draw()で描画を全キャラ分ループで回しています。キャラクタの寿命が来たらDeleteChara()で、これまた中身を気にせずに削除する事ができます。

次回は今度こそキャラクタクラスを作ります。

//-----------------------------------------------------------------------------
// 生成
CCharaManage::CCharaManage()
{
 int  i;

 // キャラクタ初期化(念のため)
 for (i=0; i<MAX_CHARA; i++) {
  Chara[i]=NULL;
 }
}

//-----------------------------------------------------------------------------
// 解放
CCharaManage::~CCharaManage()
{
 int  i;

 // キャラクタ解放
 for (i=0; i<MAX_CHARA; i++) {
  DeleteChara(i);
 }
}

//-----------------------------------------------------------------------------
// キャラクタ生成
CChara *CCharaManage::CreateChara(int kind, int x, int y, CChara *parent)
{
 int  i;

 // 空いているキャラクタがあるか検索
 for (i=0; i<MAX_CHARA; i++) {
  if (Chara[i]==NULL) {
   break;
  }
  i++;
 }
 if (i>=MAX_CHARA) {
  return NULL;
 }

 switch (kind) {
 case KIND_MYCHARA: // 自キャラ
  Chara[i]= new CMyChara(i, x, y);
  break;
 case KIND_ENEMY01: // 敵キャラ01
  Chara[i]= new CEnemy01(i, x, y);
  break;
 }

 // 自分の親を設定
 if (parent!=NULL) {
  Chara[i]->SetParent(parent);
 }

 return Chara[i];
}

//-----------------------------------------------------------------------------
// キャラクタ解放
void CCharaManage::DeleteChara(int no)
{
 if (Chara[no]!=NULL) {
  delete Chara[no];
  Chara[no]=NULL;
 }
}

//-----------------------------------------------------------------------------
// 移動
int CCharaManage::Move()
{
 int  i, ret;

 for (i=0; i<MAX_CHARA; i++) {
  if (Chara[i]!=NULL) {
   Chara[i]->Move();
  }
 }

 return ret;
}

//-----------------------------------------------------------------------------
// 描画
void CCharaManage::Draw()
{
 int  i;

 for (i=0; i<MAX_CHARA; i++) {
  if (Chara[i]!=NULL) {
   Chara[i]->Draw();
  }
 }
}

コメントを残す

メールアドレスが公開されることはありません。