新人研修の記録1

研修中に学んだ役立つ技術情報を書いていきたいと思います。

ゲームなどでも多用される図形の重なり判定、いわゆる当たり判定ですが、
研修でキャラクターAとキャラクターBの座標が一致したときにフラグを立てるといったようなプログラムを組む場面がありました。

         

方法としてはキャラクターAの座標を調べて、キャラクターBの座標に重なりがあればフラグを立てるといったアルゴリズムで組むことになります。

四角形の重なり判定は以下のようになります。

//図形が重なるとtrueを返す
boolean isOverlap(x1, y1, int x1, int y1, int w1, int h1, int x2, int y2, int w2, int h2) {

  boolean checkX = false;
  boolean checkY = false;
  
  //X軸
  if((x1 >= x2) && ((x2+w2) >= x1)){
    checkX = true;
  }else if((x2 >= x1) && ((x1+w1) >= x2)){
    checkX = true;
  }

  //Y軸
  if((y1 >= y2) && ((y2+h2) >= y1)){
    checkY = true;
  }else if((y2 >= y1) && ((y1+h1) >= y2)){
    checkY = true;
  }

  return (checkX && checkY)
  
}

うーん、見ずらい。可読性が悪い上に保守性も悪そう。。

そこで、intersects()という便利なメソッドがありました!
これを使えば以下のように簡単に書けてしまいます。

//図形が重なるとtrueを返す
boolean isOverlap(x1, y1, int x1, int y1, int w1, int h1, int x2, int y2, int w2, int h2) {
  Rect r1 = new Rect(x1, y1, w1, h1);
  Rect r2 = new Rect(x2, y2, w2, h2);

  return Rect.intersects(r1, r2);
}

intersects(Rect rect1, Rect rect2)はrect1とrect2に重なりがあればtrueを返すという構造なので、
様々な場面に応用できるのではないでしょうか。

ただ、高速にスワイプしたときは例外で、
指の取得座標の値が飛んでしまうことがあり(取得座標に連続性がない)、
重なり検出できない場合があることもわかりました。
今後はこのことも踏まえて上手に使用していきたいと思います。

火曜担当:Tamamo




アプリ関連ニュース

お問い合わせはこちら

お問い合わせ・ご相談はお電話、またはお問い合わせフォームよりお受け付けいたしております。

tel. 06-6454-8833(平日 10:00~17:00)

お問い合わせフォーム