広告
↓発売日:2018年09月22日↓
新品価格 |
今回はブロックを一つだけ作って設置、そこに当たり判定をつけるトコロまでをやっていきたいと思います。
先に今回新しく加えた定数になります。
#define BLOCK_WIDTH 50 #define BLOCK_HEIGHT 10
ブロックの横幅「BLOCK_WIDTH」と縦幅「BLOCK_HEIGHT」になります。
とりあえず自機バーと同じ大きさにしてみました。
ブロックの必要な要素をまとめた構造体になります。
struct BLOCKS{ int x; int y; int flag; int color; }; struct BLOCKS block;
座標を表す「x,y」と色の「color」、あとブロックが存在してるかどうかの「flag」になります。
ブロックが残っていれば「flag=1」、ボールが当たって残っていない場合は「flag=0」のように使います。
今回はブロック一つだけなので「struct BLOCKS block」と一つだけ宣言しました。
ではブロックを初期化します。
void my_init_blocks(){ block.x = 100; block.y = 30; block.flag = 1; block.color = Color_Green; }
お好みの場所に配置して大丈夫ですが配置の座標はブロックの大きさの倍数になるようにしましょう。
後はフラグを設定して色は新しく緑色にしてみました。
では表示してみます。
ブロック表示の「my_draw_block()」です。
void my_draw_block(){ if(block.flag == 1){ DrawBox(X_POSI + block.x,block.y,X_POSI + block.x + BLOCK_WIDTH,block.y + BLOCK_HEIGHT,block.color,true); } }
表示には自機バーの時と同じく「DrawBox()」を使いました。
「if(block.flag == 1」ブロックフラグが「1」の時はブロックを描きます。
座標の指定も自機バーの時と同じく「block.x」、「block.y」で左上の座標だけ指定して後はそこからブロックの大きさ分を足してあげれば大丈夫ですね!
広告
最後に当たり判定です。
当たり判定用関数「my_collision_detection()」に加えます。
自機バーの当たり判定をもう少しだけ細かくしたような当たり判定になります。
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; } } /*左面・右面の当たり判定*/ else if (ball_y >= block.y && ball_y <= block.y + BLOCK_HEIGHT){ /*左面*/ if (ball_x >= block.x && ball_x <= block.x + 3){ ball_x = block.x; x_speed *= -1; block.flag = 0; } /*右面*/ else if (ball_x <= block.x + BLOCK_WIDTH && ball_x >= block.x + BLOCK_WIDTH - 3){ ball_x = block.x + BLOCK_WIDTH; x_speed *= -1; block.flag = 0; } } }
ブロックの当たり判定「上面・下面・左面・右面」の4つのウチの「上面・下面」のみ抜き出してみます。
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; } }
この上面だけの当たり判定は自機バーでもやりましたね。
途中までは同じようにやっていきます。
if (ball_x >= block.x && ball_x <= block.x + BLOCK_WIDTH)
まずはボールの座標がブロックの左端「block.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; }
上面はそのまま「block.y」の高さが上面の高さになりますので、「if (ball_y == block.y)」ここが同じであればちょうど上面の部分とボールのy座標が接した事になります
しかしながら、それだけだと少しずれた場合すり抜けしてしまうのでそこから「3」ピクセル分の範囲に入っていればという条件を加えます。(もちろん「3」ピクセル分じゃなきゃと決まっているワケではないのでそのへんはブロックの大きさなど考慮しながらお好みで調整してください!)
あとはボールの位置を少し補正、方向を変えてあげてフラグを落としてブロックを消滅させます。
下面は「block.y」にブロックの高さである「BLOCK_HEIGHT」を足せば下面の高さになりますね!
/*下面*/ 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; }
同じようにそこから「3」ピクセル分の範囲と「ball_y」との高さを比べるだけです。
左面・右面も同じようにすれば当たり判定は完成です!
ブロックに当たって・・・。
反射!!!
すでにお気づきの方もなんとなく感じてらっしゃる方も何度も言いますがこの当たり判定は「けっこう適当な当たり判定」になります。
ある特定の範囲でしか判定しないのでボールの速さをあげていくとすぐすり抜けてしまいます。(1~5ぐらいのスピードなら大丈夫かも・・・。)
そのあたりは超入門用プログラムなのでご了承ください。
ここまでの中間ソースになります。
それでは次回はブロックを複数表示したいと思います。
広告
↓発売日: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日↓
新品価格 |