キャラクタクラス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);
としているのは、CMyCharaとCEnemy01が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(); } } }