画像(logo)

HOME/[C言語DXライブラリ]ブロック崩しの作り方 目次/五日目 ブロックを表示

広告

[C言語 DXライブラリ ブロック崩しの作り方]
五日目 ブロックを表示

広告

↓2016年02月29日発売↓

12歳からはじめる ゼロからの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;

座標を表す「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」との高さを比べるだけです。

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

画像(cdxb_5_1)

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

画像(cdxb_5_2)

反射!!!

アバウトな当たり判定

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

ある特定の範囲でしか判定しないのでボールの速さをあげていくとすぐすり抜けてしまいます。(1〜5ぐらいのスピードなら大丈夫かも・・・。)

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

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

中間ソース4

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

次回

六日目 ブロックを複数表示

□ページの先頭へ□

□目次へ戻る□

□HOME□

広告

↓2017年06月16日発売↓

やさしいC 第5版 (「やさしい」シリーズ)

新品価格
¥2,700から
(2017/5/1 13:05時点)

↓2014年08月09日発売↓

新・明解C言語 入門編 (明解シリーズ)

新品価格
¥2,484から
(2017/5/1 13:08時点)

↓2016年02月20日発売↓

新・解きながら学ぶC言語

新品価格
¥2,160から
(2017/5/1 13:10時点)

↓2017年02月11日発売↓

C言語プログラミング基本例題88 88

新品価格
¥3,024から
(2017/5/1 13:12時点)

↓2016年12月15日発売↓

Cの絵本 第2版 C言語が好きになる新しい9つの扉

新品価格
¥1,490から
(2017/5/1 13:13時点)

↓2017年02月08日発売↓

新・明解C言語で学ぶアルゴリズムとデータ構造 (明解シリーズ)

新品価格
¥2,700から
(2017/5/1 13:15時点)