広告
↓発売日:2018年09月22日↓
新品価格 |
今回はブロックを複数表示したいと思います。
前回のように一つ一つに座標を指定していたのでは非常に大変ですよね。
なのでここは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} };
こんな感じで配置すると
このようになります。
広告
では次にこの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」ループで回すだけです。
ブロック同士の隙間がほしかったので同じように「外枠」の部分も描いております。
ブロック複数表示!
ここまでの中間ソースになります。
中間ソースでは前回のブロックひとつだけの当たり判定部分をエラーにならないようにコメントアウトしております。
では次回はブロック全てに当たり判定をつけたいと思います。
広告
↓発売日:2016年02月29日↓
12歳からはじめる ゼロからのC言語 ゲームプログラミング教室 新品価格 |
↓発売日:2018年06月22日↓
新品価格 |
↓発売日:2018年03月09日↓
新品価格 |
↓発売日:2017年06月14日↓
新品価格 |
↓発売日:2018年05月21日↓
新品価格 |
↓発売日:2017年12月07日↓
新品価格 |
↓発売日:2017年02月08日↓
新・明解C言語で学ぶアルゴリズムとデータ構造 (明解シリーズ) 新品価格 |
↓発売日:2017年09月26日↓
新品価格 |