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

四日目 自機バーを表示

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

HOME/ブロック崩しの作り方 目次/四日目 自機バーを表示/

広告

↓2016年02月29日発売↓

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

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

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

目次へ戻る

定数の設定

先によく使う定数に名前を付けてしまいましょう。

#define BALL_SPEED 5
#define BALL_SIZE 5

ボールのスピードとサイズです。

#define BAR_SPEED 5
#define BAR_WIDTH 50
#define BAR_HEIGHT 10

自機バーのスピードと横幅「BAR_WIDTH」と縦幅「BAR_HEIGHT」です。

#define FIELD_WIDTH 300
#define FIELD_HEIGHT 480
#define X_POSI 170

あとはボールが跳ね返るフィールドの横幅「FIELD_WIDTH」と縦幅「FIELD_HEIGHT」になります。

前回のように画面全体ではさすがに大きいので幅を少し狭めております。

「X_POSI」はフィールドの表示位置を調整する為のものです。

最初は画面の左端にフィールドを作り、表示する時だけこの「X_POSI」でずらして画面の中心などに表示するようにします。

自機バーを表示

ではあらためて自機バーを表示してみたいと思います。

シンプルに四角を表示する「DrawBox()」を使ってみたいと思います。

DrawBox(左上x座標, 左上y座標, 右下x座標, 右下y座標, 色の指定, 塗りつぶしの指定);

こちらになります。

ではx座標とy座標の変数「bar_x」と「bar_y」をそれぞれ用意して自機バーを表示してみます。

int Color_Red = GetColor(255, 0, 0);
int bar_x = 0;
int bar_y = FIELD_HEIGHT - BAR_HEIGHT;
DrawBox(bar_x, bar_y, bar_x + BAR_WIDTH, bar_y + BAR_HEIGHT, Color_Red, true);

色の指定には赤色の「Color_Red」を用意しました。

初期位置は先ほど用意したフィールドの左端にしてみました。

そしてその左上の座標から常に自機バーの大きさ分ずれた座標を右下の座標にすればいいので

bar_x + BAR_WIDTH
bar_y + BAR_HEIGHT

と縦幅と横幅を足した座標を指定してあげれば自機バーの表示は完了です!

自機バーの移動

では続きまして移動です。

こちらはプログラムを見た方が早いと思いますので、

void my_move_bar(){
	if (key[KEY_INPUT_RIGHT] > 0 && (bar_x + BAR_WIDTH) < FIELD_WIDTH){
		bar_x += BAR_SPEED;
	}
	if (key[KEY_INPUT_LEFT] > 0 && bar_x > 0){
		bar_x -= BAR_SPEED;
	}
}

自機バー移動の関数「my_move_bar()」になります。

まずはキー入力から説明します。

最初の「最低限のプログラム」の下の方にある「my_get_key()」を見てみましょう。

前回も少し説明しましたが、まず全てのキーの入力状態を

GetHitKeyStateAll(keys);

こちらの関数によって配列「keys」に保存します。

配列「keys」は

char keys[256];

と宣言されていますね。

つまり256種類のキーの入力状態を保存するワケです。

そしてこの関数はキーの入力があったトコロは0以外の値になるので

for (int i = 0; i < 256; i++){
	if (keys[i] != 0){
		key[i]++;
	}
	else{
		key[i] = 0;
	}
}

入力があったトコロはインクリメントして256種類丸ごとグローバル変数「key」に保存しなおします。

なのでグローバル変数「key」に入力状態が常に取得され続けるので

if(key[キーコード] > 0)

とその場所を調べて「0」以上であればキー入力があった事になるのであとは必要な処理をすれば良いワケです。

そして改めて「my_move_bar()」を見てみると

if (key[KEY_INPUT_RIGHT] > 0)

となってますね。

見ればなんとなくわかると思いますが

「KEY_INPUT_RIGHT」

は矢印キーの「→」です

キーコードはわかりやすいように全て定数になっております。

他には

a〜z

「KEY_INPUT_A 〜 KEY_INPUT_Z」

矢印キー

「KEY_INPUT_RIGHT」

「KEY_INPUT_DOWN」

「KEY_INPUT_LEFT」

「KEY_INPUT_UP」

などがあります。

もちろんエンターキーなどもありますので必要な場合は「gethitkeystateall リファレンス」などで検索してみてください。

では話をもとに戻して入力があった時に

if (key[KEY_INPUT_RIGHT] > 0){
	bar_x += BAR_SPEED;
}

変数「bar_x」に移動分を加えて移動すれば大丈夫ですね!

そしてそのままではどこまでも移動してしまいますので条件を重ねる「&&」を使ってフィールドの端以内という条件を重ねます。

(bar_x + BAR_WIDTH) < FIELD_WIDTH

これでフィールドをはみださずに移動ができました!

自機バーの当たり判定

では最後に自機バーの当たり判定です。

最初に少し説明しましたがブロックの判定含めあくまでも最低限の当たり判定になりますのでご注意ください。

if (ball_x > bar_x && ball_x < (bar_x + BAR_WIDTH) && ball_y >= bar_y){
	y_direction = 1;
}

「ボールのx座標が自機バーx座標の内側にあり、ボールのy座標が自機バーy座標を超えたら」

という感じの簡単な当たり判定になります。

y座標の判定を「bar_y以上全て」と幅広くしてありますので自機バーに関しては細かい事を抜きにすればけっこう反応してくれます。

これで自機バーの表示と移動ができました!

画像(b-4-1)

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

中間ソース3

中間ソースは変数をグローバル変数にしてそれぞれを関数にまとめております。

自機バーを作ったので壁の底辺部分の判定は外しましたがゲームオーバーの処理をしていないのでほっとけばボールは戻ってきます。

そして「my_draw_field()」でボール、壁、自機バーなどを表示する時それぞれのx座標にさきほどの「X_POSI」を加える事によって画面の中心にくるように調整しております。

それでは次回はブロックを表示したいと思います。

次回

五日目 ブロックを表示

□ページの先頭へ□

□目次へ戻る□

広告

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