コンパイラ:Visual C++ 2008 Express Edition
OS:Vista
今、C++の勉強をしていて、クラスやSTL、テンプレートなどを多く使ったシューティングゲームを作っています。
このサイトを参考に、敵のデータをエクセルで管理しようと思いました。
パターンデータや敵の種類は定数で管理していたので、文字列から定数へキャストする関数を作りました。
template<class CAST_ENUM> int EnemyControl::CastCharToEnum(CAST_ENUM e_error, CAST_ENUM e_max, const char c_state_letter[/url][60], const char *cast_char, int number) { CAST_ENUM cast_enum = e_error; for(int i = 0; i<e_max; ++i) { if(strcmp(c_state_letter,cast_char) == 0) { cast_enum = static_cast<CAST_ENUM>(i); break; } } return cast_enum; }
という関数です。
enum ENEMY_PATTERN { PATTERN_ERROR = -1, NORMAL_MOVE = 0, GOING_STRAIGHT_MOVE, GO_DOWN_MIDDLE_AND_COMEBACK, PATTERN_MAX }; const char CAST_CHAR_PATTERN[PATTERN_MAX][60] = { "NORMAL_MOVE", "GOING_STRAIGHT_MOVE", "GO_DOWN_MIDDLE_AND_COMEBACK" }; enum ENEMY_KIND { KIND_ERROR = -1, GREEN_ENEMY = 0, RED_ENEMY, BLACK_ENEMY, KIND_MAX }; const char CAST_CHAR_KIND[KIND_MAX][60] = { "GREEN_ENEMY", "RED_ENEMY", "BLACK_ENEMY" };
このように、ENEMY_PATTERNとENEMY_KINDという定数があります。
そして、それぞれに対応した二次元文字列配列を宣言しています。
エクセルには、パターンが6列目、種類が7列目に書いてあるので、
ロードの際は
case 5: newloadEnemy.tem_pattern = static_cast<ENEMY_PATTERN>(CastCharToEnum<ENEMY_PATTERN>(PATTERN_ERROR,PATTERN_MAX,CAST_CHAR_PATTERN,cMemoly,column)); break; case 6: newloadEnemy.kind = static_cast<ENEMY_KIND>(CastCharToEnum<ENEMY_KIND>(KIND_ERROR,KIND_MAX,CAST_CHAR_KIND,cMemoly,column)); break;
といった形でロードしています。
(cMemolyはこのサイトでいうinputcにあたります。columnはnにあたります。)
このとき、case 5の場合はしっかりと動作するのですが、
case 6では何故かうまく動作せず、全て戻り値が-1になってしまいます。
ちなみに、エクセルでパターンを7列、種類を6列にして、
case 5に static_cast<ENEMY_KIND>(・・・ を
case 6に static_cast<ENEMY_PATTERN>(・・ を移動したところ、
同じようにcase 5は動作するのですが、6は動作しません。
(つまり、ENEMY_KINDとENEMY_PATTERNと関係なく動作する)
解決方法が皆目見当がつきません。
どなたか、回答をお願いします。
(一応、全ての画像・エクセルデータ、プログラムを圧縮して添付しておきます。
これだけのコードじゃ把握できないという場合は、
お手数ですが、解凍してご利用ください。)