一、矩形與矩形的碰撞
用反向思維,除了不碰撞的都是碰撞的。
既
四種情況
如圖:
口1 口2 口 口3 口4 紅色表示相對應的矩形 則 有x1 y1 w1 h1 X2 y2 w2 h2
|
1的情況 y2 < y1 && y2 < y1 - h2 2的情況 x2 < x1 && x2 < x1 - w2 3的情況 x2 > x1 && x2 > x1 + w1 4的情況 y2 > y1 && y2 > y1 + h1 |
二、圓形與圓形的碰撞
主要就是判斷圓心距離
(Math.sqrt(Math.pow(x1 - x2, 2) + Math.pow(y1 - y2, 2)) > r1 + r2) |
Math.pow(double a,double b)a的b次方
三、圓形與矩形的碰撞
第一種:就是圓形與矩形邊框的碰撞檢測
檢測Y軸圓心到矩中心的距離是否小於半徑+矩形X軸1/2寬
檢測X軸圓心到矩中心的距離是否小於半徑+矩形Y軸1/2高
第二種:就是特殊的矩形四個角檢測
四個矩形頂角到圓心的距離是否小於半徑
四、多矩形的碰撞
把不規則圖片看成多矩形然后檢驗碰撞。
下面是我自己封裝的一個碰撞類
封裝了上面幾個加上
2組矩形數組內容之間檢驗是否碰撞的類
- package com.lurencun.SurfaceUtil;
- import android.graphics.Rect;
- /**
- * 游戲碰撞檢測類
- *
- * @author poolo
- * @version 1.00
- */
- public class CollisionUtil {
- /**
- * 矩形碰撞檢測 參數為x,y,width,height
- *
- * @param x1
- * 第一個矩形的x
- * @param y1
- * 第一個矩形的y
- * @param w1
- * 第一個矩形的w
- * @param h1
- * 第一個矩形的h
- * @param x2
- * 第二個矩形的x
- * @param y2
- * 第二個矩形的y
- * @param w2
- * 第二個矩形的w
- * @param h2
- * 第二個矩形的h
- * @return 是否碰撞
- */
- public boolean IsRectCollision(int x1, int y1, int w1, int h1, int x2,
- int y2, int w2, int h2) {
- if (x2 > x1 && x2 > x1 + w1) {
- return false;
- } else if (x2 < x1 && x2 < x1 - w2) {
- return false;
- } else if (y2 > y1 && y2 > y1 + h1) {
- return false;
- } else if (y2 < y1 && y2 < y1 - h2) {
- return false;
- } else {
- return true;
- }
- }
- /**
- * 矩形碰撞檢測 參數為Rect對象
- *
- * @param r1
- * 第一個Rect對象
- * @param r2
- * 第二個Rect對象
- * @return 是否碰撞
- */
- public boolean IsRectCollision(Rect r1, Rect r2) {
- return IsRectCollision(r1.left, r1.top, r1.right - r1.left, r1.bottom
- - r1.top, r2.left, r2.top, r2.right - r2.left, r2.bottom
- - r2.top);
- }
- /**
- * 圓形碰撞檢測
- *
- * @param x1
- * 第一個圓的圓心x
- * @param y1
- * 第一個圓的圓心y
- * @param r1
- * 第一個圓的半徑
- * @param x2
- * 第二個圓的圓心x
- * @param y2
- * 第二個圓的圓心y
- * @param r2
- * 第二個圓的半徑
- * @return 是否碰撞
- */
- public boolean IsCircleCollision(int x1, int y1, int r1, int x2, int y2,
- int r2) {
- // 兩點距大於 2圓形半徑距離
- if (Math.sqrt(Math.pow(x1 - x2, 2) + Math.pow(y1 - y2, 2)) > r1 + r2) {
- return false;
- }
- return true;
- }
- /**
- * 圓形與矩形碰撞檢測
- *
- * @param x1
- * 第一個矩形的x
- * @param y1
- * 第一個矩形的y
- * @param w1
- * 第一個矩形的寬
- * @param h1
- * 第一個矩形的高
- * @param x2
- * 圓的圓心x
- * @param y2
- * 圓的圓心y
- * @param r2
- * 圓的半徑r
- * @return 是否碰撞
- */
- public boolean IsC2RCollision(int x1, int y1, int w1, int h1, int x2,
- int y2, int r2) {
- if ((Math.abs(x2 - (x1 + w1 / 2)) > w1 / 2 + r2)
- || Math.abs(y2 - (y1 + h1 / 2)) > h1 / 2 + r2) {
- return false;
- }
- return true;
- }
- /**
- * 多矩形碰撞
- *
- * @param rArray1
- * @param rArray2
- * @return 是否碰撞
- */
- public boolean IsRectsCollision(Rect[] rArray1, Rect[] rArray2) {
- for (Rect rt1 : rArray1) {
- for (Rect rt2 : rArray2) {
- if (IsRectCollision(rt1, rt2)) {
- return true;
- }
- }
- }
- return false;
- }
- }