• ベストアンサー

#ifdefはどうやって使う?

よろしくお願いします。 現在趣味でゲームを作っています。 普通の#ifdefの使い方は存じているのですが、以下のような場合どうすればいいのでしょうか。 ゲームにはイージーと、ノーマルで2種類のレベルが設定出来ます。 イージーの場合は、最初の定義から、ボスのショットである boss_shot1()関数は上のイージー用の関数を通ります。 ノーマル設定の場合、 #define EASYを注釈にすることで、ノーマルの設定のboss_shot1();を通ります。 #define EASY #ifdef EASY void boss_shot1(){   //イージー用のショット } #else void boss_shot1(){   //ノーマル用のショット } #endif しかしこれでは、プログラム内でレベル設定をする事が出来ません。 注釈にしてコンパイルしたものと、#define EASYをそのままにしてコンパイルしたもの、2つの実行ファイルで レベル分けをしないといけません。 うまくプログラム内でこの条件分岐が出来ないでしょうか? 内容の違う関数は関数名を変えて記述するしかないのでしょうか? よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • aris-wiz
  • ベストアンサー率38% (96/252)
回答No.1

普通動作中のプログラムの設定を変える場合に プリプロセッサは使いません。 というより、使えません。 ゲームなどの難易度の変数、または引数を つくり関数の中で普通のif文を使って処理を 分けるだけです。 typedef enum {  HAERD = 0,  NOMALE,  EASY, }GAME_LEVEL; /* ゲームの難易度を引数かグローバルにでも */ void boss_shot1( GAME_LEVEL lv ){  if ( lv == HAERD ){   //ハード用のショット  } else if ( lv == NOMALE ){   //ノーマル用のショット  } else {   //イージー用のショット  } } #今回は意味不明なレベルが渡されると全て #EASYにしていますが特に意味はありません。 #(インデントは全て全角です)

Directxq
質問者

お礼

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

その他の回答 (2)

  • zwi
  • ベストアンサー率56% (730/1282)
回答No.3

#ifや#ifdefは、デモバージョン/配布バージョン/デバックバージョンなどをコンパイル時にオプション指定で実行ファイルを作り分ける時などに使います。 敵やボスの強さを難易度分けするのは、やはり難易度を変数に入れて、その変数をif文やswitch文で条件分岐して、難易度別の処理を書くしかないですね。 敵の数や攻撃タイミングだけだったらレベル別のテーブル持つだけで簡単に処理出来ますが、攻撃モーションとかまで違うと専用のプログラムが必要になりますね。

Directxq
質問者

お礼

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

  • redfox63
  • ベストアンサー率71% (1325/1856)
回答No.2

普通はそういった要望には変数で場合わけでしょう #ifdefでコードレベルで変える必要は無いと思います int nGameLabel; などと宣言しておいて 2つの場合わけなら if ( nGameLavel == 1 ) { // Normalレベルの処理 } else { // Easyレベルの処理 } といった具合になると思います 3個以上なら switchなどで処理したほうがすっきりするかもしれません #ifdefは デバッグ時などはログデータを出力したい OSの違いが吸収できないのでEXEを分けざるを得ない UNICODEとMBCSで呼び出すAPI関数名の違いを吸収したい などの場合に使います

Directxq
質問者

お礼

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

関連するQ&A