飛行機が着陸するゲームみたいなのを描いてみる

飛行機が着陸するゲームみたいなのを描いてみる その7

 前回で●でクリックしたら虹色の飛行機が飛び出すところまで作りました。
でも虹色の飛行機は、白い飛行機と重なっても、そのまま滑走路まで普通に動いて行きます。何か変?
ということで、爆発させます。最初からその予定で虹色飛行機を作ったのです。
 最初は爆発判定です。
白い飛行機同士は決して重ならないように設定しています。そこに適当にクリックした虹色飛行機が飛んで来るので、滑走路延長の直線部分で白い飛行機と重なる事があります。 そこで重なったら爆発とします。
changeThread.javaの、run()メソッドのmove処理の後に、


			move();		//移動処理

			if(b99Ap.getIsdraw()){
				colliB99(); 	//衝突判定
			}
			GCan.repaint();

という衝突判定処理を追加しました。
この"colliB99()"の中身がどうなっているかというと、


	private void colliB99() {
		// b99 と各a/pとの衝突を判定する
		boolean stat=false;
		Point pos_B99=b99Ap.getPos();
		int xb=pos_B99.x;
		int yb=pos_B99.y;
		if(yb!=500){return;}
		if(xb<300||xb>750){return;}

		Rectangle rectB99=new Rectangle((int)(xb-imgWH/4),(int)(yb-imgWH/4),(int)imgWH/2,(int)imgWH/2);
		//B99は小さめで判定

		for(int j=0;j<Num_airp1;j++){		// app1
			if(airp1[j].collB99(rectB99,imgWH)){
				// B99 app1 の衝突
				airp1[j].setDrawFalse();		//	強制的に消す
				stat=true;
				b99Ap.setDrawFalse();
				System.out.println("app1衝突=");
				break;
			}
		}
		for(int j=0;j<Num_airp2;j++){		// app2
			if(airp2[j].collB99(rectB99,imgWH)){
				// B99 app2 の衝突
				airp2[j].setDrawFalse();
				stat=true;
				b99Ap.setDrawFalse();
				System.out.println("app2衝突=");
				break;
			}
		}
		for(int j=0;j<Num_airp3;j++){		// app4
			if(airp3[j].collB99(rectB99,imgWH)){
				// B99 app2 の衝突
				airp3[j].setDrawFalse();
				stat=true;
				b99Ap.setDrawFalse();
				System.out.println("app3衝突=");
				break;
			}
		}
		for(int j=0;j<Num_airp4;j++){		// app4
			if(airp4[j].collB99(rectB99,imgWH)){
				// B99 app2 の衝突
				airp4[j].setDrawFalse();
				stat=true;
				b99Ap.setDrawFalse();
				System.out.println("app4衝突=");
				break;
			}
		}
		if(stat){			//衝突
			// B99 衝突  粉々をセットする
//			bomb.setIsdraw(true);
//			bomb.crushon(xb,yb);
			System.out.println("app衝突 bx="+xb+" y="+yb);
		}
	}

 といった感じで、最初に虹色飛行機B99の位置が、衝突判定区域かどうかを判断し、その後各白い飛行機それぞれとB99が重なっているかを判定しています。
重なっていれば、衝突です。
コンソールにも出力してます。

 次に、ぶつかったのが分かったのなら、何か爆発みたいな特別な表示をしてみたいものです。
上の衝突判定の最後のところに


			bomb.setIsdraw(true);
			bomb.crushon(xb,yb);

という処理を追加して、爆発処理をするようにしています。
どんな処理をしたかというと、jpg画像をピクセルに分解して、ピクセルをばらばらにするという処理をどこかでみたような気がしましたので、それを参考にピクセルを大げさに飛ばして、爆発みたいにしてみます。

changeThread.javaで、爆発判定までできていますので、Bomb.javaというクラスを作って処理しています。
Bomb.javaに爆発のフラグと、爆発の位置を知らせ、さらに別のタイマー処理を起動しています。このタイマーは、ピクセル粒子の位置を変化させています。
その後リペイント処理で、changeThread.javaのdrawAp()でbomb.drawPixels(g);を起動して爆発の絵を描いています。
 bombでピクセルに分解する絵は、ド派手な色が色々混じっている方が飛び散った時に見栄えがよさそうなので、gimpで虹色の絵を作りました。



plane

実行すると、右図のようになります。
ピクセルが飛び散っています。