2011年5月9日月曜日

Androidでゲーム シューティングゲームっぽい物。      その3:弾と敵の衝突判定

発射された弾が敵にぶつかった時の処理について
前回、前々回とタッチしたときにdrawCircle()メソッドを使って描画した円を
使っていたが、今回から弾画像を用意して、その画像を使って
処理することにした。

弾の画像はこれ


弾画像と敵画像がぶつかった時の処理は
①画面の端に来た場合、弾画像を消す処理
②敵とぶつかった時、弾画像を消す処理
③弾画像とぶつかった時、敵画像を消す処理
④弾画像とぶつかった時、敵画像をもう一度画面右端に戻す処理
の4つを行った。

①について
弾画像を消すにはフラグを使って消すと考えることになるが、それだと、
目に見える部分が消えているが実際は、弾画像と敵画像がぶつかった
ポイントに弾画像の座標値が残ってしまい、次に出てくる敵画像がその座標値に
来た時、弾画像が無いのに敵画像が消えるという不思議なことが起きてしまうので、
これも考慮した考えで行う。
タッチしたときに弾画像を、弾が発射されるスタート位置にセットする。
弾画像を設定しているクラスファイルのコンストラクタにて、設定しておく。
こんな感じ
属性を決める
private static final PointF point=new PointF(-100,-100);
コンストラクタでは
public Ball(MainPanel panel) {
//弾画像の読み込み
Resources r=panel.getResources();
img=BitmapFactory.decodeResource(r,R.drawble.弾画像の名前);
//タッチしたときに弾画像をセットする
x=point.x;
y=point.y;
//弾が発射されるスタート位置
x=-10;
y=-10;
//画面に弾画像があるかどうかのフラグ
//初期状態は無いのでfalse
used=false;
}
次に作るのが、弾画像が敵画像とぶつかった時と弾画像が画面の端に行ってしまった時の処理を施す
public void Store() {
x=point.x;
y=point.y;
}
もう1つが、弾画像がpoint=new PointF(-100,100);の中にあるかどうか
見るための物を作る
public boolean isInStorage() {
//あるかどうかチェックする
if(x==point.x&&y==point.y) {
//ある場合はtrueを返す
return true;
}
//無い場合はfalseを返す
return false;
}
設定したものを今度は、移動を設定しているメソッドで使用する
public void move() {
if(isInStorage())
return;
//画面の端に来た場合
if(x<0||x>panel.getWidth()||y<0||y>panel.getHeight()) {
//画面からなくなるのでfalse
used=false;
//Storeに移動させる
Store();
}
これで、画面の端に来た時の処理は終わり。
②と③について
②と③は、衝突判定処理を設定をして、それぞれの画像についての処理を行う。
弾画像と敵画像の衝突判定処理を設定する。
衝突判定処理はRectクラスを使い、intersectメソッドで設定を行う。
ブロック崩しや矩形同士の交差判定にもintersectメソッドを使用した交差判定処理を記述している。
ブロック崩しの交差判定処理
矩形同士の交差判定処理
敵画像を設定しているクラスファイルにて、衝突を検出したらtrueを返すメソッドを作成する。
こんな感じ
/**
* 自機弾との衝突検出
*/
public boolean collideWith(Ball ball) {
//敵1の矩形
Rect rect_enemy1=new Rect((int)x-size/25,
(int)y-size/25,
(int)x+size,
(int)y+size);
//自機弾の位置の取得
PointF ball_Pos=ball.getPoint();
//自機弾の矩形
Rect rect_ball=new Rect((int)ball_Pos.x-ball.getHeight()/25,
(int)ball_Pos.y-ball.getWidth()/25,
(int)ball_Pos.x+ball.getHeight(),
(int)ball_Pos.y+ball.getWidth());
//交差したらtrueを返す
return rect_enemy1.intersect(rect_ball);
}
衝突を検出する設定を作ったので、今度はSurfaceViewを設定しているクラスファイルで使用する
SurfaceViewを設定しているクラスファイルで設定する事は、弾画像と敵画像が交差したのを検出した時に
どうするか?と言う設定を行う。
設定する事は、弾画像の設定と敵画像が弾画像とぶつかった時に敵画像を画面右端に戻す設定を行う。
こんな感じ
/**
* 弾と敵の交差を検出した時の設定
*/
public void enemy_CollisionDetection() {
/*弾と敵1*/
for(int i=0;i
if(enemy1.collideWith(ball[i])) {
/*弾のフラグをfalse*/
ball[i].used=false;
/*弾画像を移動させる*/
ball[i].Store();
//④の部分
//弾に当たったら初期位置に戻すために
//敵画像のフラグをfalseにする。
enemy1.flg1=false;
//弾が1つぶつかったら抜けるようにする
break;
}
}
}
④について
④は、敵画像のフラグがfalseの時(初期状態)に画面右端に戻された、敵のクラスファイルを設定している
移動メソッドが呼ばれ、その中で、以下のような設定をしている。
if(flg1==false) {
x=533//画面の右端
y=rand.nextInt(250)
}
と、設定している。
enemy_CollisionDetection() メソッドをrun()メソッド内で呼び出したら
使用できるようになる。
その他、シューティングゲーム関連

0 件のコメント:

コメントを投稿