C言語 入門 ブロック崩しの作り方

五日目 ブロックを表示

入門プログラムの定番のブロック崩しになります!

HOME/ブロック崩しの作り方 目次/五日目 ブロックを表示/

広告

↓2016年02月29日発売↓

12歳からはじめる ゼロからのC言語 ゲームプログラミング教室

新品価格
¥2,462から
(2016/5/10 22:16時点)

もっと!C、C++言語本

目次へ戻る

定数の設定

先に今回新しく加えた定数になります。

#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;

構造体「BLOCKS」になります。

座標を表す「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_field()」にブロック描画も加えます。

if(block.flag == 1){
	DrawBox(block.x, block.y, block.x + BLOCK_WIDTH,
	 block.y + BLOCK_HEIGHT, block.color, true);
}

表示には自機バーの時と同じく「DrawBox()」を使いました。

「if(block.flag == 1」ブロックフラグが「1」の時はブロックを描きます。

座標の指定も自機バーの時と同じく「block.x」、「block.y」で左上の座標だけ指定して後はそこからブロックの大きさ分を足してあげれば大丈夫ですね!

ブロックの当たり判定

では最後に当たり判定です。

自機バーの当たり判定をもう少しだけ細かくしたような当たり判定になります。

if(block.flag == 1){
 if (ball_x >= block.x && ball_x <= block.x + BLOCK_WIDTH){
  if (ball_y == block.y){
   y_direction = 1;
   block.flag = 0;
  }
  else if (ball_y == block.y + BLOCK_HEIGHT){
   y_direction = 0;
   block.flag = 0;
  }
 }
}

ブロックの当たり判定「上面・下面・左面・右面」の4つのウチの「上面・下面」の当たり判定になります。

これの上面だけの当たり判定は自機バーでもやりましたね。

途中までは同じようにやっていきます。

if (ball_x >= block.x && ball_x <= block.x + BLOCK_WIDTH)

まずはボールの座標がブロックの左端「block.x」から右端「block.x + BLOCK_WIDTH」の間に入っているかどうかを確認します。

そしてもし入っている場合に次の処理に移ります。

まずは上面になります。

if (ball_y == block.y){
	y_direction = 1;
	block.flag = 0;
}

上面はそのまま「block.y」の高さが上面の高さになりますのでそこと「ball_y」が同じであれば接しているという事ですね!

なので方向を変えてあげてフラグを落としてブロックを消滅させます。

下面は「block.y」にブロックの高さである「BLOCK_HEIGHT」を足せば下面の高さになりますね!

else if (ball_y == block.y + BLOCK_HEIGHT){	
	y_direction = 0;
	block.flag = 0;
}

同じように「ball_y」との高さを比べるだけです。

左面・右面も同じようにすれば当たり判定は完成です!

画像(b-5-1)

ブロックに当たって・・・。

画像(b-5-2)

反射!!!

すり抜け

すでにお気づきの方もなんとなく感じてらっしゃる方も何度も言いますがこの当たり判定は「だいぶ適当な当たり判定」になります。

まず致命的なのが当たった時の判定を「==」だけで判定しているのでボールの速さを少し変えただけですり抜けします。

そのあたりは超入門用プログラムなのでご了承ください。

ここまでの中間ソースになります。

中間ソース4

それでは次回はブロックを複数表示したいと思います。

次回

六日目 ブロックを表示2

□ページの先頭へ□

□目次へ戻る□

広告

↓2014年06月20日発売↓

14歳からはじめるC言語わくわくゲームプログラミング教室 Visual Studio 2013編

新品価格
¥2,500から
(2016/5/10 22:17時点)

↓2014年10月25日発売↓

超本格! サンプルで覚えるC言語 3Dゲームプログラミング教室

新品価格
¥3,110から
(2016/5/10 22:18時点)

↓2013年07月25日発売↓

小学生からはじめるわくわくプログラミング

新品価格
¥2,052から
(2016/5/10 22:21時点)

↓2016年05月13日発売↓

小学生からはじめるわくわくプログラミング2

新品価格
¥2,052から
(2016/5/10 22:22時点)

もっと!C、C++言語本

□ページの先頭へ□

□HOME□