Android游戲中的碰撞檢測


一、矩形與矩形的碰撞

 

用反向思維,除了不碰撞的都是碰撞的。

四種情況

如圖:

         口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組矩形數組內容之間檢驗是否碰撞的類

 
Java代碼  
  1. package com.lurencun.SurfaceUtil;   
  2.   
  3. import android.graphics.Rect;   
  4.   
  5. /**  
  6.  * 游戲碰撞檢測類  
  7.  *   
  8.  * @author poolo  
  9.  * @version 1.00  
  10.  */  
  11. public class CollisionUtil {   
  12.   
  13.     /**  
  14.      * 矩形碰撞檢測 參數為x,y,width,height  
  15.      *   
  16.      * @param x1  
  17.      *            第一個矩形的x  
  18.      * @param y1  
  19.      *            第一個矩形的y  
  20.      * @param w1  
  21.      *            第一個矩形的w  
  22.      * @param h1  
  23.      *            第一個矩形的h  
  24.      * @param x2  
  25.      *            第二個矩形的x  
  26.      * @param y2  
  27.      *            第二個矩形的y  
  28.      * @param w2  
  29.      *            第二個矩形的w  
  30.      * @param h2  
  31.      *            第二個矩形的h  
  32.      * @return 是否碰撞  
  33.      */  
  34.     public boolean IsRectCollision(int x1, int y1, int w1, int h1, int x2,   
  35.             int y2, int w2, int h2) {   
  36.         if (x2 > x1 && x2 > x1 + w1) {   
  37.             return false;   
  38.         } else if (x2 < x1 && x2 < x1 - w2) {   
  39.             return false;   
  40.         } else if (y2 > y1 && y2 > y1 + h1) {   
  41.             return false;   
  42.         } else if (y2 < y1 && y2 < y1 - h2) {   
  43.             return false;   
  44.         } else {   
  45.             return true;   
  46.         }   
  47.     }   
  48.   
  49.     /**  
  50.      * 矩形碰撞檢測 參數為Rect對象  
  51.      *   
  52.      * @param r1  
  53.      *            第一個Rect對象  
  54.      * @param r2  
  55.      *            第二個Rect對象  
  56.      * @return 是否碰撞  
  57.      */  
  58.     public boolean IsRectCollision(Rect r1, Rect r2) {   
  59.         return IsRectCollision(r1.left, r1.top, r1.right - r1.left, r1.bottom   
  60.                 - r1.top, r2.left, r2.top, r2.right - r2.left, r2.bottom   
  61.                 - r2.top);   
  62.     }   
  63.   
  64.     /**  
  65.      * 圓形碰撞檢測  
  66.      *   
  67.      * @param x1  
  68.      *            第一個圓的圓心x  
  69.      * @param y1  
  70.      *            第一個圓的圓心y  
  71.      * @param r1  
  72.      *            第一個圓的半徑  
  73.      * @param x2  
  74.      *            第二個圓的圓心x  
  75.      * @param y2  
  76.      *            第二個圓的圓心y  
  77.      * @param r2  
  78.      *            第二個圓的半徑  
  79.      * @return 是否碰撞  
  80.      */  
  81.     public boolean IsCircleCollision(int x1, int y1, int r1, int x2, int y2,   
  82.             int r2) {   
  83.         // 兩點距大於 2圓形半徑距離   
  84.         if (Math.sqrt(Math.pow(x1 - x2, 2) + Math.pow(y1 - y2, 2)) > r1 + r2) {   
  85.             return false;   
  86.         }   
  87.         return true;   
  88.     }   
  89.   
  90.     /**  
  91.      * 圓形與矩形碰撞檢測  
  92.      *   
  93.      * @param x1  
  94.      *            第一個矩形的x  
  95.      * @param y1  
  96.      *            第一個矩形的y  
  97.      * @param w1  
  98.      *            第一個矩形的寬  
  99.      * @param h1  
  100.      *            第一個矩形的高  
  101.      * @param x2  
  102.      *            圓的圓心x  
  103.      * @param y2  
  104.      *            圓的圓心y  
  105.      * @param r2  
  106.      *            圓的半徑r  
  107.      * @return 是否碰撞  
  108.      */  
  109.     public boolean IsC2RCollision(int x1, int y1, int w1, int h1, int x2,   
  110.             int y2, int r2) {   
  111.         if ((Math.abs(x2 - (x1 + w1 / 2)) > w1 / 2 + r2)   
  112.                 || Math.abs(y2 - (y1 + h1 / 2)) > h1 / 2 + r2) {   
  113.             return false;   
  114.         }   
  115.         return true;   
  116.     }   
  117.   
  118.     /**  
  119.      * 多矩形碰撞  
  120.      *   
  121.      * @param rArray1  
  122.      * @param rArray2  
  123.      * @return 是否碰撞  
  124.      */  
  125.     public boolean IsRectsCollision(Rect[] rArray1, Rect[] rArray2) {   
  126.         for (Rect rt1 : rArray1) {   
  127.             for (Rect rt2 : rArray2) {   
  128.                 if (IsRectCollision(rt1, rt2)) {   
  129.                     return true;   
  130.                 }   
  131.   
  132.             }   
  133.         }   
  134.         return false;   
  135.     }   
  136.   
  137. }  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM