電子書籍の厳選無料作品が豊富!

よろしくお願いします。
現在趣味でゲームを作っています。
普通の#ifdefの使い方は存じているのですが、以下のような場合どうすればいいのでしょうか。

ゲームにはイージーと、ノーマルで2種類のレベルが設定出来ます。
イージーの場合は、最初の定義から、ボスのショットである
boss_shot1()関数は上のイージー用の関数を通ります。
ノーマル設定の場合、
#define EASYを注釈にすることで、ノーマルの設定のboss_shot1();を通ります。


#define EASY

#ifdef EASY

void boss_shot1(){
  //イージー用のショット
}

#else

void boss_shot1(){
  //ノーマル用のショット
}

#endif


しかしこれでは、プログラム内でレベル設定をする事が出来ません。
注釈にしてコンパイルしたものと、#define EASYをそのままにしてコンパイルしたもの、2つの実行ファイルで
レベル分けをしないといけません。
うまくプログラム内でこの条件分岐が出来ないでしょうか?

内容の違う関数は関数名を変えて記述するしかないのでしょうか?
よろしくお願いします。

A 回答 (3件)

普通動作中のプログラムの設定を変える場合に


プリプロセッサは使いません。
というより、使えません。

ゲームなどの難易度の変数、または引数を
つくり関数の中で普通のif文を使って処理を
分けるだけです。

typedef enum {
 HAERD = 0,
 NOMALE,
 EASY,
}GAME_LEVEL;
/* ゲームの難易度を引数かグローバルにでも */
void boss_shot1( GAME_LEVEL lv ){
 if ( lv == HAERD ){
  //ハード用のショット
 } else if ( lv == NOMALE ){
  //ノーマル用のショット
 } else {
  //イージー用のショット
 }
}
#今回は意味不明なレベルが渡されると全て
#EASYにしていますが特に意味はありません。
#(インデントは全て全角です)
    • good
    • 0
この回答へのお礼

やはりそうですよね。
ご回答ありがとう御座いました。
内容の違うショットは違う関数名にでもして分けようと思います。
ありがとうございました。

お礼日時:2007/11/19 15:44

#ifや#ifdefは、デモバージョン/配布バージョン/デバックバージョンなどをコンパイル時にオプション指定で実行ファイルを作り分ける時などに使います。



敵やボスの強さを難易度分けするのは、やはり難易度を変数に入れて、その変数をif文やswitch文で条件分岐して、難易度別の処理を書くしかないですね。
敵の数や攻撃タイミングだけだったらレベル別のテーブル持つだけで簡単に処理出来ますが、攻撃モーションとかまで違うと専用のプログラムが必要になりますね。
    • good
    • 0
この回答へのお礼

わかりました。違う関数名などを使って対処しようと思います。ご回答ありがとう御座いました。

お礼日時:2007/11/19 15:45

普通はそういった要望には変数で場合わけでしょう


#ifdefでコードレベルで変える必要は無いと思います

int nGameLabel;
などと宣言しておいて
2つの場合わけなら
if ( nGameLavel == 1 ) {
// Normalレベルの処理
} else {
// Easyレベルの処理
}

といった具合になると思います
3個以上なら switchなどで処理したほうがすっきりするかもしれません

#ifdefは デバッグ時などはログデータを出力したい
OSの違いが吸収できないのでEXEを分けざるを得ない
UNICODEとMBCSで呼び出すAPI関数名の違いを吸収したい
などの場合に使います
    • good
    • 0
この回答へのお礼

用途が違ったのですね。
わかりました。ありがとうございます。関数名をかえるなどして対処しようと思います。

お礼日時:2007/11/19 15:45

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!