画像(logo)

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

広告

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

広告

↓発売日:2018年09月22日↓

たった1日で基本が身に付く! C言語 超入門

新品価格
¥2,225から
(2018/10/8 23:10時点)

目次へ戻る

ブロックを表示

今回はブロックを一つだけ作って設置、そこに当たり判定をつけるトコロまでをやっていきたいと思います。

定数の設定

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

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

広告

↓発売日:2016年02月29日↓

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

新品価格
¥2,462から
(2018/10/8 23:25時点)

↓発売日:2018年06月22日↓

スッキリわかるC言語入門

新品価格
¥2,916から
(2018/10/8 23:15時点)

↓発売日:2018年03月09日↓

C言語本格入門 ~基礎知識からコンピュータの本質まで

新品価格
¥3,218から
(2018/10/8 23:16時点)

↓発売日:2017年06月14日↓

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

新品価格
¥2,700から
(2018/10/8 23:17時点)

↓発売日:2018年05月21日↓

作って身につく C言語入門

新品価格
¥2,462から
(2018/10/8 23:18時点)

↓発売日:2017年12月07日↓

新・標準プログラマーズライブラリ C言語 ポインタ完全制覇

新品価格
¥2,678から
(2018/10/8 23:19時点)

↓発売日:2017年02月08日↓

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

新品価格
¥2,700から
(2018/10/8 23:20時点)

↓発売日:2017年09月26日↓

かんたん C言語 [改訂2版] (プログラミングの教科書)

新品価格
¥2,916から
(2018/10/8 23:22時点)