当たり判定が追加した敵を倒しても復活してしまう

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
maliopop
記事: 3
登録日時: 5年前

当たり判定が追加した敵を倒しても復活してしまう

#1

投稿記事 by maliopop » 5年前

dxlibとC++を用いてVisual Studio2015で簡単なインベーダーゲーム的な作品を作成しているのですが当たり判定を追加したら、弾は当たるのですが当たった瞬間敵1が少し違う座標に復活してしまいます。

何を変えればちゃんと消せるようになるでしょうか?
まだまだ初心者なのでわかりやすく教えて頂けるとありがたいです。

一応全文コードを貼っておきます。

コード:

struct obj 
{
	int x, y; //表示座標
	int flag; //存在フラグ


};

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine,
	int nCmdShow)
{
	ChangeWindowMode(TRUE); //ウインドウモードに変更
	if (DxLib_Init() == -1) //DXライブラリ初期化
	{
		return -1; //エラーが起きたら終了
		SetDrawScreen(DX_SCREEN_BACK);
	}

	int i, j;	//for文用
	int gh;		//グラフィックハンドルを入れる変数
	int bgh;	//弾の画像ハンドル
	int egh;	//敵の画像ハンドル
	int pgh;	//プレイヤーの画像ハンドル
	int px, py;

	int psizex, psizey; //プレイヤー当たり判定幅
	int bsizex, bsizey; //弾当たり判定幅
	int esizex, esizey; //敵当たり判定幅
	psizex = 40;	//プレイヤーあたり判定サイズx
	psizey = 30;	//プレイヤーあたり判定サイズy
	bsizex = 10;	//弾あたり判定サイズx
	bsizey = 10;	//弾あたり判定サイズy
	esizex = 40;	//敵あたり判定サイズx
	esizey = 40;	//敵あたり判定サイズy 

	int bflag[20];
	int bx[20], by[20];
	int cool_time;
	for (i = 0; i < 20; i++) {
		bflag[i] = 0;
		bx[i] = 0;
		by[i] = 0;
	}
	cool_time = 0;
	bgh = LoadGraph("bullet.bmp");
	char Key[256]; //キーの入力を記録する配列
	int back = LoadGraph("back.bmp");
	
	//敵1読込み
	gh = LoadGraph("enemy.bmp");
	struct obj enemy1[5];	//敵1を5体作成
	for (i= 0; i < 5; i++) {
		enemy1[i].x = 200 + i * 100;
		enemy1[i].y = 0;
		enemy1[i].flag = 0;
	}
	
	
	//敵2読込み
	egh = LoadGraph("enemy_2.bmp"); //敵画像の読込み
	struct obj enemy2[10]; //10体敵2を作成
	for (i = 0; i < 10; i++) {
		enemy2[i].x = 0;		//敵の初期座標
		enemy2[i].y = 0;
		enemy2[i].flag = 0;	//敵は最初存在しないため消しておく
	}
	int e_counter;	//敵の出現カウンター
	e_counter = 0;
	
	//プレイヤー読込み
	pgh = LoadGraph("player.bmp");
	px = 300; //プレイヤー表示座標に初期値代入
	py = 400;
	
	
	//描画ここから
	for(;;) {
		GetHitKeyStateAll(Key); //キーボードのすべてのキーの押下状態を Key に記録する

		//背景の画像を描画
		DrawGraph(0, 0, back, FALSE);

		//プレイヤー画像の表示
		DrawGraph(px, py, pgh, TRUE);

		//敵1描画
		for (i = 0; i < 5; i++) {
			if (enemy1[i].flag == 1) {
				DrawGraph(enemy1[i].x, enemy1[i].y, gh, TRUE); //敵1画像を描画
			}
		}

		//敵2描画
		for (i = 0; i < 10; i++) {								//敵 10 体分処理を行う
			if (enemy2[i].flag == 1) {							//敵が存在している場合
				DrawGraph(enemy2[i].x, enemy2[i].y, egh, TRUE);	//敵2画像を描画する
			}
		}
		
		//弾描画
		for (i = 0; i < 20; i++) {		//弾20発分の処理
			if (bflag[i] == 1) {		//弾が存在している場合のみ描画する
				DrawGraph(bx[i], by[i], bgh, TRUE);
			}
		}

		//自機の移動
		if (Key[KEY_INPUT_LEFT] == 1) //左が押されている場合
		{
			px -= 5; //自機の速さ
		}

		if (Key[KEY_INPUT_RIGHT] == 1) //右が押されている場合
		{
			px += 5; //自機の速さ
		}

		// 自機が画面左端より外へ出た場合(640 はウィンドウサイズ)
		if (px < 0) px = 0;

		// 自機が画面右端より外へ出た場合(640 はウィンドウサイズ)
		if (px > 640 - 64) px = 640 - 64;


		//敵1の移動
		for (i = 0; i < 5; i++) {
			if (enemy1[i].x > 600)	//画像が画面右端より外へ出た場合(640 はウィンドウサイズ)
			{
				enemy1[i].flag = 1; //画像の進行方向を左にする
				enemy1[i].y += 45;  //下に行く幅
			}
			else if (enemy1[i].x < 0 - 64)	//画像が画面左端より外へ出た場合
			{
				enemy1[i].flag = 0; //画像の進行方向を右にする
				enemy1[i].y += 45;	//下に行く幅
			}
			if (enemy1[i].flag == 0)
			{
				enemy1[i].x += 4;   //画像を右に移動させる
			}
			else if (enemy1[i].flag == 1)
			{
				enemy1[i].x -= 4;   //画像を左に移動させる
			}
		}

		//弾の発射
		if (Key[KEY_INPUT_SPACE])	//スペースキーが押されている場合
		{
			if (cool_time < 0)
			{
				for (i = 0; i < 20; i++)	
				{
					if (bflag[i] == 0) //弾が発射可能
					{
						break; 
					}
				}
				if (i < 20)		//全ての弾が発射状態の場合、i は20になる。
				{
					//i が20より小さい場合のみ処理を行う
					bflag[i] = 1;			
					bx[i] = px + 25;		//弾をプレイヤーの中心に移動
					by[i] = py + 10;
					cool_time = 45;			//次弾発射までの時間
				}
			}
		}
		cool_time -= 1; //次弾発射までのカウントを減らす

		//弾の移動
		for (i = 0; i < 20; i++) {	
			if (bflag[i] == 1)		//弾が存在している場合
			{
				by[i] -= 10;		//弾の座標を上方向へ移動させる
				if (by[i] < 0)		//弾が画面外へ移動した場合
				{
					bflag[i] = 0;	//弾を消す
				}
			}
		}

		//敵2の出現
		if (e_counter % 30 == 0) {			//30 カウントごとに処理を行う
			for (i = 0; i < 10; i++) {		
					if (enemy2[i].flag == 0) {
						break;
					}
			}
			if (i < 10) {				
										
				enemy2[i].flag = 1;			
				enemy2[i].x = GetRand(640);	//敵のx座標をランダムに決定する
				enemy2[i].y = 0;			//敵を画面一番上に表示
			}
		}
		e_counter += 1;

		//敵2の移動
		int speed = 0;
		for (i = 0; i < 10; i++) {
			if (enemy2[i].flag == 1) { 
				enemy2[i].y += 3;
				enemy2[i].y += speed;	//速さを代入する
				speed++;				//加速させる
				if (enemy2[i].y > 480) {
					enemy2[i].flag = 0;
				}
			}
		}

		//敵1と弾の当たり判定
		for (i = 0; i < 20; i++) {
			for (j = 0; j < 5; j++) {
				//敵1と弾の当たり判定
				if (bflag[i] == 1 && enemy1[j].flag == 1) {
					if (bx[i] < enemy1[j].x + esizex &&
						bx[i] + bsizex > enemy1[j].x &&
						by[i] < enemy1[j].y + esizey &&
						by[i] + bsizey > enemy2[j].y) {
							bflag[i] = 0;
							enemy1[j].flag = 0;
					}
				}
			}
		}

		//敵2と弾のあたり判定
		for (i = 0; i < 20; i++) {		//弾の弾数回処理を行う
			for (j = 0; j < 10; j++) { //敵2の数分処理を行う

				//敵2と弾が両方とも存在している場合
				if (bflag[i] == 1 && enemy2[j].flag == 1) {
					//当たり判定
					if (bx[i] < enemy2[j].x + esizex &&
						bx[i] + bsizex > enemy2[j].x &&
						by[i] < enemy2[j].y + esizey &&
						by[i] + bsizey > enemy2[j].y) {
						bflag[i] = 0;		//命中したので弾を消す
						enemy2[j].flag = 0;	//命中したので敵2を消す
					}
				}
			}
		}

		//敵1とプレイヤーの当たり判定
		for (i = 0; i < 5; i++) {		//敵1の回数分処理を行う
			if (enemy1[i].flag == 1) {		//敵1が存在している場合
				//当たり判定の判断
				if (enemy1[i].x < px + psizex &&
					enemy1[i].x + esizex > px &&
					enemy1[i].y < py + psizey &&
					enemy1[i].y + esizey > py) {
					enemy1[i].flag = 0; //命中したので敵1を消す
				}
			}
		}

		//敵2とプレイヤーの当たり判定
		for (i = 0; i < 10; i++) {		//敵2の回数分処理を行う
			if (enemy2[i].flag == 1) {		//敵2が存在している場合
				//当たり判定の判断
				if (enemy2[i].x < px + psizex &&
					enemy2[i].x + esizex > px &&
					enemy2[i].y < py + psizey &&
					enemy2[i].y + esizey > py) {
					enemy2[i].flag = 0; //命中したので敵2を消す

					//game_state = 2; //ゲーム状態をゲームオーバーにする
				}
			}
		}

		//ダブルバッファリング処理
		SetDrawScreen(DX_SCREEN_BACK);
		ScreenFlip();
		ClearDrawScreen();
						   
		if (Key[KEY_INPUT_ESCAPE] == 1) //エスケープが押された場合
		{
			break; 
		}
		if (ProcessMessage() == -1) //ウィンドウのメッセージ処理
		{
			break; //ウィンドウのメッセージ処理にエラーが発生した場合ループを抜ける
		}
	}
	
	WaitKey(); // キー入力待ち
	DxLib_End(); // DXライブラリ使用の終了
	return 0;
}

アバター
みけCAT
記事: 6734
登録日時: 13年前
住所: 千葉県
連絡を取る:

Re: 当たり判定が追加した敵を倒しても復活してしまう

#2

投稿記事 by みけCAT » 5年前

「存在フラグ」のはずのflagメンバが「方向フラグ」としても使われてしまっているようなので、
方向を表すデータを別のメンバで管理するようにするといいと思います。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

maliopop
記事: 3
登録日時: 5年前

#3

投稿記事 by maliopop » 5年前

返信遅れてすみません。
みけCATさんのおかげで解決しました!
ありがとうございます!!

返信

“C言語何でも質問掲示板” へ戻る