矩形同士の交差判定で前回とちょっと違った方法で判定する。
JavaのRectangleを使用して、contains()と言うメソッドを呼び出して判定する。
このcontains()メソッドは、『指定された位置 (x,y) にある点を含むかどうかを判定する』
と、Javaの説明に有る。
どういうことかと言うと、矩形の中に指定した矩形の点が入っていたらtrueを返す仕組み。
今回はキー操作で動かす矩形を矩形1、動かさない矩形を矩形2として、
矩形2の中に矩形1が入ったら、trueを返す仕組みを作ってみる。
【trueを返す時にどの位置が入った時に返すか】
矩形2の左上、左下、右上、右下の4角に矩形1の4角が入ったらtrueを返すように設定する。
そして、左上、左下、右上、右下の4角を定数で設定しておく。
また、入っていない時の状況も考慮して、入っていない時の定数も合わせて作る。
設定する定数
入っていない時:NO_COLLISION=0
左上:UP_LEFT=1
左下:DOWN_LEFT=2
右上:UP_RIGHT=3
右下:DOWN_RIGHT=4
矩形の4角、それぞれの座標位置
4角の座標位置は以下の通り
左上:X,Y
左下:X,Y+HEIGHT
右上:X+WIDTH,Y
右下:X+WIDTH,Y+HEIGHT
最初に設定するものは、動かない矩形1の矩形の設定を行い、contains()メソッドを
使ってどの位置に入ったか、返す条件式を作成する
また、X,Y,WIDTH,HEIGHTをそれぞれしゅとくして変数に代入する
こんな感じ
Public int collision(Rect1 rect1) {
//動かない矩形2の設定
Rectangle rect=new Rectangle(X,Y,WIDTH,HEIGHT);
//X,Y,WIDTH,HEIGHTをそれぞれしゅとくして変数に代入
//型がint型だが、座標値を他の型で設定していてもキャストすれば問題ない
int rect1_X=rect1.getX();
int rect1_Y=rect1.getY();
int rect1_W=rect1.getWIDTH();
int rect1_HEIGHT=rect1.getHEIGHT();
//矩形2の左上から矩形1の右下が入ってきた場合
if(rect1.contains(rect1_X+rect1_W,rect1_Y+rect1_H)) {
return UP_LEFT;
}
//矩形2の左下から矩形1の右上が入ってきた場合
if(rect1.contains(rect1_X+rect1_W,rect1_Y)) {
return DOWN_LEFT;
}
//矩形2の右上から矩形1の左下が入ってきた場合
if(rect1.contains(rect1_X,rect1_Y+rect1_H)) {
return UP_RIGHT;
}
//矩形2の右下から矩形1の左上が入ってきた場合
if(rect1.contains(rect1_x,rect1_Y)) {
return DOWN_RIGHT;
}
//何にも無かった場合
return NO_COLLISION;
}
次に、位置を求めるメソッドを作成する。
switch文を使ってそれぞれの4角に対しての位置を求める。
こんな感じ
public void collisionDetection() {
//上記で作ったメソッドの返りを取得して
//変数に代入し、switch文で使用する
int collidePos=collision(rect1);
//NO_COLLISION以外の場合
if(collidePos!=NO_COLLISION) {
swicth(collidePos) {
case UP_LEFT:
//この中に入っていた時にどうするかの
//動作を記述する
break;
case UP_RIGHT:
break;
case DOWN_LEFT:
break;
case DOWN_RIGHT:
break;
default:
break;
}
}
}
これで、一通り完成。
今回は、一致した場所に交差したら、文字列を出力するようにした。
この作り方はAndroidでも利用できる。
Java Rectangleクラス
android reference rectクラス:containsメソッド
その他の交差判定
交差判定 その1:線と線
交差判定 その2:点と円の交差判定と円同士の交差判定
交差判定 その3-1:矩形同士の交差判定
その他の交差判定関連
Androidでゲーム ブロック崩し編 5回目:ボールと板の交差判定
Androidでゲーム ブロック崩し編 6回目:ボールとブロックの交差判定
0 件のコメント:
コメントを投稿