敵とプレイヤーの兵士の2種類があって、
敵リストというもので、敵を管理しています。
そして、敵をマップに配置して描画するときにどうしてもバグってしまします。
敵をマップに描画するコードです
//=============================================================================
void マップの描画(敵配置用)()
{
// マップの描画
int x, y;
for( y=0; y<DEF_MAP_Y; y++ )
{
for( x=0; x<(DEF_MAP_X); x++ )
{
// 背景の描画
// ユニットの描画
if( 1 == g_tInfo.map[y][x].ユニットがいるか )
{
_tHeisi copy;
int x1, y1;
x1 = g_tInfo.map[y][x].兵士のインデックス.x;
y1 = g_tInfo.map[y][x].兵士のインデックス.y;
copy = g_tInfo.敵[ y1 ][ x1 ];
if( 2 == copy.使用中 )
{
DrawGraph( 176+x*32, 136+y*32, g_tInfo.image_mark[ copy.職業-1 ], TRUE );
DrawGraph( 176+x*32, 136+y*32, g_tInfo.image_suuzi[ copy.レベル ], TRUE );
DrawFormatString( 176+x*32, 136+y*32, GetColor(0,255,0), _T("%d (%d,%d)"), copy.使用中 );
}
}
// 枠の描画
DrawBox( 176+x*32, 136+y*32, 176+(x+1)*32, 136+(y+1)*32, GetColor(255,255,255), false );
}
}
}
// 兵士の初期化
memset( &g_tInfo.heisi, 0, sizeof(g_tInfo.heisi) );
memset( &g_tInfo.map, -1, sizeof(g_tInfo.map) );
memset( &g_tInfo.敵, -1, sizeof(g_tInfo.敵) );
// 兵士の初期化
int x, y;
for( y=0; y<DEF_HEISI_Y*0.6; y++ )
{
for( x=0; x<DEF_HEISI_X; x++ )
{
int r_x = rand()%(DEF_MAP_X/3);
int r_y = rand()%DEF_MAP_Y;
if( 1 == g_tInfo.map[r_y][r_x].ユニットがいるか )
{
x--;
continue;
}
g_tInfo.heisi[y][x].使用中 = 1;
g_tInfo.heisi[y][x].職業 = y%6 + 1;
g_tInfo.heisi[y][x].レベル = rand()%9 + 1;
g_tInfo.heisi[y][x].ID = CreateID();
g_tInfo.heisi[y][x].配置.x = r_x;
g_tInfo.heisi[y][x].配置.y = r_y;
g_tInfo.map[ r_y ][ r_x ].兵士のインデックス.x = x;
g_tInfo.map[ r_y ][ r_x ].兵士のインデックス.y = y;
g_tInfo.map[ r_y ][ r_x ].ユニットがいるか = 1;
}
}
// 敵の初期化
for( y=0; y<DEF_HEISI_Y*0.3; y++ )
{
for( x=0; x<DEF_HEISI_X; x++ )
{
int r_x = rand()%(DEF_MAP_X/3) + ((DEF_MAP_X/3)*2);
int r_y = rand()%DEF_MAP_Y;
if( 1 == g_tInfo.map[r_y][r_x].ユニットがいるか )
{
x--;
continue;
}
g_tInfo.敵[y][x].使用中 = 2;
g_tInfo.敵[y][x].職業 = y%6 + 1;
g_tInfo.敵[y][x].レベル = rand()%9 + 1;
g_tInfo.敵[y][x].ID = CreateID();
g_tInfo.敵[y][x].配置.x = r_x;
g_tInfo.敵[y][x].配置.y = r_y;
g_tInfo.map[ r_y ][ r_x ].兵士のインデックス.x = x;
g_tInfo.map[ r_y ][ r_x ].兵士のインデックス.y = y;
g_tInfo.map[ r_y ][ r_x ].ユニットがいるか = 1;
}
}
// 兵士の構造体
struct _tHeisi
{
int 使用中; // 1:プレイヤーの兵士 2:敵の兵士 0:無効な値
int 職業; // 種類 eEnu_勇者, eEnu_ナイト...
int レベル; // 現在のレベル
int 最大HP; // 最大HP
int HP; // 現在のHP
int 最大MP; // 最大MP
int MP; // 現在のMP
int 攻撃力; // 攻撃力
int 攻撃タイプ; // 攻撃タイプ eEnu_剣, eEnum_槍...
int 防御力; // 防御力
int 素早さ; // 素早さ
int 移動力; // 移動力
int 経験値; // 経験値
int コスト; // コスト
int 状態; // 状態
int 行動ポイント; // 行動ポイント
POINT 配置; // 配置された座標(初期値)
POINT 座標; // 現在の座標(戦闘時)
int ID; // アイディ
};
typedef enum
{
eEnu_勇者 = 1,
eEnu_ナイト,
eEnu_海賊,
eEnu_ようへい,
eEnu_魔道士,
eEnu_アーチャー,
};
typedef enum
{
eEnu_剣 = 1,
eEnu_槍,
eEnu_斧,
eEnu_魔法,
eEnu_弓,
};
// マップの構造体
typedef struct
{
int 背景;
POINT 兵士のインデックス; // 0,0 も有効
int ユニットがいるか; // 0:いない 1:いる
} _tMap;
if( 2 == copy.使用中 )
{
...
というとことです。
プレイヤーの兵士は、1で初期化して、敵は2で初期化しているのですが、
どうにも、プレイヤーの兵士のときも、if文を通過しているようです。
プレイヤーの兵士の使用中フラグの値が変更されたときに、ブレークポイントに
ひっかかるように設定したかったのですが、Visual C++ 2010 Express には、その設定が
ありませんでした。
もしかしたら、ほかの場所で、値が書き換えられているかもしれないと思ったので、
テキストに出力しても、直前のあたいは、プレイヤーの兵士の使用中は1でした。
ですので、if( 2 == ... を通ってしまうのが、どうしてもわかりません。
どこにエラーの原因があるのでしょうか?
長くてすいません。
//===追加===
画像を添付します。
敵が右側に表示されればいいのですが、左側にも表示されてしまいます。
これはプレイヤーの兵士の座標なのです。
copy = g_tInfo.敵[y1][x1] としていので、 敵の情報しかいじっていないので、混乱しています。