スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

ゲーム制作状況の報告とか

ゲーム制作状況の報告です。
ちょっと根本の部分を作り直してる途中です。


以前は、

void CSceneGame::Exec(){
m_Player->Move();
m_Dungeon->Move();

m_Player->Draw();
m_Dungeon->Draw();
}


なんかこんな感じで
---------------------------------------------
【1】それぞれの座標を移動させる関数を呼ぶ
【2】移動した後、順に描画関数を呼ぶ

---------------------------------------------
と言う風にしてたんですが、

・描画順の入れ替えが出来ない
・Move関数の中身が汚い事になった


こんな弊害が色々と出てきたので、
このままだとスパゲティコードになると思い、 改良する事にしました。



if(m_MoveType == MOVE_TYPE_WALK){
if(m_state == STATE_IN_WATER){
if(CheckMove(m_direct) == S_OK){
     //中略
}
}else if(m_state == STATE_ON_GROUND){
//中略
}
}else if(m_MoveType == MOVE_TYPE_JUMP){
//中略

}else if(m_MoveType == MOVE_TYPE_STOP){
//中略

}else if(m_MoveType == MOVE_TYPE_TURN_RIGHT){
//中略
}

    :
※以下、延々とif else文が・・・



もうね、見てるだけでやんなってくる長い条件分岐だらけになってしまったんですよ。
で、どういう風に修正したのか?というと、

Move関数を消滅させました。

大体ですね、上記の様な混沌とした条件分岐を、
ザコ敵Aやザコ敵Bとかにも記述するのが面倒なのですよ。
(というか、とてつもなく冗長な気がして仕方がない。)

まぁとりあえず、動かす部分は外部のクラスがやるようにしました。
最初は、位置情報はキャラクターのメンバ変数として持ってたので、

class CCharaBase{
public:
CCharaBase();
~CCharaBase();
private:
D3DXVECTOR3 m_Pos;
D3DXMATRIX m_Mat;
};


動かすクラス(Mover)には、キャラクタクラスの基底クラスを渡していたのですが、

class CMoverBase{
public:
CMoverBase();
virtual ~CMoverBase();

virtual bool Move() = 0;
bool SetChara(const CSharedPtr<CCharaBase>& t_Chara);
private:
CSharedPtr<CCharaBase> m_Chara;
};

(SetCharaクラスで、動かす対象をm_Charaにセット。
 後は、オーバーライドしたMove関数で色々と動かす。)


位置情報を変更するんだから、位置情報だけ渡せばいいな、と思い
(位置情報以外のメンバ変数は、知る必要がない。

"位置情報"自体をクラスとして分離する事にしました。

で、今現在はなんかこんな感じになってます。 ↓

(まだ作りかけですが)
//位置情報クラス
class CPosInfo{
public:
CPosInfo();
~CPosInfo();
private:
D3DXVECTOR3 m_Pos;
D3DXMATRIX m_Mat;
};


//位置情報クラスをメンバにした、キャラクターの基底クラス
class CCharaBase{
public:
CCharaBase();
~CCharaBase();
private:
CSharedPtr m_PosInfo;
};


//位置情報のみを受け取る、Moverの基底クラス
class CMoverBase{
public:
CMoverBase();
virtual ~CMoverBase();

virtual bool Move() = 0;
bool SetChara(const CSharedPtr<CPosInfo>& t_Chara);
private:
CSharedPtr<CPosInfo> m_Chara;
};


//Moverクラスを登録・削除・実行する、Mover管理クラス
class CMoverManager{
public:
CMoverManager();
~CMoverManager();

void Exec();
bool AddMover(const CSharedPtr<CMoverBase>& t_Mover);
private:
std::list<CSharedPtr> m_MoverList;
};





<追記予定!>
スポンサーサイト

テーマ : ゲーム - ジャンル : ゲーム

コメント
コメントの投稿
管理者にだけ表示を許可する



上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。