画像(logo)

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

広告

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

広告

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

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

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

目次へ戻る

ブロックを複数表示

今回はブロックを複数表示したいと思います。

前回のように一つ一つに座標を指定していたのでは非常に大変ですよね。

なのでここは2次元配列を使って一気にブロックを初期化、表示したいと思います。

ブロックの位置を決める

最初にも少し説明しましたがまずはブロックを表示できる位置というのを事前に決めてしまいます。

画像(cdxb_6_1)

少しわかりずらいかもしれませんが、こんな感じで先にブロックを表示する為のマス目を設定してそこにブロックを当てはめていくような感じにします。

2次元配列

ではさきほどのマス目に対応する2次元配列を用意します。

マス目は6×6になるので2次元配列も同じように用意します。

int block_map[6][6] = {
	{0,0,0,0,0,0},
	{0,0,0,0,0,0},
	{0,0,0,0,0,0},
	{0,0,0,0,0,0},
	{0,0,0,0,0,0},
	{0,0,0,0,0,0}
};

そしてこの2次元配列のそれぞれの数字によってブロックを表していきます。

「0」・・・ブロックなし

「1」・・・赤ブロック

「2」・・・緑ブロック

「3」・・・青ブロック

などのようにします。

たとえば

int block_map[6][6] = {
	{1,0,0,0,0,0},
	{0,2,0,0,0,0},
	{0,0,3,0,0,0},
	{0,0,0,1,0,0},
	{0,0,0,0,2,0},
	{0,0,0,0,0,3}
};

こんな感じで配置すると

画像(cdxb_6_2)

このようになります。

広告

ブロックの初期化

では次にこの2次元配列をもとにブロックそれぞれの座標、色、フラグなどを初期化していきましょう。

今回ブロック最大で6×6=36個になるので36個分ブロックを用意しておきます。

#define MAX_BLOCK 36

struct BLOCKS{
	int x;
	int y;
	int flag;
	int color;
};

struct BLOCKS blocks[MAX_BLOCK];

ではブロック初期化の「my_init_blocks()」になります。

#define BLOCK_WIDTH 50
#define BLOCK_HEIGHT 10
#define BLOCK_MAP_INDEX_X 6
#define BLOCK_MAP_INDEX_Y 6

void my_init_blocks(){
	int i, j;
	int count = 0;
	for (i = 0; i < BLOCK_MAP_INDEX_Y; i++){
		for (j = 0; j < BLOCK_MAP_INDEX_X; j++){
			if (block_map[i][j] != 0){
				blocks[count].x = (BLOCK_WIDTH * j);
				blocks[count].y = (BLOCK_HEIGHT * i);
				blocks[count].flag = 1;
				switch (block_map[i][j]){
				case 1:
					blocks[count].color = Color_Red;
					break;
				case 2:
					blocks[count].color = Color_Green;
					break;
				case 3:
					blocks[count].color = Color_Blue;
					break;
				default:
					break;
				}
			}
			count++;
		}
	}
}

「for」ループが2重になっていて慣れないと少しややこしいと思いますので一つ一つ分解して見ていきたいと思います。

for (i = 0; i < 6; i++){
	for (j = 0; j < 6; j++){
	}
}

まずは2重の「for」ループでさきほどの2次元配列を調べます。

この時のループが進む時のイメージですが

先に内側のループを進めてから外側のループを一つずつ進めていくようなイメージになります。

int block_map[6][6] = {
	{1,0,0,0,0,0},
	{0,2,0,0,0,0},
	{0,0,3,0,0,0},
	{0,0,0,1,0,0},
	{0,0,0,0,2,0},
	{0,0,0,0,0,3}
};

たとえばこの2次元配列だったら最初に一番上の横一列

{1,0,0,0,0,0}

ここまで進めます。

ここで内側のループが終わるので、外側のループを一つ進めて

{1,0,0,0,0,0}
{0

2列目に入っていく、そんなイメージになります。

ではそれを踏まえた上で、わかりやすいように座標を割り振るトコロだけを抜き出してあらためて見てみます。

for (i = 0; i < 6; i++){
	for (j = 0; j < 6; j++){
		if (block_map[i][j] != 0){
			blocks[count].x = (50 * j);
			blocks[count].y = (10 * i);
		}
	}
	count++;
}

なんとなくわかりますでしょうか?

さきほどの動きに従って一つ一つ座標を割り振っていくと・・・、

「blocks[0].x = 0,blocks[0].y = 0」

「blocks[1].x = 50,blocks[1].y = 0」

「blocks[2].x = 100,blocks[2].y = 0」

「blocks[3].x = 150,blocks[3].y = 0」

「blocks[4].x = 200,blocks[4].y = 0」

「blocks[5].x = 250,blocks[5].y = 0」

ここで最初の内側の1ループが終わって外側のループを一つ進めて次のループへと移ります。

「blocks[6].x = 0,blocks[6].y = 10」

「blocks[7].x = 50,blocks[7].y = 10」

こんな感じになるというワケです。

あとはついでにフラグ、色なども割り振っていけば初期化は完了です。

ブロックの複数表示

それでは36個全てのブロックを表示していきましょう!

void my_draw_block(){
	int count = 0;

	for (count = 0;count < MAX_BLOCK;count++){
		if (blocks[count].flag == 1){
			DrawBox(X_POSI + blocks[count].x,blocks[count].y,X_POSI + blocks[count].x + BLOCK_WIDTH,
				blocks[count].y + BLOCK_HEIGHT,blocks[count].color,true);
			DrawBox(X_POSI + blocks[count].x,blocks[count].y,X_POSI + blocks[count].x + BLOCK_WIDTH,
				blocks[count].y + BLOCK_HEIGHT,Color_Black, false);
		}
	}
}

表示する時はすでに全ての座標、フラグ、色などの初期化は終わっているので先ほどの2次元配列の事などは特に考えず36個分「for」ループで回すだけです。

ブロック同士の隙間がほしかったので同じように「外枠」の部分も描いております。

画像(cdxb_6_3)

ブロック複数表示!

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

中間ソース5

中間ソースでは前回のブロックひとつだけの当たり判定部分をエラーにならないようにコメントアウトしております。

では次回はブロック全てに当たり判定をつけたいと思います。

次回

最終日 全ブロックの当たり判定

□ページの先頭へ□

□目次へ戻る□

□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時点)