画像(logo)

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

広告

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

広告

↓2016年02月29日発売↓

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

目次へ戻る

ブロックを複数表示

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

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

なのでここは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□

広告

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