ボールが当たったらブロックが消える
ボールが当たったらブロックが消える処理を実装します。
ボールはブロックに当たったか
そのためには、まずブロックにあたったかどうかを知る必要があります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
public partial class Form1 : Form { bool IsBlockHit(int colum, int row) { Rectangle blockRect = GetBlockRect(colum, row); Rectangle nowBallRect = new Rectangle(new Point(ballPosX, ballPosY), new Size(BALL_WIDTH, BALL_HEIGHT)); if(blockRect.Right < nowBallRect.Left) return false; if(nowBallRect.Right < blockRect.Left) return false; if(blockRect.Bottom < nowBallRect.Top) return false; if(nowBallRect.Bottom < blockRect.Top) return false; return true; } } |
GetHitBlocksメソッドはループ文のなかでIsBlockHitメソッドをよびます。これでどのブロックに当たったか知ることができます。
まずすでに消されているブロックの当たり判定は必要ありません。なのでループ文のなかで
1 2 |
if(isBreaked[y, x]) continue; |
としています。
それからボールが当たったブロックが見つかったらそれ以外のブロックには当たっていないということになるので、どのブロックに当たったのかがわかるようにしています。戻り値は当たったブロックが見つかった場合はtrue、falseです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
public partial class Form1 : Form { bool GetHitBlocks(ref int colum, ref int row) { colum = row = -1; for(int y = 0; y < BLOCK_ROW_COUNT; y++) { for(int x = 0; x < BLOCK_COLUM_COUNT; x++) { if(isBreaked[y, x]) continue; if(IsBlockHit(x, y)) { colum = x; row = y; return true; } } } return false; } } |
SetBallDirectIfHitBlockメソッドはボールがブロックに当たったらボールの進行方向を変えるためのメソッドです。
ボールがどれかに当たっている場合はGetHitBlocksメソッドの戻り値でわかります。GetHitBlocksメソッドの戻り値がtrueだった場合は、isBreaked[row, colum] = trueとすることでボールがあたったブロックを消します。そしてボールの進行方向のY成分の符号を反転させます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
public partial class Form1 : Form { void SetBallDirect() { SetBallDirectIfHitWall(); SetBallDirectIfHitBar(); SetBallDirectIfHitBlock(); } bool SetBallDirectIfHitBlock() { int colum = -1, row = -1; if(GetHitBlocks(ref colum, ref row)) { ballDirectY *= -1; isBreaked[row, colum] = true; return true; } return false; } } |
これで一応、ブロック崩しらしいものにはなりました。あとはミスの判定、回数を決めてそれ以上のミスをすればゲームオーバーにする、ボールがバーに当たった場合、反射角度が同じだが当たった場所によって変化をつけるなどをすればゲームとしても通用するものになると思われます。