広告
広告
↓発売日:2017年04月04日↓
|  | 
| Java 第2版 入門編 ゼロからはじめるプログラミング (プログラミング学習シリーズ) 新品価格 | 
 
		
		今回はブロックを一つだけ作って設置、そこに当たり判定をつけるトコロまでをやっていきたいと思います。
先に今回新しく加えた定数になります。
public static final int BLOCK_WIDTH = 50; public static final int BLOCK_HEIGHT = 10;
ブロックの横幅「BLOCK_WIDTH」と縦幅「BLOCK_HEIGHT」になります。
とりあえず自機バーと同じ大きさにしてみました。
ブロックの必要な要素をまとめたクラスになります。
class Blocks extends Base{
	private boolean flag;
	private int color;
	Blocks(){
		width = Define.BLOCK_WIDTH;
		height = Define.BLOCK_HEIGHT;
		x = 100;
		y = 30;
		flag = true;
		color = 2;
	}
	void set_flag(boolean flag){
		this.flag = flag;
	}
	void set_color(int color){
		this.color = color;
	}
	boolean get_flag(){
		return flag;
	}
	void init(){}
	void move(){}
	
	void draw(GraphicsContext gc){
		if(flag){
			gc.setFill(Color.GREEN);
			gc.fillRect(Define.X_POSI + x,y,width,height);
		}
	}
}
前回作った「Base」を継承、あとはブロック有無を表す「private boolean flag」、色を表す「private int color」を用意しました。
ブロックが残っていれば「flag=true」、ボールが当たって残っていない場合は「flag=false」のように使います。
ではブロックを初期化します。
今回はブロック一つだけなので、その一つをコンストラクタで直接初期化します。
Blocks(){
	width = Define.BLOCK_WIDTH;
	height = Define.BLOCK_HEIGHT;
	x = 100;
	y = 30;
	flag = true;
	color = 2;
}
色の指定もしておりますが、今回は色分けは行わずとりあえず緑色のブロックを用意したいと思います。
お好みの場所に配置して大丈夫ですが配置の座標はブロックの大きさの倍数になるようにしましょう。
ブロックを表示する「draw()」です。
void draw(GraphicsContext gc){
	if(flag){
		gc.setFill(Color.GREEN);
		gc.fillRect(Define.X_POSI + x,y,width,height);
	}
}
表示には自機バーの時と同じく「fillRect()」を使いました。
「if(flag)」ブロックフラグが「true」の時はブロックを描きます。
座標の指定も自機バーの時と同じく左上の座標だけ指定して後はそこからブロックの大きさ分を足してあげれば大丈夫ですね!
広告
最後に当たり判定です。
当たり判定用クラス「CollisionDetection」に加えます。
自機バーの当たり判定をもう少しだけ細かくしたような当たり判定になります。
if(ball.get_x() >= block.get_x() && ball.get_x() <= block.get_x() + block.get_width()){
	if(ball.get_y() >= block.get_y() && ball.get_y() <= block.get_y() + 3){
		ball.set_y(block.get_y());
		ball.ch_y_speed();
		block.set_flag(false);
	}
	else if(ball.get_y() <= block.get_y() + block.get_height() && ball.get_y() >= block.get_y() + block.get_height() - 3){
		ball.set_y(block.get_y() + block.get_height());
		ball.ch_y_speed();
		block.set_flag(false);
	}
}
ちょっと長いのでブロックの当たり判定「上面・下面・左面・右面」の4つのウチ上面・下面の判定のみ抜き出してきました。
この上面だけの当たり判定は自機バーでもやりましたね。
途中までは同じようにやっていきます。
if(ball.get_x() >= block.get_x() && ball.get_x() <= block.get_x() + block.get_width())
まずはボールの座標がブロックの左端「block.get_x()」から右端「block.get_x() + block.get_width()」の間に入っているかどうかを確認します。
そしてもし入っている場合に次の処理に移ります。
まずは上面になります。
/*上面*/
if(ball.get_y() >= block.get_y() && ball.get_y() <= block.get_y() + 3){
	ball.set_y(block.get_y());
	ball.ch_y_speed();
	block.set_flag(false);
}
上面はそのまま「block.get_y()」の高さが上面の高さになりますので、「if (ball.get_y() == block.get_y())」ここが同じであればちょうど上面の部分とボールのy座標が接した事になります。
しかしながら、それだけだと少しずれた場合すり抜けしてしまうのでそこから「3」ピクセル分の範囲に入っていればという条件を加えます。(もちろん「3」ピクセル分じゃなきゃと決まっているワケではないのでそのへんはブロックの大きさなど考慮しながらお好みで調整してください!)
あとはボールの位置を少し補正、方向を変えてあげてフラグを落としてブロックを消滅させます。
下面は「block.get_y()」にブロックの高さである「block.get_height()」を足せば下面の高さになりますね!
/*下面*/
else if(ball.get_y() <= block.get_y() + block.get_height() && ball.get_y() >= block.get_y() + block.get_height() - 3){
	ball.set_y(block.get_y() + block.get_height());
	ball.ch_y_speed();
	block.set_flag(false);
}
同じようにそこから「3」ピクセル分の範囲と「ball.get_y()」との高さを比べるだけです。
左面・右面も同じようにすれば当たり判定は完成です!
ブロックの当たり判定が増えるのでブロックのインスタンス化と共にクラス「CollisionDetection」にそのインスタンスを忘れずに渡しましょう!
 
		ブロックに当たって・・・。
 
		反射!!!
すでにお気づきの方もなんとなく感じてらっしゃる方も何度も言いますがこの当たり判定は「けっこう適当な当たり判定」になります。
ある特定の範囲でしか判定しないのでボールの速さをあげていくとすぐすり抜けてしまいます。(1~5ぐらいのスピードなら大丈夫かも・・・。)
そのあたりは超入門用プログラムなのでご了承ください。
ここまでの中間ソースになります。
それでは次回はブロックを複数表示したいと思います。
広告
↓発売日:2017年04月18日↓
|  | 
| Java本格入門 ~モダンスタイルによる基礎からオブジェクト指向・実用ライブラリまで 新品価格 | 
 
↓発売日:2016年06月25日↓
|  | 
| 新品価格 | 
 
↓発売日:2016年08月31日↓
|  | 
| 新品価格 | 
 
↓発売日:2018年11月21日↓
|  | 
| 新品価格 | 
 
↓発売日:2016年12月15日↓
|  | 
| 新品価格 | 
 
↓発売日:2016年09月28日↓
|  | 
| 新品価格 | 
