画像(logo)

HOME/[JAVA言語]ブロックパズルの作り方 目次/三日目 落下

[JAVA言語 ブロックパズルの作り方]
三日目 落下

広告

↓2017年04月19日発売↓

カラー図解 Javaで始めるプログラミング 知識ゼロからの定番言語「超」入門 (ブルーバックス)

新品価格
¥1,080から
(2017/5/1 13:45時点)

目次へ戻る

落下

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

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

ブロック落下用関数

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

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

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

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

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

あとはこのメソッドを「ゲームループ」に加えるだけですね。

広告

ゲームループ

あらためてゲームループになります。

@Override
public void handle(long time){
	gc.clearRect(0,0,640,480);

	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;
	}
}		

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

画像(jb_3_1)

ブロック落下!

「stage」の内側だけ表示

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

void my_draw_stage(){
	for(int y=0;y<STAGE_HEIGHT - 2;y++){
		for(int x=2;x<STAGE_WIDTH - 2;x++){
			if(stage[y][x] == 1){gc.setFill(Color.RED);
				gc.fillText("■",x * DRAW_BLOCK_WIDTH,DRAW_POSITION_Y + y * DRAW_BLOCK_WIDTH);}
			else if(stage[y][x] == 9){gc.setFill(Color.WHITE);
				gc.fillText("■",x * DRAW_BLOCK_WIDTH,DRAW_POSITION_Y + y * DRAW_BLOCK_WIDTH);}
		}
	}
}

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

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

中間ソース2

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

次回

四日目 当たり判定「壁」

□ページの先頭へ□

□目次へ戻る□

□HOME□

広告

↓2016年06月25日発売↓

新・明解Java入門 (明解シリーズ)

新品価格
¥2,916から
(2017/5/1 13:47時点)

↓2017年04月18日発売↓

Java本格入門 ~モダンスタイルによる基礎からオブジェクト指向・実用ライブラリまで

新品価格
¥3,218から
(2017/5/1 13:50時点)

↓2017年05月17日発売↓

新・明解 Javaで学ぶアルゴリズムとデータ構造 (明解シリーズ)

新品価格
¥2,592から
(2017/5/1 13:54時点)

↓2017年04月04日発売↓

Java 第2版 入門編 ゼロからはじめるプログラミング (プログラミング学習シリーズ)

新品価格
¥2,030から
(2017/5/1 13:55時点)