画像(logo)

HOME/[C言語DXライブラリ]ブロックパズルの作り方 目次/三日目 落下

広告

[C言語 DXライブラリ ブロックパズルの作り方]
三日目 落下

広告

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

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

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

目次へ戻る

落下

今回はまっすぐ下にブロックを落下させたいと思います。

と言ってもただブロックの縦位置「block_y_count」の値を増やすだけなのでとても簡単です。

ゲームループ

それでは落下処理に入る前にそのままでは再描画の際に前のデータが残ったままになってしまうので、前のデータを消去→再描画を繰り返すいわゆるゲームループを作ります。

int WINAPI WinMain(HINSTANCE,HINSTANCE,LPSTR,int){
	ChangeWindowMode(TRUE);
	DxLib_Init();
	SetDrawScreen(DX_SCREEN_BACK);

	my_init_var();

	while(ProcessMessage() == 0){
		ClearDrawScreen();

		my_make_block();
		my_draw_back();
		my_draw_variable();
		my_draw_block();
		my_draw_stage();

		ScreenFlip();
	}

	DxLib_End();
	return 0;
}

前回のメインにゲームループを加えたものになります。

「my_init_var()」で初期化した後「while()」文によって繰り返しになっているのが確認できるかと思います。

ここで前のデータを消去する関数にあたるのが「ClearDrawScreen()」になります。

あと「while()」文の条件にある「ProcessMessage()」というのはマルチタスク環境下において別のプログラムと適切に連携をとる為の関数になります。

「0」以外が返ってきた場合はエラーになるので即ループを抜けてプログラムを終了します。

このあたりは前回同様DXライブラリでプログラムを組む時のおきまりの手順のようなものなのでセットで覚えてしまいましょう。

それではここに落下処理を加えていきます。

広告

ブロック落下用関数

こちらがブロック落下用の関数になります。

void my_fall_block(){
	block_y_count += block_speed;
	block_y = block_y_count / DRAW_BLOCK_WIDTH;
}

落下のスピードを表す変数「float block_speed」を別に用意してそれを毎回足し合わせるカタチで落下させております。

そして気になるのは前回当たり判定用の縦位置と説明しました「block_y」の部分ですね。

これはSTGなど細かくピクセル単位で当たり判定をつける場合と違ってブロックパズルは基本的にはマス目単位での当たり判定で済ませる事ができるので、その現在のマス目にあたる値をブロックの幅で割る事によって算出して「block_y」に入れているというワケです。

あとはこの関数を「メイン」に加えるだけですね。

メイン

あらためてメインになります。

int WINAPI WinMain(HINSTANCE,HINSTANCE,LPSTR,int){
	ChangeWindowMode(TRUE);
	DxLib_Init();
	SetDrawScreen(DX_SCREEN_BACK);

	my_init_var();

	while(ProcessMessage() == 0){
		ClearDrawScreen();

		my_make_block();
		my_draw_back();
		my_draw_variable();
		my_draw_block();
		my_draw_stage();
		my_fall_block();
		
		if(block_y_count > DRAW_BLOCK_WIDTH * 17){
			block_y_count = 0;
			block_y = 0;
		}

		ScreenFlip();
	}

	DxLib_End();
	return 0;
}

当たり判定がないのでどこまでもいってしまわないように下の壁についた時点で元に戻るよう制限をつけております。

画像(cdxb_3_1)

ブロック落下!

「stage」の内側だけ表示

前回はわかりやすいように「stage[23][18]」の全体を表示しましたが今回から内側だけを描くようにします。

void my_draw_stage(){
	int x,y;

	for(y=0;y<STAGE_HEIGHT - 2;y++){
		for(x=2;x<STAGE_WIDTH - 2;x++){
			if(stage[y][x] == 1)DrawFormatString(x * DRAW_BLOCK_WIDTH,
				y * DRAW_BLOCK_WIDTH,Color_Red,"■");
			else if(stage[y][x] == 9)DrawFormatString(x * DRAW_BLOCK_WIDTH,
				y * DRAW_BLOCK_WIDTH,Color_Black,"■");
		}
	}
}

配列を「for」文などで処理する時は配列の要素数を読み違えて配列の要素からはみ出る「バッファオーバーフロー」しないように注意が必要です。

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

中間ソース2

それでは次回は左右の壁の当たり判定をつけたいと思います。

次回

四日目 当たり判定「壁」

□ページの先頭へ□

□目次へ戻る□

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