広告
↓発売日:2018年09月22日↓
新品価格 |
いよいよ最終日です。
全ブロックの当たり判定をやっていきたいと思います。
全ブロックの当たり判定と言われると何やら難しそうな事をしそうですが、冒頭でもお話した通りブロック一つ分の当たり判定を全てのブロックに対して「for」ループなどで回すだけで大丈夫です。
if(block.flag == 1){ if (ball_x >= block.x && ball_x <= block.x + BLOCK_WIDTH){ if (ball_y >= block.y && ball_y <= block.y + 3){ ball_y = block.y; y_speed *= -1; block.flag = 0; } else if (ball_y <= block.y + BLOCK_HEIGHT && ball_y >= block.y + BLOCK_HEIGHT - 3){ ball_y = block.y + BLOCK_HEIGHT; y_speed *= -1; block.flag = 0; } } }
前回やったブロック一つ分だけの当たり判定になります。
わかりやすいように上面、下面の判定部分だけ抜き出してみました。
この判定を「for」ループで全てのブロックに対して行っていきます。
for (count = 0;count < MAX_BLOCK;count++){ if(blocks[count].flag == 1){ if (ball_x >= blocks[count].x && ball_x <= blocks[count].x + BLOCK_WIDTH){ if (ball_y >= blocks[count].y && ball_y <= blocks[count].y + COLLISION_SIZE){ ball_y = blocks[count].y; y_speed *= -1; blocks[count].flag = 0; break; } else if (ball_y <= blocks[count].y + BLOCK_HEIGHT && ball_y >= blocks[count].y + BLOCK_HEIGHT - COLLISION_SIZE){ ball_y = blocks[count].y + BLOCK_HEIGHT; y_speed *= -1; blocks[count].flag = 0; break; } } } }
こちらが「for」ループで全ブロックに当たり判定を適用したものになります。
さきほどのブロック一つ分のものと比べてみるとわかると思いますが、
「block.x」
こちらが
↓
「blocks[count].x」
こうなっているだけであとはほぼ一緒ですね!
難しく考えず「for」で回すだけで全ての判定は大丈夫です。
広告
今回の作り方ですと一度判定があった場合、それ以上の判定はありえない上にその後がムダになるので当たり判定のループから「break」文で脱出しておりますが、この「break」文を削除してなおかつその後の「左面・右面」の判定部分を「else」で結ばなければ角に当たった時の判定もいちようしてくれます。
その場合どうなるかと言いますと単純に両方ともプラスマイナスが入れ替わるのでまっすぐ逆方向に反射するのですが、これを利用して角に当たった場合はランダムで
1・x方向のみプラスマイナスを反転
2・x,y方向両方のプラスマイナスを反転
3・y方向のみプラスマイナスを反転
などのようにすれば少しゲームに幅がでてくるかもしれません。
当たり
判定されます!
最終ソースになります。
大変長らくお疲れ様でした!
これで「ブロック崩しの作り方」を終わりにしたいと思います。
最後までお付き合いしていただいた方は感謝です!
完成ソースの方にコメントと共にささやかなスコアボックス・背景なども加えてみたのでもし興味ありましたらのぞいてみてください。
こちらのサイトを通して少しでもプログラミングの魅力を感じていただければ幸いです!
広告
↓発売日:2016年02月29日↓
12歳からはじめる ゼロからのC言語 ゲームプログラミング教室 新品価格 |
↓発売日:2018年06月22日↓
新品価格 |
↓発売日:2018年03月09日↓
新品価格 |
↓発売日:2017年06月14日↓
新品価格 |
↓発売日:2018年05月21日↓
新品価格 |
↓発売日:2017年12月07日↓
新品価格 |
↓発売日:2017年02月08日↓
新・明解C言語で学ぶアルゴリズムとデータ構造 (明解シリーズ) 新品価格 |
↓発売日:2017年09月26日↓
新品価格 |