zoukankan      html  css  js  c++  java
  • 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. }  
  • 相关阅读:
    面试题汇总
    Chromium中多线程及并发技术要点(C/C++)
    关于《Swift开发指南》背后的那些事
    HDU 3080 The plan of city rebuild(除点最小生成树)
    2.1.3策略模式(5.9)
    Shell脚本之监视指定进程的执行状态
    敏捷开发中的10大错误认识
    mysql插入中文数据报错:incorrect string value
    JapserReport导出PDF Could not load the following font错误
    冒泡排序
  • 原文地址:https://www.cnblogs.com/xiaoran1129/p/2678284.html
Copyright © 2011-2022 走看看