キャラクター同士の衝突判定について

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

キャラクター同士の衝突判定について

#1

投稿記事 by ケイン » 5年前

今回はキャラクター同士の衝突判定について質問します。
私は今、DXライブラリでベルトスクロールアクションゲームを作っている途中の初心者です。
新ゲームプログラミングの館などのサイトを参考にプログラムを書いてみましたが、現時点でキャラクター同士の衝突判定のところが分からず困っています。こちらが衝突判定部分のプログラムです。

コード:

//敵の追跡
		{
			double sb, sbx, sby, bx, by, sx, sy;

			sx = enemyx / 2;
			sy = enemyy / 2;

			bx = ch.plx / 2;
			by = ch.ply / 2;

			sbx = bx - sx;
			sby = by - sy;

			sb = sqrt(sbx*sbx + sby*sby);

			enesx = sbx / sb * 2;
			enesy = sby / sb * 2;
 
			if (damage==0&&tekiatk==0(((ch.plx > enemyx && ch.plx < enemyx+100)|| //敵がダメージを受けていないかつ敵が攻撃を行っていない、主人公がダメージを受ける範囲内にいない場合、主人公を追いかけ、敵の歩行アニメーションをする
				(ch.plx  < enemyx && ch.plx + 100 > enemyx)) &&
				((ch.ply > enemyy && ch.ply < enemyy+40)||
				(ch.ply  < enemyy  && ch.ply+40  > enemyy ))) == 0)
			{
				{
					enemyx += enesx;
					enemyy += enesy;
					DrawGraph(enemyx - camerax, enemyy-40, eimage[enemygra], FALSE);//敵の歩行アニメーション
					enewcounter++;
					tekiatk = 0;

				}
				{
					if (sayu==0&&(enemyx > ch.plx + 101)|| sayu == 1 && (enemyx > ch.plx + 101))
					
						{
							enemygra = 1 + (enewcounter % 128) / 16;
						}
						if ((enemyx > ch.plx + 101) && (enemyy+40 == ch.ply))//敵が消えてしまう現象を防ぐための補正←効果なし
						{
							enemyy--;
							enemyy--;
						}
						if (enemygra < 9 && (ch.plx == enemyx))//敵が消えてしまう現象を防ぐための補正
						{
							enemyx++;
							enemyx++;
						}
					
				}
				{
					if (sayu==0&&(enemyx < ch.plx +99)|| sayu == 1 && (enemyx < ch.plx + 99))
					
						{
							enemygra = 10 + (enewcounter % 128) / 16;
						}
					if ((enemyx > ch.plx + 99) && (enemyy+40 == ch.ply))//敵が消えてしまう現象を防ぐための補正←効果なし
					{
						enemyy--;
						enemyy--;
					}
						if (enemygra < 18 && (ch.plx == enemyx))//敵が消えてしまう現象を防ぐための補正
						{
							enemyx--;
							enemyx--;

						}
					
				}
			}
				if (sayu==0 && (((ch.plx > enemyx && ch.plx < enemyx + 100) || //主人公が右を向いてて主人公がダメージを受ける範囲内にいる場合、敵の攻撃アニメーションをする
					(ch.plx  < enemyx && ch.plx + 100 > enemyx)) &&
					((ch.ply > enemyy && ch.ply < enemyy + 40) ||
					(ch.ply  < enemyy  && ch.ply + 40 > enemyy))) == 1)
			{
					
				{

					damagetime++;
					dmaecounter++;
					tekiatk = 1;
			    }
				
				if ((enemyx > ch.plx))
					{
					DrawGraph((enemyx - 100) - camerax, enemyy, dmaeimage[dmaei], FALSE);//(前から)敵の攻撃アニメーション
					dmaei = 0 + (dmaecounter % 60) / 20;
					}
					
				if ((enemyx < ch.plx ))
				{
					DrawGraph((enemyx+95) - camerax, enemyy , dusiimage[dusii], FALSE);//(後ろから)敵の攻撃アニメーション
					dusii = 3 + (dmaecounter % 60) / 20;
				}
			}
				if (sayu==1 && (((ch.plx > enemyx && ch.plx < enemyx + 100) || //主人公が左を向いてて主人公がダメージを受ける範囲内にいる場合、敵の攻撃アニメーションをする
					(ch.plx < enemyx && ch.plx + 100 > enemyx)) &&
					((ch.ply > enemyy && ch.ply < enemyy + 40) ||
					(ch.ply  < enemyy  && ch.ply + 40  > enemyy))) == 1)
				{
					
					damagetime++;
					dusicounter++;
					tekiatk = 1;

					if ((enemyx > ch.plx))
					{
						DrawGraph((enemyx-91) - camerax, enemyy, dusiimage[dusii], FALSE);//(前から)敵の攻撃アニメーション
						dusii = 0 + (dusicounter % 60) / 20;
					}
					if ((enemyx < ch.plx))
					{
						DrawGraph((enemyx+100) - camerax, enemyy , dmaeimage[dmaei], FALSE);//(後ろから)敵の攻撃アニメーション
						dmaei = 3 + (dusicounter % 60) / 20;
					}
				}
		}
このプログラムだけでは分からないという方は申し訳ございません。このプログラムで発生している問題は主人公と敵キャラがあるY座標で重なると敵キャラが攻撃のアニメーションを行わないで、そのまま主人公にめり込んで、敵キャラが消えてしまうということです。この問題を解消するためにはどうすればいいのかをご指摘いただける方がいましたらご教授お願い致します。

ケイン
記事: 7
登録日時: 6年前

Re: キャラクター同士の衝突判定について

#2

投稿記事 by ケイン » 5年前

補足:主人公のキャラクター画像サイズは200×200。
敵のキャラクター画像サイズは250×250です。

ISLe
記事: 2650
登録日時: 13年前
連絡を取る:

Re: キャラクター同士の衝突判定について

#3

投稿記事 by ISLe » 5年前

率直に言って、条件が複雑すぎてコードを読む気になりません。

とりあえず、キャラ本体と、攻撃判定の矩形を分離すると、ずっとシンプルなコードになると思います。
まず当たり判定を行い、その結果をもって、条件分けすることで、さらにシンプルになると思います。

・攻撃判定内にキャラがいたら
※当たり判定自体はキャラ同士と同じようにできる
→攻撃してなかったら攻撃の開始処理
→攻撃している最中ならダメージ処理
といった具合に。

ケイン
記事: 7
登録日時: 6年前

Re: キャラクター同士の衝突判定について

#4

投稿記事 by ケイン » 5年前

返信が大変遅くなってしまい申し訳ございません!
かなり複雑ですか(汗)。読みずらいコードですみません!
少し整理をしたところ、敵キャラが消えなくなりました。さらにシンプルにできるように整理していきます。Isleさん、回答していただきありがとうございました!

返信

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