コンパイラ: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と関係なく動作する)
解決方法が皆目見当がつきません。
どなたか、回答をお願いします。
(一応、全ての画像・エクセルデータ、プログラムを圧縮して添付しておきます。
これだけのコードじゃ把握できないという場合は、
お手数ですが、解凍してご利用ください。)