ブロック崩し:当たり判定

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
ヨシタケ

ブロック崩し:当たり判定

#1

投稿記事 by ヨシタケ » 12年前

何度も同じようなこと書いて申し訳ございません。
ブロックとボールとの当たり判定はバーとボールと同じように
上下の辺にボールが触れるとball.dy*= -1、左右の辺にボールが触れるとball.dx*= -1というようにしました。
たまにボールが不規則な動きをしていたのですが、ずっと当たり判定のことばかり考えていてほかのことも進めたかったので無視していました。
しかし、クリア条件でブロックを消すたびblocknumber が+1されていって一定の値になったときクリアというようにしたのですが、
なぜかブロックが残っている状態でクリアとなってしまうことがあります。ファイルに入っている動画では3つ残った状態ですが2つ残った状態でもなりました。また、全部消しても
クリアにならない場合もありました。
おそらくボールがちょうど横の辺と縦の辺を同時に当たり判定の条件を満たしているの
だと考えています。当たり判定の条件をどのようにするのが一番良いのかよろしければ教えてください。
一応、原因が別にある可能性もありますのでファイルを下記のサイトに上げました。パスワードは「YT2013」です。

http://www1.axfc.net/uploader/Si/so/151809

よろしくお願いします。

nil
記事: 428
登録日時: 13年前

Re: ブロック崩し:当たり判定

#2

投稿記事 by nil » 12年前

単純に

コード:

if( 横にあたっている || 縦にあたっている ){
    blocknumber++;
}
という風に処理をすればいいのではないでしょうか

ヨシタケ

Re: ブロック崩し:当たり判定

#3

投稿記事 by ヨシタケ » 12年前

クリア判定のほうはアドバイス頂いたとおり

コード:

		if(HitLineandCircle(pt[0],ball.hit) == TRUE ||
			HitLineandCircle(pt[1],ball.hit) == TRUE ||
			HitLineandCircle(pt[2],ball.hit) == TRUE ||
			HitLineandCircle(pt[3],ball.hit) == TRUE){
				blocknumber++;
		}
というふうにしたらなんとかなりました。
ボールの不規則な動きについては縦と横の当たり判定両方入ったため変な動きになっていると思ったため縦、横両方両方に入っているときの動きを追加してみたのですが
特に変化はなかったです。

コード:

                        //上と左または右の線に当たってる場合
				if((HitLineandCircle(pt[0],ball.hit) == TRUE && HitLineandCircle(pt[1],ball.hit) == TRUE)||
					(HitLineandCircle(pt[0],ball.hit) == TRUE && HitLineandCircle(pt[2],ball.hit) == TRUE))
				{
					block1[i][j].flag = 1;
					ball.hit.pos.y = block1[i][j].hit.lt.y - 7;
					ball.dy*= -1;
					blocknumber +=1;
                        //上と左または右の線に当たってる場合
				}else if((HitLineandCircle(pt[3],ball.hit) == TRUE && HitLineandCircle(pt[1],ball.hit) == TRUE)||
					(HitLineandCircle(pt[3],ball.hit) == TRUE && HitLineandCircle(pt[2],ball.hit) == TRUE))
				{
						block1[i][j].flag = 1;
						ball.hit.pos.y = block1[i][j].hit.rb.y + 7;
						ball.dy*= -1;
						blocknumber +=1;
				}else{
                             //ひとつの線しかあたっている場合
					if(HitLineandCircle(pt[0],ball.hit) == TRUE){
						block1[i][j].flag = 1;
						ball.hit.pos.y = block1[i][j].hit.lt.y - 7;
						ball.dy*= -1;
						blocknumber +=1;
					}

					if(HitLineandCircle(pt[3],ball.hit) == TRUE){
						block1[i][j].flag = 1;
						ball.hit.pos.y = block1[i][j].hit.rb.y + 7;
						ball.dy*= -1;
						blocknumber +=1;
					}
					if(HitLineandCircle(pt[1],ball.hit) == TRUE){
						block1[i][j].flag = 1;
						ball.hit.pos.x = block1[i][j].hit.rb.x -7;
						ball.dx*= -1;
						blocknumber +=1;
					}
					if(HitLineandCircle(pt[2],ball.hit) == TRUE){
						block1[i][j].flag = 1;
						ball.hit.pos.x = block1[i][j].hit.rb.x +7;
						ball.dx*= -1;
						blocknumber +=1;
					}
				}

ヨシタケ

Re: ブロック崩し:当たり判定

#4

投稿記事 by ヨシタケ » 12年前

すみません自己解決しました。
おそらく、ボールがブロックにめり込むようにならないよう、ボールがブロックにあたったとき、ボールの位置をずらしていたのが行けなかったのだと思います。

閉鎖

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