if 文がうまく動作しない
Posted: 2013年4月07日(日) 19:23
				
				また、つまづきました。
敵とプレイヤーの兵士の2種類があって、
敵リストというもので、敵を管理しています。
そして、敵をマップに配置して描画するときにどうしてもバグってしまします。
敵をマップに描画するコードです
敵の初期化に関するコードです
構造体の情報です
問題は、敵をマップに描画するコードのところの
if( 2 == copy.使用中 )
{
...
というとことです。
プレイヤーの兵士は、1で初期化して、敵は2で初期化しているのですが、
どうにも、プレイヤーの兵士のときも、if文を通過しているようです。
プレイヤーの兵士の使用中フラグの値が変更されたときに、ブレークポイントに
ひっかかるように設定したかったのですが、Visual C++ 2010 Express には、その設定が
ありませんでした。
もしかしたら、ほかの場所で、値が書き換えられているかもしれないと思ったので、
テキストに出力しても、直前のあたいは、プレイヤーの兵士の使用中は1でした。
ですので、if( 2 == ... を通ってしまうのが、どうしてもわかりません。
どこにエラーの原因があるのでしょうか?
長くてすいません。
//===追加===
画像を添付します。
敵が右側に表示されればいいのですが、左側にも表示されてしまいます。
これはプレイヤーの兵士の座標なのです。
copy = g_tInfo.敵[y1][x1] としていので、 敵の情報しかいじっていないので、混乱しています。
			敵とプレイヤーの兵士の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] としていので、 敵の情報しかいじっていないので、混乱しています。
