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

六日目 ブロックを表示2

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

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

広告

↓2016年02月29日発売↓

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

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

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

目次へ戻る

ブロックを複数表示する

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

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

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

ブロックの位置を決める

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

画像(b-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}
};

こんな感じで配置すると

画像(b-6-2)

このようになりますね。

ブロックの初期化

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

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

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

struct BLOCKS blocks[36];

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

void my_init_blocks(){
 int i, j;
 int count = 0;
 for (i = 0; i < 6; i++){
  for (j = 0; j < 6; 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++){
		if (block_map[i][j] != 0){
		}
	}
}

まずは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列目に入っていく、そんなイメージです。

では座標を割り振っていきます。

ブロックを配置するx座標の位置は「BLOCK_WIDTH=50」なので先ほどのマス目に当てはめると

画像(b-6-3)

こんな感じになりますよね。

さきほどの「my_init_blocks()」のx座標の指定の部分はと言いますと、

blocks[count].x = (BLOCK_WIDTH * j);

こちらですね。

実際に「j」の値を入れてみましょう。

BLOCK_WIDTH * 0 = 0

BLOCK_WIDTH * 1 = 50

BLOCK_WIDTH * 2 = 100

BLOCK_WIDTH * 3 = 150

BLOCK_WIDTH * 4 = 200

BLOCK_WIDTH * 5 = 250

きちんと指定のx座標通りになっているのが確認できると思います。

同じようにy座標もループに合わせて

blocks[count].x = (BLOCK_WIDTH * j);

としてあげればブロックの座標を割り振る事ができるというワケです。

あとは色、フラグなどを割り振ればブロックの初期化は完了です。

ブロックの複数表示

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

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

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

次回

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

□ページの先頭へ□

□目次へ戻る□

広告

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