画像(logo)

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

広告

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

広告

↓2016年02月29日発売↓

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

目次へ戻る

落下

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

と言ってもただブロックの縦位置「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□

広告

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