キャラクタクラス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();
}
}
}