ページ 11

武器のカスタマイズの選択画面について

Posted: 2013年8月08日(木) 19:40
by LisetteLander
武器(銃や剣)をカスタマイズできるシューティングゲームを作っています。
武器はそれぞれ特殊な動きや効果をつけたかったので、ハードコードでいいやと思い武器1種類につきクラスを1つ定義しました。

カスタマイズ画面で武器のクラス名string配列から選んで選択したクラスをインスタンス化して、キャラクターにセットしたいと思っているのですが、
string文字列からクラス名に変換することになるのですが、これは正しいのでしょうか?

↓こんな感じの処理を武器の種類数分記述することになって、泥臭いコードになるような・・・

コード:

if(SelectWeaponStr == "CHandGun"){
 new CHandGun();
}
Stringの比較なんてやるべきじゃなく、別の方法を探すほうがいいでしょうか?

Re: 武器のカスタマイズの選択画面について

Posted: 2013年8月08日(木) 22:00
by spaaaark・∀・
どうでしょう、比較するものがstring型である必要がないようには思います。

僕の場合なら、名前を比較するより、それぞれの武器にハンドル(0,1,2,...)を打ち、決定した際にそのハンドルに対応した武器のインスタンスを生成すると思います。そうすることにより、
LisetteLander さんが書きました:

コード:

if(SelectWeaponStr == "CHandGun"){
 new CHandGun();
}
のようなif構文のネストで比較する必要がなくなり、さらに状況によっては関数ポインタを利用してインスタンスを生成をすることが可能になると思います。

Re: 武器のカスタマイズの選択画面について

Posted: 2013年8月08日(木) 22:10
by LisetteLander
回答ありがとうございます。

ハンドルというのはどのようなものでしょうか?
いまいちピンと来ないです。
関数ポインタの配列みたいなものでしょうか?
あ、というか関数ポインタの配列って結構いいですね

Re: 武器のカスタマイズの選択画面について

Posted: 2013年8月08日(木) 22:59
by spaaaark・∀・
例えば、武器Aなら0,武器Bなら1,武器Cなら2,... というように、武器の種類にあらかじめ0から番号を振ったものをハンドルとして、そのハンドルを使って条件の分岐を行います。なおハンドルにはもちろんint型(またはshort型)を推奨します。

そのハンドルを使って、たとえば以下のように処理を分けてやればいいのです。

コード:

void WeaponA(){    //// ハンドル0番
    //// 武器Aのインスタンスを生成
}
void WeaponB(){    //// ハンドル1番
    //// 武器Bのインスタンスを生成
}
void WeaponC(){    //// ハンドル2番
    //// 武器Cのインスタンスを生成
}

int main(){
    void (*SetWeapon[])() = {     //// 関数ポインタの宣言
        &WeaponA,&WeaponB,&WeaponC
    };
    int Handle = 1;    //// ここでは武器Bを選択したことになる
    (*SetWeapon[ Handle ])();    //// 関数ポインタから関数を呼び出す
   return 0;
}
このようにすることで、それぞれのインスタンスを生成できます。
また、もし関数ポインタが難しいと思いましたら、switch構文を使うのもありだと思います。

Re: 武器のカスタマイズの選択画面について

Posted: 2013年8月08日(木) 23:26
by LisetteLander
ありがとうございます!関数ポインタ使ってみます!

Re: 武器のカスタマイズの選択画面について

Posted: 2013年8月08日(木) 23:26
by LisetteLander
おっと、解決解決