Contents
ボールが跳ね返る方向を変える
前回まででブロック崩しらしくなったのですが、バーにボールが当たったときの跳ね返りが一定だったために面白みに欠けるものがありました。そこで今回はボールがバーの端にあたった場合は角度が急になるように変化をつけました。
ReflectiveDirection列挙体の作成
まずはReflectiveDirection列挙体を作成します。これは通常の跳ね返りか強く左右に反発するかを示すものです。
1 2 3 4 5 6 7 8 9 |
public partial class Form1 : Form { public enum ReflectiveDirection { StrongLeft, StrongRight, Nomal, } } |
GetReflectiveDirectionメソッドの作成
次にどのような場合に強く反発するのかを決めます。
バーの当たり判定は、ボールが内接する矩形の端とバーの矩形の端が完全に離れていないのであれば「当たり」と判定しています。そこでボールの右側がバーの左側から2/5より外の場合は強く左に反発し、ボールの右側が3/5より外の場合は右に強く反発させます。それ以外は普通に跳ね返ります。
ボールが内接する矩形の端とバーの矩形の端が完全に離れていないのであれば当たり判定しているため、思ったほど強い反発は起きません。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
public partial class Form1 : Form { ReflectiveDirection GetReflectiveDirection() { Rectangle barRect = GetBarRectangle(); Rectangle ballRect = GetBallRectangle(); if(ballRect.Right < barRect.Left + barRect.Width * 2 / 5) return ReflectiveDirection.StrongLeft; else if(ballRect.Left > barRect.Left + barRect.Width * 3 / 5) return ReflectiveDirection.StrongRight; else return ReflectiveDirection.Nomal; } } |
SetBallDirectIfHitBarメソッドの変更
左右に強く反発する場合、ボールの進行方向を変える必要があります。これまでのボールの進行方向によってX成分の符号を変えるべきかどうかは変わってきます。
またボールの進行方向のY成分もただ符号を反転するだけでなく、下に落下しているときだけ符号を反転しています。こうしないとときどきボールがバーの上で振動する現象がおきてしまいます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 |
public partial class Form1 : Form { bool SetBallDirectIfHitBar() { if(IsBarHit()) { ReflectiveDirection refDirect = GetReflectiveDirection(); if(ballDirectY > 0) ballDirectY *= -1; if(refDirect == ReflectiveDirection.StrongLeft) { if(ballDirectX > 0) ballDirectX = -BALL_START_DIRECT_X * 3; else ballDirectX = BALL_START_DIRECT_X * 3; } else if(refDirect == ReflectiveDirection.StrongRight) { if(ballDirectX > 0) ballDirectX = BALL_START_DIRECT_X * 3; else ballDirectX = - BALL_START_DIRECT_X * 3; } else { if(ballDirectX > 0) ballDirectX = BALL_START_DIRECT_X; else ballDirectX = -BALL_START_DIRECT_X; } return true; } return false; } } |